zoukankan      html  css  js  c++  java
  • JDBC简介

    Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法

    API概述

    JDBC API主要位于JDK中的java.sql包中(之后扩展的内容位于javax.sql包中),主要包括(斜体代表接口,需驱动程序提供者来具体实现):

    • DriverManager:负责加载各种不同驱动程序(Driver),并根据不同的请求,向调用者返回相应的数据库连接(Connection)。
    • Driver:驱动程序,会将自身加载到DriverManager中去,并处理相应的请求并返回相应的数据库连接(Connection)。
    • Connection:数据库连接,负责进行与数据库间的通讯,SQL执行以及事务处理都是在某个特定Connection环境中进行的。可以产生用以执行SQL的Statement。
    • Statement:用以执行SQL查询和更新(针对静态SQL语句和单次执行)。
    • PreparedStatement:用以执行包含动态参数的SQL查询和更新(在服务器端编译,允许重复执行以提高效率)。
    • CallableStatement:用以调用数据库中的存储过程。
    • SQLException:代表在数据库连接的创建和关闭和SQL语句的执行过程中发生了例外情况(即错误)。
    SQL类型 Java类型
    CHAR java.lang.string
    VARCHAR java.long.string
    LONGVARCHAR java.lang.String
    NUMERIC java.math.BigDecimal
    DECIMAL java.math.BigDecimal
    BIT boolean
    TINYINT byte
    SMALLINT short
    INTEGER int
    BIGINT long
    REAL float
    FLOAT double
    DOUBLE double
    BINARY byte[]
    VARBINARY byte[]
    LONGVARBINARY byte[]
    DATE java.sql.Date
    TIME java.sql.Time
    TIMESTAMP java.sql.Timestamp
    BLOB java.sql.Blob
    CLOB java.sql.Clob
    Array java.sql.Array
    REF java.sql.Ref
    Struct java.sql.Struct

    例子

    利用Class.forName()方法来加载JDBC驱动程序(Driver)至DriverManager:

    Class.forName( "com.somejdbcvendor.TheirJdbcDriver" );
    

    然后,从DriverManager中,通过JDBC URL,用户名,密码来获取相应的数据库连接(Connection):

    Connection conn = DriverManager.getConnection( 
          "jdbc:somejdbcvendor:other data needed by some jdbc vendor", // URL
          "myLogin", // 用户名
          "myPassword" ); // 密码

    不同的JDBC驱动程序的URL是不同的,它永远以“jdbc:”开始,但后面的内容依照驱动程序类型不同而各异。在获取Connection之后,便可以创建Statement用以执行SQL语句。下面是一个插入(INSERT)的例子:

     Statement stmt = conn.createStatement();
     stmt.executeUpdate( "INSERT INTO MyTable( name ) VALUES ( 'my name' ) " );

    查询(SELECT)的结果存放于结果集(ResultSet)中,可以按照顺序依次访问:

     Statement stmt = conn.createStatement();
     ResultSet rs = stmt.executeQuery( "SELECT * FROM MyTable" );
     while ( rs.next() ) {
         int numColumns = rs.getMetaData().getColumnCount();
         for ( int i = 1 ; i <= numColumns ; i++ ) {
            // 与大部分Java API中下标的使用方法不同,字段的下标从1开始
            // 当然,还有其他很多的方式(ResultSet.getXXX())获取数据
            System.out.println( "COLUMN " + i + " = " + rs.getObject(i) );
         }
     }
     rs.close();
     stmt.close();

    但是,通常,Java程序员们更倾向于使用PreparedStatement。下面的例子使用上例中的conn对象:

    PreparedStatement ps = null;
     ResultSet rs = null;
     try {
     ps = conn.prepareStatement( "SELECT i.*, j.* FROM Omega i, Zappa j
          WHERE i = ? AND j = ?" );
     // 使用问号作为参数的标示
    
     // 进行参数设置
     // 与大部分Java API中下标的使用方法不同,字段的下标从1开始,1代表第一个问号
     // 当然,还有其他很多针对不同类型的类似的PreparedStatement.setXXX()方法
     ps.setString(1, "Poor Yorick");
     ps.setInt(2, 8008);
    
     // 结果集
     rs = ps.executeQuery();
     while ( rs.next() ) {
         int numColumns = rs.getMetaData().getColumnCount();
         for ( int i = 1 ; i <= numColumns ; i++ ) {
            // 与大部分Java API中下标的使用方法不同,字段的下标从1开始
            // 当然,还有其他很多的方式(ResultSet.getXXX())获取数据
            System.out.println( "COLUMN " + i + " = " + rs.getObject(i) );
         }
    
     }
     catch (SQLException e) {
      // 异常处理
     }
     finally { // 使用finally进行资源释放
      try {
       rs.close();
       ps.close();
      } catch( SQLException e){} // 异常处理:忽略close()时的错误
     }

    如果数据库操作失败,JDBC将抛出一个SQLException。一般来说,此类异常很少能够恢复,唯一能做的就是尽可能详细的打印异常日记。推荐的做法是将SQLException翻译成应用程序领域相关的异常(非强制处理异常)并最终回滚数据库和通知用户。

    boolean autoCommitDefault = conn.getAutoCommit();
    try {
        conn.setAutoCommit(false);
    
        /* 在此基于有事务控制的conn执行你的代码 */
    
        conn.commit();
    } catch (Throwable e) {
        try { conn.rollback(); } catch (Throwable ignore) {}
        throw e;
    } finally {
        try { conn.setAutoCommit(autoCommitDefault); } catch (Throwable ignore) {}
    }
  • 相关阅读:
    使用BigQuery分析GitHub上的C#代码
    ASP.NET Core 处理 404 Not Found
    C# 7 局部函数剖析
    调试 ASP.NET Core 2.0 源代码
    Entity Framework Core Like 查询揭秘
    ASP.NET Core Razor 视图组件
    Thread 1 cannot allocate new log引起的宕机事故(转载)
    docker默认网段和主机网段冲突解决
    docker安装异常以及网络问题总结
    max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
  • 原文地址:https://www.cnblogs.com/haxianhe/p/9271042.html
Copyright © 2011-2022 走看看