JDBC基础知识

JDBC是什么?



JDBC代表Java数据库连接,这对Java编程语言和广泛的数据库之间独立于数据库的连接标准的Java API。

JDBC库包含的API为每个通常与数据库的使用相关联的任务:

  • 使得连接到数据库

  • 创建SQL或MySQL语句

  • 执行SQL或MySQL的查询数据库

  • 查看和修改结果记录

从根本上说,JDBC是一种规范,它提供的接口,一套完整的,允许便携式访问底层数据库。可以用Java来写不同类型的可执行文件,如:

  • Java应用程序

  • Java Applets

  • Java Servlets

  • Java ServerPages (JSP)

  • Enterprise JavaBeans (EJBs)

所有这些不同的可执行文件就可以使用JDBC驱动程序来访问数据库,并把存储的数据的优势。

JDBC提供了相同的功能,ODBC,允许Java程序包含与数据库无关的代码。

JDBC架构:



JDBC API支持两层和三层处理模型进行数据库访问,但在一般的JDBC体系结构由两层组成:

  • JDBC API: 提供了应用程序对JDBC的管理连接。

  • JDBC Driver API: 支持JDBC管理到驱动器连接。

JDBC API的使用驱动程序管理器和数据库特定的驱动程序提供透明的连接到异构数据库。

JDBC驱动程序管理器可确保正确的驱动程序来访问每个数据源。该驱动程序管理器能够支持连接到多个异构数据库的多个并发的驱动程序。

以下是结构图,它显示了驱动程序管理器方面的JDBC驱动程序和Java应用程序的位置:

          

常见的JDBC组件:



