关于JDBC总结

1.JDBC介绍

     1.1.What is JDBC?

            1.     JDBC(Java Database Connectivity)是基于JAVA语言访问数据库的一种技术。
            2.     JDBC 的设计思想:由 SUN 公司(JCP)提供访问数据库的接口,由数据库厂商提
                    供对这些接口的实现,程序员编程时都是针对接口进行编程的。
            3.     JDBC 包括一套 JDBC 的 API 和一套程序员和数据库厂商都必须去遵照的规范。
                        1) java.sql包:提供访问数据库基本的功能
                        2) javax.sql包:提供扩展的功能
            4.     数据库中间件
            5.     JDBC能够作些什么?
                        1) 链接到数据库
                        2) 在Java app中执行SQL命令
java

                        3) 处理结果 。mysql

        1.2.Five important interfaces of JDBC
程序员

            1.     Connection:特定数据库的链接(会话)。在链接上下文中执行 SQL 语句
                    并返回结果
            2.     Statement:用于执行静态 SQL 语句并返回它所生成结果的对象
            3.     PreparedStatement:表示预编译的 SQL 语句的对象
            4.     CallableStatement:用于执行 SQL 存储过程的接口
            5.     ResultSet:表示数据库结果集的数据表,一般经过执行查询数据库的语
sql

                    句生成数据库

 2.The step of developping a JDBC App

       2.1. 注册 JDBC  驱动程序

              1. Class.forName("oracle.jdbc.driver.OracleDriver");
              2. Class.forName("oracle.jdbc.driver.OracleDriver");

              3. java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver com.FirstJDBC编程

       2.2. 建立数据库链接( 获取 Connection  的方法)

                 经过DriverManager  获取
                Connection conn = DriverManager.getConnection(url, “username", “password");
                1) JDBC的URL=协议名+子协议名+数据源名。
                       a 协议名老是“jdbc”。
                       b 子协议名由JDBC驱动程序的编写者决定。
                       c 数据源名也可能包含用户与口令等信息;这些信息也可单独提供。
                2) 几种常见的数据库链接
                -------------------------------jdbc-odbc---------------
                驱动:sun.jdbc.odbc.JdbcOdbcDriver
                URL:jdbc:odbc:datasource_name
                -------------------------------oracle------------------
                驱动:oracle.jdbc.driver.OracleDriver
                URL:jdbc:oracle:thin:@<machine_name><:port>:dbname
                注:machine_name:数据库所在的机器的名称;
                port:端口号,默认是1521
                -------------------------------mysql-------------------
                驱动:org.gjt.mm.mysql.Driver
                or: com.mysql.jdbc.Driver
                URL:jdbc:mysql://<machine_name><:port>/dbname
                注:machine_name:数据库所在的机器的名称;
                port:端口号,默认3306
                ---------------------------SQL Server------------------
                驱动:com.microsoft.jdbc.sqlserver.SQLServerDriver
                URL:jdbc:microsoft:sqlserver://<machine_name><:port>;DatabaseName=<dbname>
                注:machine_name:数据库所在的机器的名称;
                port:端口号,默认是1433
                --------------------------DB2--------------------------
                驱动:com.ibm.db2.jdbc.app.DB2Driver
                URL:jdbc:db2://<machine_name><:port>/dbname
                注:machine_name:数据库所在的机器的名称;
                port:端口号,默认是5000
                -------------------------------------------------------
      2.3. 建立 SQL( 存储过程)
         
             2.3.1. 建立 Statement  对象
                    1. Statement stm = con.createStatement();
                    2. 主要方法
                        1)     执行查询 SQL 语句(返回结果集)
                                ResultSet executeQuery(String sql)throws SQLException;
                        2)     执行更新 SQL 语句(返回受影响的行数)
                                int rows = executeUpdate(String sql)throws SQLException
                        3)     万能执行 SQL 语句(若是第一个结果为 ResultSet 对象,则返回 true;若是其为更
                                新计数或者不存在任何结果,则返回 false)
                                boolean flag=stmt.execute(sql);
                                ResultSet rs=null;
                                int rows=0;
                                if(flag){
                                rs=stmt.getResultSet();
                                }
                                else{
                                rows=stmt.getUpdateCount();
                                }

                2.3.2. PreparedStatement

                   1. 用来处理 SQL 结构、关键部分相同的 SQL 语句
                    2. pstmt=conn.prepareStatement(sql);
                    3. 例子
                        String sql = "SELECT * FROM student WHERE stu_sex=?";
                        //?表明一个占位符合,它的值是待定的。
                        pstmt=conn.prepareStatement(sql);
                        //下面的语句设置?的值
                        //第一参数是?的索引位置
                        //第二参数:把?的值设置成这个参数
                        pstmt.setString(1, “f");
                        rs=pstmt.executeQuery();
                        String sql = "INSERT INTO student(stu_name,stu_sex,stu_age,stu_desc,stu_grade)
                        VALUES(?,?,?,?,?)";
                        pstmt=conn.prepareStatement(sql);
                        pstmt.setString(1, "LILY");
                        pstmt.setString(2, "F");
                        pstmt.setInt(3, 23);

                         pstmt.setString(4, "***");
                        pstmt.setString(5, "sd0702");
                        pstmt.executeUpdate();

            2.3.3. CallableStatement

              1.     用来执行存储过程
                2.     CallableStatement cstmt=con.prepareCall(sql);
                3.     例子
                        String sql = "CALL getTotalStudent(?,?)";
                        CallableStatement cstmt=con.prepareCall(sql);
                        // 设置OUT和IN参数
                        cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
                        cstmt.setString(2, "xxx");
                        建立一个存储过程
                        in:参数从Java程序传到数据库的存储过程
                        out:反过来
                        SQl语句中建立存储过程:
                                1) delimiter //
                                2)
                                CREATE PROCEDURE getTotalStudent(OUT totalStudent integer(11),IN sex char(2))
                                BEGIN
                                SELECT count(*) INTO totalStudent FROM
                                student
                                WHERE stu_sex LIKE sex;
                                END//
                                3) delimiter ;
             2.3.4. Statement  接口的比较
                 Statement接口的比较
                    
  Statement PreparedStatement CallableStatement
