《数据库系统》课程之实验七 通过ODBC/JDBC转移异构数据库中数据

2023-11-16

注:查看全文请关注作者,或点击前往:《数据库系统》课程之实验七 通过ODBC/JDBC转移异构数据库中数据

《数据库系统》课程之实验七 通过ODBC/JDBC转移异构数据库中数据

1 实验目的

​ 学会配置ODBC/JDBC数据源,熟悉使用ODBC/JDBC来进行数据库应用程序的设计,熟悉通过ODBC/JDBC接口访问异构数据库并对异构数据库进行操作。

2 实验平台和实验工具

实验平台:2个异构数据库(如MySQL数据库、SQL Sever数据库等ODBC/JDBC常支持的数据库)。

通过JAVA语言等编写访问数据库的应用程序。编程工具自选。

3 实验内容和要求

配置两个不同的数据源,使用ODBC/JDBC编写程序连接两个不同关系数据库管理系统的数据源,对异构数据库中的数据进行互相转移。如,将MySQL数据库的某个表中的数据转移到SQL Server数据库的表,将SQL Server中的数据转移至MySQL数据库。

认真填写实验报告,并且提交源程序,保证可正确编译和运行。

3.1 知识预备

​ 提前自行了解ODBC/JDBC的概念和使用流程。

3.2 实验要求

​ 给出配置两个不同的数据源的过程。提交应用程序源代码,并标识必要的注释,尽可能清楚明白地说明程序的功能,实现的方法,关键数据结构、变量、函数的定义。

4 实验过程

配置数据源

MySQL

​ 在实验一中已经对MySQL进行了配置

SQL Server

  • 下载镜像sql_server_2019_standard_x64_dvd_2bfe815a.iso,并解压打开,直接双击setup运行

    image-20220513104907484

  • 完成左侧的安装步骤

    image-20220513110329985

    image-20220513112757582

  • 安装并打开数据库管理工具,成功连接SQL Server2019服务器

    image-20220513212044408

    image-20220513212029841

image-20220513212128315

  • 后改用SQL Server身份认证,使用登录名和密码连接。

image-20220518095853266

关键代码及注释

展示编写的类

连接MySQL数据库

基于jdbc驱动进行连接

MysqlConnection

  • static初始化时从properties文件中获取属性,包括驱动名URL用户名密码,然后通过Class.forName加载驱动。
  • public void connect()调用DriverManager.getConnection连接数据库。
  • public Connection getConnection()返回当前连接。
  • public void close()关闭数据库连接。
public class MysqlConnection {
    private static String driverName;
    private static String url;
    private static String username;
    private static String password;
    private static Properties p = new Properties();
    public Connection conn;