JDBC API提供了以下接口和类:

  • DriverManager: 这个类管理数据库驱动程序的列表。内容是否符合从Java应用程序使用的通信子协议正确的数据库驱动程序的连接请求。识别JDBC在一定子协议的第一个驱动器将被用来建立数据库连接。

  • Driver: 此接口处理与数据库服务器通信。很少直接与驱动程序对象。相反,使用DriverManager中的对象,它管理此类型的对象。它也抽象与驱动程序对象工作相关的详细信息

  • Connection : 此接口与接触数据库的所有方法。连接对象表示通信上下文,即,与数据库中的所有的通信是通过唯一的连接对象。

  • Statement : 可以使用这个接口创建的对象的SQL语句提交到数据库。一些派生的接口接受除执行存储过程的参数。

  • ResultSet: 这些对象保存从数据库后,执行使用Statement对象的SQL查询中检索数据。它作为一个迭代器,让您可以通过移动它的数据。

  • SQLException: 这个类处理发生在一个数据库应用程序的任何错误。

    创建JDBC应用程序:

    参与建立一个JDBC应用程序,本教程中按六个步骤进行:

    导入包:

    这需要你有软件包包含了数据库编程所需的JDBC类。大多数情况下,使用import java.sql.* 就足够了,如下所示:

    //STEP 1. Import required packages
    import java.sql.*;
    

    注册JDBC驱动程序:

    这需要初始化驱动程序,这样就可以打开与数据库的通信信道。以下是代码片段实现这一目标:

    //STEP 2: Register JDBC driver
    Class.forName("com.mysql.jdbc.Driver");
    

    打开一个连接:

    这需要使用DriverManager.getConnection()方法来创建一个Connection对象,它代表一个物理连接的数据库,如下所示:

    //STEP 3: Open a connection
    //  Database credentials
    static final String USER = "username";
    static final String PASS = "password";
    System.out.println("Connecting to database...");
    conn = DriverManager.getConnection(DB_URL,USER,PASS);
    

    执行一个查询:

    这需要使用一个对象类型Statement或PreparedStatement构建,并提交一个SQL语句到数据库。如下:

    //STEP 4: Execute a query
    System.out.println("Creating statement...");
    stmt = conn.createStatement();
    String sql;
    sql = "SELECT id, first, last, age FROM Employees";
    ResultSet rs = stmt.executeQuery(sql);
    

    如果有一个SQL UPDATE,INSERT或DELETE语句,那么需要下面的代码片段:

    //STEP 4: Execute a query
    System.out.println("Creating statement...");
    stmt = conn.createStatement();
    String sql;
    sql = "DELETE FROM Employees";
    ResultSet rs = stmt.executeUpdate(sql);
    

    从结果集中提取数据:

    这一步是必需的情况下,从数据库中获取数据。可以使用适当的ResultSet.getXXX()方法来检索的数据结果如下:

    //STEP 5: Extract data from result set
    while(rs.next()){
        //Retrieve by column name
        int id  = rs.getInt("id");
        int age = rs.getInt("age");
        String first = rs.getString("first");
        String last = rs.getString("last");
    
        //Display values
        System.out.print("ID: " + id);
        System.out.print(", Age: " + age);
        System.out.print(", First: " + first);
        System.out.println(", Last: " + last);
    }
    

    清理环境:

    应该明确地关闭所有的数据库资源,对依赖于JVM的垃圾收集如下:

    //STEP 6: Clean-up environment
    rs.close();
    stmt.close();
    conn.close();
    

    第一个JDBC 程序:

    基于上面的步骤,我们可以有以下综合示例代码,我们可以用它作为模板而写JDBC代码:
    此示例代码已被写入基于对环境和数据库环境一章中设置完成。

    //STEP 1. Import required packages
    import java.sql.*;
    
    public class FirstExample {
       // JDBC driver name and database URL
       static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
       static final String DB_URL = "jdbc:mysql://localhost/EMP";
    
       //  Database credentials
       static final String USER = "username";
       static final String PASS = "password";
       
       public static void main(String[] args) {
       Connection conn = null;
       Statement stmt = null;
       try{
          //STEP 2: Register JDBC driver
          Class.forName("com.mysql.jdbc.Driver");
    
          //STEP 3: Open a connection
          System.out.println("Connecting to database...");
          conn = DriverManager.getConnection(DB_URL,USER,PASS);
    
          //STEP 4: Execute a query
          System.out.println("Creating statement...");
          stmt = conn.createStatement();
          String sql;
          sql = "SELECT id, first, last, age FROM Employees";
          ResultSet rs = stmt.executeQuery(sql);
    
          //STEP 5: Extract data from result set
          while(rs.next()){
             //Retrieve by column name
             int id  = rs.getInt("id");
             int age = rs.getInt("age");
             String first = rs.getString("first");
             String last = rs.getString("last");
    
             //Display values
             System.out.print("ID: " + id);
             System.out.print(", Age: " + age);
             System.out.print(", First: " + first);
             System.out.println(", Last: " + last);
          }
          //STEP 6: Clean-up environment
          rs.close();
          stmt.close();
          conn.close();
       }catch(SQLException se){
          //Handle errors for JDBC
          se.printStackTrace();
       }catch(Exception e){
          //Handle errors for Class.forName
          e.printStackTrace();
       }finally{
          //finally block used to close resources
          try{
             if(stmt!=null)
                stmt.close();
          }catch(SQLException se2){
          }// nothing we can do
          try{
             if(conn!=null)
                conn.close();
          }catch(SQLException se){
             se.printStackTrace();
          }//end finally try
       }//end try
       System.out.println("Goodbye!");
    }//end main
    }//end FirstExample - by www.yiibai.com
    

    现在让我们来编译上面的例子如下:

    C:\>javac FirstExample.java
    C:\>
    

    当你运行FirstExample的,它会产生以下结果:

    C:\>java FirstExample
    Connecting to database...
    Creating statement...
    ID: 100, Age: 18, First: Zara, Last: Ali
    ID: 101, Age: 25, First: Mahnaz, Last: Fatma
    ID: 102, Age: 30, First: Zaid, Last: Khan
    ID: 103, Age: 28, First: Sumit, Last: Mittal
    C:\>
    

    SQLException方法:

    一个SQLException既可以发生在驱动程序和数据库。当这样的异常时,SQLException类型的对象将被传递到catch子句。
    通过SQLException对象有以下几种方法可用于获取更多的关于异常的信息:

    方法 描述
    getErrorCode() 获取与异常关联的错误号。
    getMessage() 获取的JDBC驱动程序的错误处理错误消息的驱动程序,或获取Oracle错误号和消息的数据库错误。
    getSQLState() 获取XOPEN SQLSTATE字符串。对于JDBC驱动程序错误,没有有用的信息,从该方法返回。对于一个数据库错误,五位的XOPEN SQLSTATE代码返回。这种方法可以返回null。
    getNextException() 获取异常链中的下一个Exception对象。
    printStackTrace() 打印当前的异常,或可抛出,并回溯到标准错误流。
    printStackTrace(PrintStream s) 打印此抛出对象及其回溯到指定的打印流。
    printStackTrace(PrintWriter w) 打印此抛出对象及其回溯您指定打印作家。

    通过利用从Exception对象提供的信息,可以捕获一个异常,并适当地继续运行程序。这是一个try块中的一般形式:

    try {
       // Your risky code goes between these curly braces!!!
    }
    catch(Exception ex) {
       // Your exception handling code goes between these 
       // curly braces, similar to the exception clause 
       // in a PL/SQL block.
    }
    finally {
       // Your must-always-be-executed code goes between these 
       // curly braces. Like closing database connection.
    }
    

    JDBC - 数据类型:

    下表总结了默认的JDBC数据类型的Java数据类型转换,当调用PreparedStatement或CallableStatement对象的setXXX()方法,或ResultSet.updateXXX()方法。

    SQL JDBC/Java setXXX updateXXX
    VARCHAR java.lang.String setString updateString
    CHAR java.lang.String setString updateString
    LONGVARCHAR java.lang.String setString updateString
    BIT boolean setBoolean updateBoolean
    NUMERIC java.math.BigDecimal setBigDecimal updateBigDecimal
    TINYINT byte setByte updateByte
    SMALLINT short setShort updateShort
    INTEGER int setInt updateInt
    BIGINT long setLong updateLong
    REAL float setFloat updateFloat
    FLOAT float setFloat updateFloat
    DOUBLE double setDouble updateDouble
    VARBINARY byte[ ] setBytes updateBytes
    BINARY byte[ ] setBytes updateBytes
    DATE java.sql.Date setDate updateDate
    TIME java.sql.Time setTime updateTime
    TIMESTAMP java.sql.Timestamp setTimestamp updateTimestamp
    CLOB java.sql.Clob setClob updateClob
    BLOB java.sql.Blob setBlob updateBlob
    ARRAY java.sql.Array setARRAY updateARRAY
    REF java.sql.Ref SetRef updateRef
    STRUCT java.sql.Struct SetStruct updateStruct

    JDBC3.0的增强支持BLOB,CLOB,ARRAY,REF数据类型。的ResultSet对象UPDATEBLOB(),updateCLOB(),updateArray()和updateRef()方法,使您可以在服务器上直接操作相应的数据。

    setXXX()和updateXXX()方法,可以转换成特定的Java类型到特定的JDBC数据类型。setObject()和updateObject()方法,几乎所有的Java类型映射到JDBC数据类型。

    ResultSet对象提供相应的getXXX()方法为每个数据类型来检索列值。每一种方法,可以使用与列名或由它的序号位置。

    SQL JDBC/Java setXXX getXXX
    VARCHAR java.lang.String setString getString
    CHAR java.lang.String setString getString
    LONGVARCHAR java.lang.String setString getString
    BIT boolean setBoolean getBoolean
    NUMERIC java.math.BigDecimal setBigDecimal getBigDecimal
    TINYINT byte setByte getByte
    SMALLINT short setShort getShort
    INTEGER int setInt getInt
    BIGINT long setLong getLong
    REAL float setFloat getFloat
    FLOAT float setFloat getFloat
    DOUBLE double setDouble getDouble
    VARBINARY byte[ ] setBytes getBytes
    BINARY byte[ ] setBytes getBytes
    DATE java.sql.Date setDate getDate
    TIME java.sql.Time setTime getTime
    TIMESTAMP java.sql.Timestamp setTimestamp getTimestamp
    CLOB java.sql.Clob setClob getClob
    BLOB java.sql.Blob setBlob getBlob
    ARRAY java.sql.Array setARRAY getARRAY
    REF java.sql.Ref SetRef getRef
    STRUCT java.sql.Struct SetStruct getStruct

    JDBC - 批量处理:

    批处理允许一个批处理组相关的SQL语句,并将其提交的一个调用到数据库。

    当几个SQL语句一次发送到数据库中,可以减少通信开销,从而提高性能。

    • JDBC驱动程序不支持此功能。您应该使用DatabaseMetaData.supportsBatchUpdates()方法来确定目标数据库支持批量更新处理。如果你的JDBC驱动程序支持此功能,则该方法返回true。

    • addBatch()方法的声明,PreparedStatement和CallableStatementis用于添加单个语句的批处理。 executeBatch()将开始执行的所有语句组合到一起。

    • executeBatch()将返回一个整数数组,每个数组元素的表示为相应的更新语句的更新计数。

    • 可以添加语句进行处理,可以clearBatch()方法删除它们。此方法将删除addBatch()方法添加的所有语句。但是,你不能有选择性地选择语句来删除。

    JDBC - 数据流:

    PreparedStatement对象有能力使用提供参数数据的输入和输出流。这使您可以将整个文件到数据库中,可容纳较大的值,如CLOB和BLOB数据类型的列。

    有下列方法可用于流数据:

    1. setAsciiStream(): 此方法用于提供大的ASCII值。

    2. setCharacterStream(): 此方法用于提供大的UNICODE值。

    3. setBinaryStream(): 使用此方法,以提供大的二进制值。

    setXXXStream()方法需要一个额外的参数,文件大小,除了参数占位符。此参数通知应发送多少数据的数据库,使用流的驱动程序。

  [原文地址]: http://www.yiibai.com/jdbc/jdbc_quick_guide.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值