• JDBC连接效率问题


    JDBC部分 
    终端进入mysql: mysql -u root回车 
    终端进入oracle: telnet 192.168.0.23  然后sqlplus openlab/open123 
    MySQL常用命令: show databases; use tableName;  show tables; 


    一、概述JDBC 
        JDBC从物理结构上说就是Java语言访问数据库的一套接口集合。 
        从本质上来说就是调用者(程序员)和实现者(数据库厂商)之间的协议。 

        JDBC API 使得开发人员可以使用纯Java的方式来连接数据库,并进行操作。 
        ODBC:基于C语言的数据库访问接口。 
        JDBC:是Java版的ODBC。 
        JDBC 特性:高度的一致性、简单性(常用的接口只有4、5个)。 

    驱动程序按照工作方式分为四类: 
        1、JDBC-ODBC bridge + ODBC 驱动 
           JDBC-ODBC bridge桥驱动将JDBC调用翻译成ODBC调用,再由ODBC驱动翻译成访问数据库命令。 
           优点:可以利用现存的ODBC数据源来访问数据库。 
           缺点:从效率和安全性的角度来说的比较差。不适合用于实际项目。 
        2、基于本地API的部分Java驱动 
           我们应用程序通过本地协议跟数据库打交道。然后将数据库执行的结果通过驱动程序中的Java部分返回给客户端程序。 
           优点:效率较高。 
           缺点:安全性较差。 
        3、纯Java的网络驱动 
           (中间协议)            (本地协议) 
           app    JDBC     纯Java                 中间服务器               DB 
           缺点:两段通信,效率比较差 
           优点:安全信较好 
        4、纯Java本地协议:通过本地协议用纯Java直接访问数据库。 
           特点:效率高,安全性好。 

    二、JDBC 编程的步骤 
            import java.sql.*; 
        0.参数化 
            String driverName = "com.mysql.jdbc.Driver"; 
            String url = "jdbc:mysql://localhost:3306/test"; //协议;库或服务器名称;服务器IP,端口 
            String username = "root"; 
            String password=""; 
                /* Oracle的连接 
                String driverName = "oracle.jdbc.driver.OracleDriver"; 
                String url = "jdbc:oracle:thin:@192.168.0.23:1521:ora10g"; 
                String username = "openlab"; 
                String password="open123";*/ 
            //以下这些都需要写在有异常的代码块里,所以需要提取出来。 
            Connection conn = null; 
            Statement stmt = null; 
            ResultSet rs = null;//建议用PreparedStatement 
        1.加载和注册数据库驱动 
            Class.forName(driverName);//自动注册;需要把驱动的jar包导进来;需处理异常 
                /*方法二:实例化具体的Driver驱动,这写法一般不用(不能参数化驱动名,不够灵活) 
                Driver driver = new com.mysql.jdbc.Driver(); 
                DriverManager.registerDriver(driver); //将驱动交于DriverManager托管*/ 
                /*方法三:Dos运行时,java -Djdbc.drives = oracle.jdbc.driver.OracleDriver; --可多个 */ 
        2.连接数据库 
            conn = DriverManager.getConnection(url, username, password);//需处理异常 
            //Connection返回数据库连接,如:“com.mysql.jdbc.Connection@1ffb8dc”;连接不成功则返回 null 
        3.创建Statement对象 //为了类型安全和批量更新的效率,改用PreparedStatement 
            stmt = conn.createStatement();//需处理异常 
            //返回其生成结果的对象"oracle.jdbc.driver.OracleStatement@198dfaf" 
        4.操作数据库,执行SQL语句 
            String sql = "select * from tableName";//SQL语句里不需要写分号 
            rs = stmt.executeQuery(sql); //executeQuery(sqlString) 查询 返回查询结果集 
                /* String sql = "insert into tableName values(?,?)"; // ?占位符 
                int number = stmt.executeUpdate(sql);//更新,再返回int(更新、修改影响的条数) */ 
        5.处理数据(游标) 
            StringBuffer sb = new StringBuffer(); //缓存;用它可提高读取速度。当然,不用也可以。 
            ResultSetMetaData md = rs.getMetaData(); //ResultSetMetaData可获取列的类型和属性信息 
            int col = md.getColumnCount(); //获取列的数目 
            while(rs.next()){ //rs.next()使游标下移一位,返回boolean,没有下一个结果则返回false 
                for(int i=1; i<=col;i++){ // index(JDBC 的下标从1开始)  
                    sb.append(md.getColumnName(i)+"="+rs.getString(i)+"  "); 
                } sb.append(" "); 
            }System.out.println(sb); 
                //1.游标的初始位置在第一条记录的前面,使第一次调用next()后,刚好拿到第一个结果。 
                //2.游标的最终位置在最后一条记录的后面(结果集的前面和后面留空,真正存在) 
        6.释放资源,断开与数据库的连接 
            //先判断是否有引用资源,再释放(释放空资源会抛异常);注意顺序 
            if(rs!=null)try{rs.close();}catch(Exception e){e.printStackTrace();} 
            if(stmt!=null)try{stmt.close();}catch(Exception e){e.printStackTrace();} 
            if(conn!=null)try{conn.close();}catch(Exception e){e.printStackTrace();} 
            //这些异常没法处理,处理只为方便调试。所以这些异常处理也只是打印。 
            /*要按先ResultSet结果集,后Statement,最后Connection的顺序关闭资源, 
            因为ResultSet需要Statement和Connection连接时才可以用的;Statement也需要Connection才可用; 
            结束Statement之后有可能其它的Statement还需要连接,因此不能先关闭Connection。ResultSet同理。*/ 

        步骤 1、2、6 每次都一样,可以重构。 
           因为加载驱动是个一次性工作,所以可以采用静态初始化块来加载驱动; 
           连接数据库的方法应该自己负责,获取数据库连接信息和驱动的信息,并处理相关异常; 
           释放数据库资源的方法要考虑到ResultSet、Statement、Connection的不同情况,并处理相关异常。

  • 相关阅读:
    Java中的System类
    关于Java IO流学习总结
    Java InputStream、String、File相互转化
    Java 里把 InputStream 转换成 String 的几种方法
    详细讲解JAVA中的IO流
    获取 request 中 json 数据
    oracle count 百万级 分页查询记要总数、总条数优化
    ORACLE分页SQL语句
    ORACLE中用rownum分页并排序的SQL语句
    day7
  • 原文地址:https://www.cnblogs.com/zhuxiaolin/p/5027801.html
Copyright © 2020-2023  润新知