代码建立  数据库服务器的客户端 数据库服务器的客户端 数据库服务器端
代码存储 客户端  服务器端  服务器端
编程语言 Java、SQL Java、SQL 服务器端特定数据库
语言
可配置性 灵活
可移植性  高     (支持)差
效率 低  第一次低,之后高
    选择:没有最好,只有最合适!
    建议:能够移植性好首先考虑的条件!而后再考虑性能问题!
     
    2.4.How to handle resultset
          1. 经过 index 获取字段的值
                String getString(int columnIndex) //int类型的参数
                SELECT * FROM student;//默认顺序按表里的定义顺序
                rs.getString(3);//stu_sex
                SELECT stu_name,stu_sex,stu_desc FROM student;
                rs.getString(3);//stud_desc
                columnIndex:select子句中该字段的索引位置
        2.  经过字段名获取字段的值。
                String getString(String columnName) //String类型的参数
                以 Java 编程语言中 String 的形式检索此 ResultSet 对象的当前行中指定列的值。
                rs.getString("stu_name");//stu_name
                rs.getInt("stu_id");//stu_id
        3.  Java 类型到 SQL 类型的映射。

    2.5. 关闭 JDBC 
         1.     首先关闭记录集;         2.     其次关闭Statement;         3.     最后关闭链接对象。                    if(rs !=null){                    try{rs.close();}catch(SQLException e){e.printStackTrace();}}                    if(stm!=null){try{stm.close();}catch(SQLException                    e){e.printStackTrace();}}                    if(con!=null){try{con.close();}catch(SQLException                    e){e.printStackTrace();}}