    static {
        try {
            InputStream inputStream = new FileInputStream("src/main/resources/config.properties");
            p.load(inputStream);
            // 从properties文件中获取属性
            driverName = p.getProperty("Mysql_driverName");
            url = p.getProperty("Mysql_URL");
            username = p.getProperty("Mysql_username");
            password = p.getProperty("Mysql_password");
            // 加载驱动
            Class.forName(driverName);
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 数据库连接
     */
    public void connect() {
        try {
            System.out.println("正在连接MySQL数据库");
            this.conn = DriverManager.getConnection(url, username, password);
            System.out.println("连接MySQL数据库成功");
        } catch (Exception e) {
            System.out.println("连接MySQL数据库失败");
            e.printStackTrace();
        }
    }

    /**
     * 获取当前数据库连接
     */
    public Connection getConnection() {
        return this.conn;
    }

    /**
     * 关闭数据库连接
     */
    public void close() {
        try {
            if (this.conn != null) this.conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

连接SQL Server数据库

SqlServerConnection

与连接MySQL基本一致,基于jdbc驱动使用用户名和密码进行连接。

public class SqlServerConnection {
    private static Properties p = new Properties();
    private Connection conn = null;
    private static String driverName;
    private static String url;
    private static String username;
    private static String password;

    static {
        try {
            InputStream inputStream = new FileInputStream("src/main/resources/config.properties");
            p.load(inputStream);
            // 从properties文件中获取属性
            driverName = p.getProperty("SqlServer_driverName");
            url = p.getProperty("SqlServer_URL");
            username=p.getProperty("SqlServer_username");
            password=p.getProperty(("SqlServer_password"));
            //加载驱动
            Class.forName(driverName);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 数据库连接
     */
    public void connect() {
        System.out.println("正在连接SQLServer数据库");
        try {
            this.conn = DriverManager.getConnection(url,username,password);
            System.out.println("连接SQLServer数据库成功");
        } catch (Exception e) {
            System.out.println("连接SQLServer数据库失败");
            e.printStackTrace();
        }
    }

    /**
     * 获取当前数据库连接
     */
    public Connection getConnection() {
        return this.conn;
    }

    /**
     * 关闭数据库连接
     */
    public void close() {
        try {
            if (this.conn != null) this.conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

由 SQL Server 转移数据至 MySQL

SqlServerToMysql

  • public static void setConnSQLserver(Connection connSQLserver):传参分别设置SQL Server的连接。

  • public static void setConnMysql(Connection connMysql):传参分别设置MySQL的连接。

  • public static List< String > getTable():对连接调用getMetaData()获取数据库的元数据md,对于md调用getTables(null, "dbo", null, null)获得数据库中的表信息,若该表在使用者指定要转移的表中,则将表的信息存入list返回。

  • public static boolean insertTable(String table,int size):使用Preparedstatement定义预处理对象,执行sql语句,完成向Mysql数据库单个表插入元组的操作。

  • public static void convert():调用getTable()和insertTable(String table,int size),也同样执行sql语句,遍历原表中所有字段来加入建表语句,以完成在Mysql数据库中建表并转移数据

public class SqlServerToMysql {
    static Connection connSQLserver = null;
    static Connection connMysql = null;

    public static void setConnSQLserver(Connection connSQLserver) {
        //设置连接
        SqlServerToMysql.connSQLserver = connSQLserver;
    }

    public static void setConnMysql(Connection connMysql) {
        //设置连接
        SqlServerToMysql.connMysql = connMysql;
    }

    static PreparedStatement pstatSqlServer;
    static PreparedStatement pstatMySql;

    /**
     * 获取SqlServer中的表
     */
    public static List<String> getTable(List<String> TableList) {
        System.out.println("开始获取SqlServer数据库的表");
        DatabaseMetaData md = null;
        List<String> list = new ArrayList<>();
        try {
            //获取数据库元数据
            md = connSQLserver.getMetaData();
            //查询获得表
            ResultSet rs = md.getTables(null, "dbo", null, null);
            if (rs != null) {
                list = new ArrayList<String>();
            }
            //往list添加查询到的表
            while (rs.next()) {
                // 存在需要转移的表 / 为空:转移所有表
                if(TableList.contains(rs.getString("TABLE_NAME"))||TableList.isEmpty())
                    list.add(rs.getString("TABLE_NAME"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("成功获取SqlServer数据库的表");
        return list;
    }

    /**
     * 用于向Mysql数据库单个表插入元组
     * table  表名  size 字段个数
     */
    public static boolean insertTable(String table,int size){
        try {
            pstatSqlServer=connSQLserver.prepareStatement("select * from "+table);
            ResultSet rs=pstatSqlServer.executeQuery();
            //分隔符
            String separator="";
            //插入元组的sql语句
            String insertSql="insert into "+table+" values(";
            for (int i = 0; i < size; i++) {
                insertSql+=(separator+"?");
                separator=",";
            }
            insertSql+=")";
            //关闭自动提交,使插入字段的语句为一个事务组
            connMysql.setAutoCommit(false);
            //定义预编译的sql语句对象
            pstatMySql=connMysql.prepareStatement(insertSql);

            while (rs.next()){
                //将字段值填入insertSql语句
                for (int i = 0; i < size; i++) {
                    pstatMySql.setObject(i+1,rs.getObject(i+1));
                }
                //加入批处理队列
                pstatMySql.addBatch();
            }
            //批量更新sql语句
            pstatMySql.executeBatch();
            //提交
            connMysql.commit();
            //恢复自动提交
            connMysql.setAutoCommit(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }
    /**
     * 建表并转移数据
     */
    public static void convert(List<String> TableList){
        //结果集元数据
        ResultSetMetaData rsmd = null;
        //获取SqlServer数据库的所有表
        List<String> list=getTable(TableList);
        System.out.println(list.size());
        for (int i = 0; i < list.size(); i++) {
            System.out.println("开始转移第" + (i + 1 )+ "数据表...");
            //查询表
            String sql = "select * from " + list.get(i);
            int size = 0;
            try {
                pstatSqlServer = connSQLserver.prepareStatement(sql);
                //获取数据表
                rsmd = pstatSqlServer.getMetaData();
                //创建表的语句
                String createSql = "create table " + list.get(i) + "(";
                //sql语句中字段名的分隔符
                String separator = "";
                //遍历表中所有字段
                size = rsmd.getColumnCount();
                for (int j = 0; j < size; j++) {
                    //字段名 类型
                    createSql += separator + rsmd.getColumnName(j + 1) + "  " + rsmd.getColumnTypeName(j + 1);
                    //判断类型是否规定长度
                    if (rsmd.getPrecision(j + 1) != 0) {
                        //不为0则规定长度
                        createSql += "(" + rsmd.getPrecision(j + 1) + ")";
                    }
                    separator = ",";
                }
                createSql += ");";
                //执行建表语句
                pstatMySql=connMysql.prepareStatement(createSql);
                pstatMySql.execute();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            System.out.println("开始向(" + list.get(i) + ")数据表添加数据...");
            // 添加数据到建好的表中
            if (insertTable( list.get(i), size)){
                System.out.println("第" + (i + 1 ) + "个数据表数据转移成功");
            }
            else {
                System.out.println("第" + (i + 1 ) + "个数据表数据转移失败");
            }
        }
    }
}

由 MySQL 转移数据至 SQL Server

**类:**MysqlToSqlServer

与SQL Server 转移数据至 MySQL 大同小异。不同之处在于:

  • 查询获得表的语句为:ResultSet rs = md.getTables(null, null, null, new String[]{"TABLE"}),这要求在创建jdbc连接的URL后面接上nullCatalogMeansCurrent=true否则会返回所有数据库表的信息,而不是指定的数据库的表。
  • 判断字段类型是否规定长度,注意MySQL中默认INT类型长度为10,而SQL Server中为0,故对于INT型字段要添加过滤条件,往SQL Server数据库插入INT类型的数据时不得指定长度。
public class MysqlToSqlServer {
    static Connection connSQLserver = null;
    static Connection connMysql = null;

    public static void setConnSQLserver(Connection connSQLserver) {
        MysqlToSqlServer.connSQLserver = connSQLserver;
    }

    public static void setConnMysql(Connection connMysql) {
        MysqlToSqlServer.connMysql = connMysql;
    }

    static PreparedStatement pstatSqlServer;
    static PreparedStatement pstatMySql;

    /**
     * 获取MySQL中的表
     */
    public static List<String> getTable(List<String> TableList) {
        System.out.println("开始获取MySQL数据库的表");
        DatabaseMetaData md = null;
        List<String> list = new ArrayList<>();
        try {
            //获取数据库元数据
            md = connMysql.getMetaData();
            //查询获得表
            ResultSet rs = md.getTables(null, null, null, new String[]{"TABLE"});
            if (rs != null) {
                list = new ArrayList<String>();
            }
            //往list添加查询到的表
            while (rs.next()) {
                // 存在需要转移的表 / 为空:转移所有表
                if(TableList.contains(rs.getString("TABLE_NAME"))||TableList.isEmpty())
                    list.add(rs.getString("TABLE_NAME"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("成功获取MySQL数据库的表");
        return list;
    }

    /**
     * 用于向Sql Server数据库单个表插入元组
     * table  表名  size 字段个数
     */
    public static boolean insertTable(String table,int size){
        try {
            pstatMySql=connMysql.prepareStatement("select * from "+table);
            ResultSet rs=pstatMySql.executeQuery();
            //分隔符
            String separator="";
            //插入元组的sql语句
            String insertSql="insert into "+table+" values(";
            for (int i = 0; i < size; i++) {
                insertSql+=(separator+"?");
                separator=",";
            }
            insertSql+=")";
            //关闭自动提交,使插入字段的语句为一个事务组
            connSQLserver.setAutoCommit(false);
            //定义预编译的sql语句对象
            pstatSqlServer=connSQLserver.prepareStatement(insertSql);

            while (rs.next()){
                //将字段值填入insertSql语句
                for (int i = 0; i < size; i++) {
                    pstatSqlServer.setObject(i+1,rs.getObject(i+1));
                }
                //加入批处理队列
                pstatSqlServer.addBatch();
            }
            //批量更新sql语句
            pstatSqlServer.executeBatch();
            //提交
            connSQLserver.commit();
            //恢复自动提交
            connSQLserver.setAutoCommit(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }
    /**
     * 建表并转移数据
     */
    public static void convert(List<String> TableList){
        //结果集元数据
        ResultSetMetaData rsmd = null;
        //获取MySQL数据库的所有表
        List<String> list=getTable(TableList);
        System.out.println(list.size());
        for (int i = 0; i < list.size(); i++) {
            System.out.println("开始转移第" + (i + 1 )+ "数据表...");
            //查询表
            String sql = "select * from " + list.get(i);
            int size = 0;
            try {
                pstatMySql = connMysql.prepareStatement(sql);
                //获取数据表
                rsmd = pstatMySql.getMetaData();
                //创建表的语句
                String createSql = "create table " + list.get(i) + "(";
                //sql语句中字段名的分隔符
                String separator = "";
                //遍历表中所有字段
                size = rsmd.getColumnCount();
                for (int j = 0; j < size; j++) {
                    //字段名 类型
                    createSql += separator + rsmd.getColumnName(j + 1) + "  " + rsmd.getColumnTypeName(j + 1);
                    //判断类型是否规定长度;注意默认INT类型长度为10
                    if (rsmd.getPrecision(j + 1) != 0&&rsmd.getColumnTypeName(j + 1)!="INT") {
                        //不为0或INT则规定长度
                        createSql += "(" + rsmd.getPrecision(j + 1) + ")";
                    }
                    separator = ",";
                }
                createSql += ");";
                //执行建表语句
                pstatSqlServer=connSQLserver.prepareStatement(createSql);
                pstatSqlServer.execute();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            System.out.println("开始向(" + list.get(i) + ")数据表添加数据...");
            // 添加数据到建好的表中
            if (insertTable( list.get(i), size)){
                System.out.println("第" + (i + 1 ) + "个数据表数据转移成功");
            }
            else {
                System.out.println("第" + (i + 1 ) + "个数据表数据转移失败");
            }
        }
    }
}

主函数类

可与使用者交互,由使用者选择功能,并指定源数据库目的数据库,动态修改连接数据库的配置文件config.properties成功与指定的数据库连接。然后由使用者可以指定需要转移的表,或者选择转移所有表,程序将执行convert()函数转移数据。

public class main {
    /**
     * 根据输入的数据库名,更改properties文件的值
     */
    public static void modifyConfig(String SqlServer_URL, String Mysql_URL) {
        try {
            String filePath = "src/main/resources/config.properties";
            Properties properties = new Properties();
            properties.load(new FileInputStream(filePath));
            properties.setProperty("SqlServer_URL", SqlServer_URL);
            properties.setProperty("Mysql_URL", Mysql_URL);
            properties.store(new FileOutputStream(filePath), "");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 主函数
     */
    public static void main(String[] args) {
        try {
            System.out.println(System.getProperty("java.library.path"));
            Scanner in = new Scanner(System.in);
            System.out.println("请选择功能:");
            System.out.println("1.从SqlServer转移数据至MySQL");
            System.out.println("2.从MySQL转移数据至SqlServer");
            System.out.println("其它: 退出程序");
            //操作
            int op = in.nextInt();
            if(op!=1&&op!=2)
                return;
            System.out.println("请输入源数据库名:");
            String src = in.next();
            System.out.println("请输入目的数据库名:");
            String des = in.next();
            List<String> TableList = new ArrayList<>();
            System.out.println("请要转移的表名:(以回车分隔,输入#结束; 若只输入#,则转移所有表)");
            String TableName;
            do
            {
              TableName= in.next();
              // 若不是终止符,则加入
              if(!TableName.equals("#"))
              {
                  TableList.add(TableName);
              }
              else
              {
                  break;
              }
            }while(true);
            if (op == 1) {
                String SqlServer_URL = "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=" + src;
                String Mysql_URL = "jdbc:mysql://localhost:3306/" + des;
                //修改配置
                modifyConfig(SqlServer_URL, Mysql_URL);
                //连接数据库
                SqlServerConnection SqlServerConn = new SqlServerConnection();
                MysqlConnection MysqlConn = new MysqlConnection();
                SqlServerConn.connect();
                MysqlConn.connect();
                SqlServerToMysql.setConnSQLserver(SqlServerConn.getConnection());
                SqlServerToMysql.setConnMysql(MysqlConn.getConnection());
                System.out.println("开始转移数据");
                //计时
                long start = System.currentTimeMillis();
                //转移数据库
                SqlServerToMysql.convert(TableList);
                System.out.println("迁移完毕,耗时:"+(System.currentTimeMillis()-start)+"ms");
            }
            else if (op==2){
                String SqlServer_URL = "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=" + des;
                //nullCatalogMeansCurrent=true 使getTable使返回指定数据库的表的信息
                String Mysql_URL = "jdbc:mysql://localhost:3306/" + src+"?nullCatalogMeansCurrent=true";
                //修改配置
                modifyConfig(SqlServer_URL, Mysql_URL);
                //连接数据库
                SqlServerConnection SqlServerConn = new SqlServerConnection();
                MysqlConnection MysqlConn = new MysqlConnection();
                SqlServerConn.connect();
                MysqlConn.connect();
                MysqlToSqlServer.setConnSQLserver(SqlServerConn.getConnection());
                MysqlToSqlServer.setConnMysql(MysqlConn.getConnection());
                System.out.println("开始转移数据");
                //计时
                long start = System.currentTimeMillis();
                //转移数据库
                MysqlToSqlServer.convert(TableList);
                System.out.println("迁移完毕,耗时:"+(System.currentTimeMillis()-start)+"ms");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

5 实验效果

由 SQL Server 转移数据至 MySQL

转移指定的表

  • SQL Server数据库的test中有表student,course

    image-20220521184525491 image-20220521184627654 image-20220521184654364

  • 指定转移course表,则执行程序:

image-20220521194512964

  • MySQL产生这一个表:

    image-20220521184457197 image-20220521184509328

转移所有表

  • SQL Server数据库的test中有表student,course

    image-20220521184525491 image-20220521184627654 image-20220521184654364

  • 执行程序:

    image-20220521193707466

  • MySQL产生这两个表:

    image-20220521185003182 image-20220521184927043 image-20220521184943789

由 MySQL 转移数据至 SQL Server

转移指定的表

  • MySQL数据库的test中有表student,teacher

  • 指定转移student表,则执行程序:

    image-20220521194249290

  • SQL Server产生这一个表:

    image-20220521183307710image-20220521183249389

转移所有表

  • MySQL数据库的test中有表student,teacher

    image-20220521182414504 image-20220521182446725 image-20220521182510012

  • 执行程序:

    image-20220521194119166

  • SQL Server产生这两个表:

    image-20220521182911972image-20220521182936258 image-20220521183004198

6 实验心得

​ 这次实验让我进一步熟练了如何通过JDBC连接MySQL数据库并进行操作,而是首次接触SQL Server,刚开始使用Windows身份认证配置连接,结果接连出错,后来改用SQL Server身份认证,通过登录名和密码连接数据库从而成功在Java中配置数据源。

​ 而在转移数据部分代码的编写中,我学会了如何使用getMetaData()获取当前连接数据库的元数据,并通过getTable()获取数据表,这里要格外注意在SQL Server和MySQL获取表信息的区别。既SQL Server查询获得表的语句getTables(null, "dbo", null, null)为,MySQL的为:md.getTables(null, null, null, new String[]{"TABLE"})。对于Mysql,需要在连接URL后面接上nullCatalogMeansCurrent=true否则会返回所有数据库表的信息,而不是指定的数据库的表。

​ 此次我对预编译SQL语句的对象prepareStatement的使用更加熟练,并学会如何对一组SQL语句事务进行批处理,即对于一个连接通过setAutoCommit(false)关闭自动提交,对于预编译对象,通过addBatch()将填充后SQL语句加入批处理队列,使用executeBatch()批量更新sql语句。最后对于连接,通过commit()将这组SQL事务提交,一次性执行。这样批量处理sql数据提高了数据库执行SQL语句的效率,解决了数据库处理速度快与sql语句一次次传输需要时间的冲突

​ 在主函数中,我增加了与用户的交互模块,使使用者可以选择需要的转移数据功能,直接修改配置文件指定源数据库和目的数据库,使用列表保存用户需要转移的表,不将转移数据局限于固定的数据库和固定的表中中,即灵活地实现转移异构数据库中数据

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《数据库系统》课程之实验七 通过ODBC/JDBC转移异构数据库中数据 的相关文章

  • MySQL 中有“connect by”替代方案吗?

    如果我使用 Oracle 有connect by可用于创建分层查询的关键字 目前我正在一个项目中使用MySQL 我想知道是否有替代方案connect by在 MySQL 中 我尝试过谷歌 但到目前为止还没有结果 我想要实现的是通过一个查询从
  • PHP 5.4 PDO 无法使用旧的不安全身份验证连接到 MySQL 4.1+

    我知道有很多类似的问题 事实上我已经阅读了所有 9 个问题 但是 他们都没有解决我的问题 我有一个共享托管包 最低限度 我的包中包含域名和托管 MySQL 服务器的单独 IP 地址 为了开发 我正在使用http localhost 与 PH
  • 找时间通过 PHP 执行 MySQL 查询

    我在互联网上看到过这个问题 here http www phpbuilder com board showthread php t 2100256 and here http answers yahoo com question index
  • 如何通过 MySQL Workbench 或 CLI 或 MySQLWeb 数据库管理应用程序连接到 Pivotal Cloud Foundry (PCF) 上的 MySQL 服务?

    我有一个Spring Boot based REST部署在的应用程序Pivotal Cloud Foundry PCF 并且工作正常 但是这个 REST 应用程序到目前为止还没有任何数据库连接 因此 我决定安装MySQL服务于PCF从市场上
  • 将 Python 列表(JSON 或其他)插入 MySQL 数据库

    所以我在Python中有一堆数组数据 嗯 相反 我有一个清单 我试图将此数组存储到 MySQL 数据库中的单个单元格中 我尝试使用 JSON 来序列化我的数据 但也许我不明白 JSON 是如何工作的 因此 在连接到我的数据库后 我尝试了上游
  • 选择每组最新的项目[重复]

    这个问题在这里已经有答案了 可能的重复 检索每组中的最后一条记录 https stackoverflow com questions 1313120 retrieving the last record in each group 我有 2
  • Wordnet sqlite 同义词和示例

    我正在尝试获取给定 wordid 的同义词和示例列表 经过大量的试验和错误 我可以获得所有同义词集的样本 但不是实际的同义词 这是我的查询 它给出了以下结果 select senses wordid senses synsetid sens
  • Symfony/Doctrine 重新排列数据库列

    当我使用doctrine schema update命令行生成表时 Doctrine 或Symfony 似乎想要添加一个命令来重新排列我的列 将键放在它出现的前面 我想知道是否 更希望在哪里 我可以禁用环境的这个 功能 所以当我去生成我的表
  • 将我的 Laravel 连接到外部数据库

    如何将 Laravel 连接到外部数据库 示例 我的本地计算机上有一个 Laravel 它在 xampp 上运行 我希望它连接到云服务器数据库 打开 env文件并编辑它 只需设置正确的外部数据库凭据 DB CONNECTION mysql
  • SQL 查询结果为字符串(或变量)

    是否可以将SQL查询结果输出到一个字符串或变量中 我的php和mysql不好 假设我有数据库 agents 其中包含列 agent id agent fname agent lname agent dept 使用此查询 sql SELECT
  • 关于 Cassandra 与 MySQL 的一些建议

    几天前我在这里问了一个问题 得到了一些非常好的答案 我正在考虑做一个带有个人资料 个人简介等的facebook风格的网站 并询问我是否应该使用mysql 答案是使用Cassandra 因为好多了 我只是问这是每个人都会建议的 只是我对mys
  • 当php脚本通过ajax运行时显示进度条

    我有一个通过 ajax 向服务器提交值的表单
  • mysql_query 保留返回时在表中创建的数据类型?

    我在mysql中有一个表 CREATE TABLE user id INT name VARCHAR 250 我查询表 result mysql query SELECT id name FROM user 我收集结果 while row
  • 无法将句子插入数据库

    我有一些句子 我必须选择由 6 个以上单词组成的句子 然后它们将被插入到数据库中
  • 如何获取所有mysql元组结果并转换为json

    我能够从表中获取单个数据 但是当我试图获取表上的所有数据时 我只得到一行 cnn execute sql rows cnn fetchall column t 0 for t in cnn description for row in ro
  • 在 PHP 中比较字符串的方式与 MySQL 相同

    我将 varchar 存储在 utf8 MySQL 表中并使用 utf8 general ci 排序规则 我在 varchar 上有一个唯一索引 我想在 PHP 中进行字符串比较 这相当于 MySQL 对索引所做的操作 一个具体的例子是 我
  • 使用 Ruby on Rails 索引多列

    我在 Mysql 数据库中有一个表 我想在其上使用多列索引 如何在不使用 mysql 控制台的情况下在 Rails 中执行此操作 在迁移定义中 您可以这样做 add index table name column1 column2
  • Codeigniter $this->db->reconnect();用法

    I m not自动加载数据库 因为我的应用程序的大多数页面don t需要数据库处理 否则整个事情会变慢 我想要做的是 当数据库已经存在时 不要建立与数据库的新连接 而是使用它而不是打扰服务器数据库 那么我该如何实施 this gt db g
  • 正确显示mySQL一对多查询结果

    我有两张桌子 TRIPS tripID clientID and LEGS legID depart arrive tripID TRIPS 与 LEGS 具有一对多关系 因为有多个legID s per tripID 我需要以以下格式显示
  • PHP:使用输入和输出参数(不是“INOUT”)调用 MySQL 存储过程

    我想从 PHP 调用 MySQL 中的存储过程 该过程需要输入and输出参数 not INOUT 参数 举一个简单的例子 假设我在 MySQL 中有以下存储过程 DELIMITER DROP PROCEDURE IF EXISTS test

随机推荐

  • 链表oj刷题——6道进阶题目

    目录 1 链表分割 题目 思路 2 链表的回文结构 题目 思路 3 输入两个链表 找出它们的第一个公共结点 题目 思路一 思路二 思路三 4 给定一个链表 判断链表中是否有环 题目 思路 5 给定一个链表 返回链表开始入环的第一个结点 如果
  • ConcurrentHashMap总结

    为什么80 的码农都做不了架构师 gt gt gt 并发编程实践中 ConcurrentHashMap是一个经常被使用的数据结构 相比于Hashtable以及Collections synchronizedMap ConcurrentHas
  • Struts2框架(一)

    Struts2框架 一 什么是框架 框架有什么用 1 框架 是 实现部分功能的代码 半成品 使用框架简化企业级软件开发 提高开发效率 2 学习框架 清楚的知道框架能做什么 还有哪些工作需要自己编码实现 二 什么是struts2框架 它有什么
  • 快速实现ML302 4G HTTP通信详解

    ML302作为HTTP Client和Server通信 一 本例程实现功能 二 Core提供的HTTP功能介绍 三 接线图 五 完整代码 代码运行结果 六 需注意事项 一 本例程实现功能 Core通过ML302 4G Cat1模块实现HTT
  • SpringBoot项目表格下载,上传和批量数据导入功能——小白级别,自己记录使用;

    应用场景 在后台管理项目中经常会需要批量导入的功能 这个时候我们就可以用Excel表格完成数据的下载 一 新建SpringBoot项目 并且配置数据库 1 pom xml 文件中导入依赖
  • 软件测试入门知识,jmeter系统基础课程———带你由浅入深学性能(完)

    软件测试知识持续更新中 性能测试常见问题 简述性能测试流程 如何确定系统最大负载 你们系统哪些地方 哪些功能 做了性能测试 你们的并发用户数是怎么确定的 你们性能测试什么时间执行 怎么分析性能测试结果 think time 的作用是什么 在
  • java复制的五种方法

    第一种 private static void methods1 throws FileNotFoundException IOException 字符流 一次读写一个字符 创建输入流对象 FileReader fr new FileRea
  • MySQL连表分组统计使用count查询出数据不准确问题解决方案

    先上两副图 这里有两张表 score表和year as表 要求统计出score表按年份分组的个数 且查询出来的内容需要包括year as表中的year as字段 使用正常连表并分组统计count得出的SQL和对应结果如下 SELECT b
  • 基于JDK1.8 的ArrayList源码分析

    基于JDK1 8 的ArrayList源码分析 代码注释 JDK版本 jdk1 8 0 181 package java util import java util function Consumer import java util fu
  • 信道编码知识点总结

    通信系统常用差错控制方法 自动重发请求法 ARQ 前向纠错法 FEC 信头差错校验法 HEC 自动重发法 接收端译码器判决收到的码序列有没有错误 通过反馈信道把判决结果告诉发送端 发送端根据判决信号重发接收端认为有错的信息 直到接收端认为正
  • 期货交易服务行业调研报告 - 市场现状分析与发展前景预测

    期货交易服务市场的企业竞争态势 该报告涉及的主要国际市场参与者有Daniels Trading Saxo Tradovate NinjaTrader AGT Futures CQG Gain Capital Group ABLWSYS Sm
  • MIPS系统网络的配置

    4 MIPS系统网络的配置 模拟MPIS系统 并配置MIPS系统网络 01 安装依赖文件 sudo apt get install uml utilities bridge utils 02 修改Ubuntu主机网络配置 将Ubuntu系统
  • 单目测距(yolo目标检测+标定+测距代码)

    单目测距 目标检测 标定 测距 实时感知本车周围物体的距离对高级驾驶辅助系统具有重要意义 当判定物体与本车距离小于安全距离时便采取主动刹车等安全辅助功能 这将进一步提升汽车的安全性能并减少碰撞的发生 上一章本文完成了目标检测任务 接下来需要
  • 一枚芯片的成本是多少?(2)芯片硬件成本

    芯片硬件成本 计算封装和测试的成本这个没有具体的公式 只是测试的价格大致和针脚数的二次方成正比 封装的成本大致和针脚乘功耗的三次方成正比 如果CPU X采用40nm低功耗工艺的自主芯片 其测试成本约为2美元 封装成本约为6美元 因40nm低
  • nodejs调用mongodb!!!

    Nodejs调用MongoDB 要在 MongoDB 中创建一个数据库 首先我们需要创建一个 MongoClient 对象 然后配置好指定的 URL 和 端口号 如果数据库不存在 MongoDB 将创建数据库并建立连接 导入MongoDB包
  • 华为VS谷歌:万物互联,谁主沉浮?

    一 一周两套操作系统发布 6月2日 华为通过直播形式举行了鸿蒙HarmonyOS 2及华为全场景新品发布会 关于该发布会的详细内容老猿在 鸿蒙最新功能及承载设备详解 HarmonyOS 2及华为全场景新品发布会全纪录 进行了详细介绍 在此不
  • 【科普】一文读懂以太网PHY芯片

    物理层器件PHY Physical Layer Interface Devices 是将各网元连接到物理介质上的关键部件 负责完成互连参考模型 OSI 第1层中的功能 即为链路层实体之间进行bit传输提供物理连接所需的机械 电气 光电转换和
  • 嵌入式中锁机制杂谈

    在之前的文章中有提到操作系统中锁机制一般依赖于硬件CPU提供的原子数据操作指令 如SWP TEST AND SET等原子原语实现 基于此 才能真正保证锁机制的有效实现 通过上面原子操作 我们比较容易实现所谓的自旋操作 原子性的原地循环判断条
  • np.random.choice用法

    np random choice a size replace p 其作用是按要求生成一个一维数组 a是生成一维数组的来源 可以是int类型 可以是数组 也可以是list size 为从a中抽取的个数 即生成数组的维度 replace 表示
  • 《数据库系统》课程之实验七 通过ODBC/JDBC转移异构数据库中数据

    注 查看全文请关注作者 或点击前往 数据库系统 课程之实验七 通过ODBC JDBC转移异构数据库中数据 数据库系统 课程之实验七 通过ODBC JDBC转移异构数据库中数据 1 实验目的 学会配置ODBC JDBC数据源 熟悉使用ODBC