- 定义
JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据。JDBC代表Java DataBase Connection。
- JDBC架构
JDBC API支持两层和三层处理模型进行数据库访问,但在一般的JDBC体系结构由两层组成:
- JDBC API: 提供了应用程序对JDBC的管理连接。
- JDBC Driver API: 支持JDBC管理到驱动器连接。
- JDBC API的使用驱动程序管理器和数据库特定的驱动程序提供透明的连接到异构数据库。
- JDBC驱动程序管理器可确保正确的驱动程序来访问每个数据源。该驱动程序管理器能够支持连接到多个异构数据库的多个并发的驱动程序。
主要接口和类:
- DriverManager: 这个类管理数据库驱动程序的列表。确定内容是否符合从Java应用程序使用的通信子协议正确的数据库驱动程序的连接请求。识别JDBC在一定子协议的第一个驱动器将被用来建立数据库连接。
- Driver: 此接口处理与数据库服务器通信。很少直接使用驱动程序(Driver)对象,一般使用
DriverManager
中的对象,它用于管理此类型的对象。它也抽象与驱动程序对象工作相关的详细信息 - Connection : 此接口与接触数据库的所有方法。连接对象表示通信上下文,即,与数据库中的所有的通信是通过此唯一的连接对象。
- Statement : 可以使用这个接口创建的对象的SQL语句提交到数据库。一些派生的接口接受除执行存储过程的参数。
- ResultSet: 这些对象保存从数据库后,执行使用
Statement
对象的SQL查询中检索数据。它作为一个迭代器,可以通过移动它来检索下一个数据。 - SQLException: 这个类用于处理发生在数据库应用程序中的任何错误。
- 步骤
- 打开一个连接
使用DriverManager.getConnection()方法来创建一个Connection对象,它代表一个数据库的物理连接,如下所示:
try {
//载入驱动程序
Class.forName("com.mysql.jdbc.Driver");
//问好之后的事情可以使java与数据库的编码相同
String url = "jdbc:mysql://localhost:3306/blobsystem?useUnicode=true&characterEncoding=utf8";
//连接
String user = "root";
String password = "";
conn = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
System.out.println("连接失败");
}
- 执行一个查询
需要使用一个类型为Statement或PreparedStatement的对象,并提交一个SQL语句到数据库执行查询。如下:
Statement stmt = conn.createStatement();
String sql = "SELECT id, first, last, age FROM Employees";
ResultSet rs = stmt.executeQuery(sql);
如果要执行一个SQL语句:UPDATE,INSERT或DELETE语句,那么需要下面的代码片段(PreparedStatement):
PreparedStatement psmt = con.prepareStatement(sql);
psmt.executeUpdate();
进行数据库插入操作的时候使用 PreparedStatement 更好,好处如下:
- 1.PreparedStatement可以写动态参数化的查询;
- 2.PreparedStatement比 Statement 更快;
- 3.PreparedStatement可以防止SQL注入式攻击
- 从结果集中提取数据
这一步中演示如何从数据库中获取查询结果的数据。可以使用适当的ResultSet.getXXX()方法来检索的数据结果如下:
ResultSet rs = stm.executeQuery(sql);
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");
}
- JDBC批量处理
批处理允许执行一个批处理组相关的SQL语句,并将其一次提交到数据库中执行。当几个SQL语句一次发送到数据库中时,可以减少通信开销,从而提高性能。
- JDBC驱动程序不支持此功能。您应该使用DatabaseMetaData.supportsBatchUpdates()方法来确定目标数据库支持批量更新处理。如果JDBC驱动程序支持此功能,则该方法返回true。
- addBatch()方法是PreparedStatement和CallableStatementis类中用于添加单个语句的批处理的声明。 executeBatch()将所有语句组合到一起并执行。
- executeBatch()将返回一个整数数组,每个数组元素的表示为相应的更新语句的更新计数。
- 添加语句进行批处理时,可以使用clearBatch()方法删除它们。此方法将删除addBatch()方法添加的所有语句。但是不能有选择性地选择某个语句来删除。
- SQL数据类型与JAVA数据类型对应关系:
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 |
- 使用实例:
见项目JDBCTest
一些需要注意的地方:
增删改的PreparedStatement执行语句为:
int i = ps.executeUpdate();
查因为不需要更新,而且返回的是结果集,所以执行语句为:
ResultSet rs=ps.executeQuery();
结果集如果没有查询到任何结果,rs.getMetaData().getColumnCount();获得的行数也为1,所以遍历结果集,i要从1开始。