处理 Java 应用程序中不同数据库的访问问题:可以通过它建立与数据库的连接;定义特定的客户端使之可以访问给定的数据库;提供一种能够读取、插入、更新和删除数据库中的数据项的机制;以及控制由不同SQL语句组成的事务。
- 创建并建立与特定数据库的连接
- 通过 Driver Manger 连接(
java.sql.DriveManager
) - 通过 JDBC 数据源连接池 连接(
javax.sql.DataSource
)
- 通过 Driver Manger 连接(
- 建立连接后使用
java.sql.Connection
执行 CRUD(create/read/update/delete)操作- 为了执行这些操作,可以使用
java.sql.Statement
对象或java.sql.PreparedStatement
对象。预编译对象java.sql.PreparedStatement
对于多次执行相同的语句效率会高一些,且预编译机制可以阻止 SQL 注入
- 为了执行这些操作,可以使用
通常情况下,JDBC 使用连接池来管理数据库连接。连接池有很多不同的实现方式,比如 C3P0 或 DBCP。数据库连接池是一组 JDBC 连接,当应用程序请求连接时,它会分配一个空闲连接;当应用中有任务终结时,它会释放相应的连接。
JDBC 在使用 Java 程序中的数据之前,JDBC 会将 Java 数据类型转换成相对应的 JDBC 数据类型,它们之间有一个默认的对应关系,能够保证在不同的数据库实现和驱动之间的一致性。
SQL | JDBC/Java | setter | getter |
---|---|---|---|
VARCHAR | java.lang.String | setString | getString |
CHAR | java.lang.String | setString | getString |
LONGVARCHAR | java.lang.String | setString | getString |
BIT | boolean | setBoolean | getBoolean |
NUMERIC | 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 |
DATETIME | java.sql.Timestamp | setTimestamp | getTimestamp |
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 |
SQL 和 Java 对于空值(null)有不同的处理方式。在使用SQL处理一些Java 中的空值时,我们最好能够遵循一些最佳实践,比如避免使用基本数据类型,因为它们默认值不能为空而是会依据具体类型设定默认值,比如int型默认值为0、布尔型(boolean)默认值为false,建议使用包装类
-
字段类型为
Date
使用java.sql.Date.valueOf(java.lang.String)
格式是 YYYY-MM-ddps.setDate(2, java.sql.Date.valueOf("2019-03-04")); // 设置为当前日期 // 方式一: ps.setDate(2, new java.sql.Date(System.currentTimeMillis())); // 方式二: ps.setDate(2, new java.sql.Date(new Date().getTime());
-
字段类型为
TIMESTAMP
或DATETIME
使用java.sql.Timestamp.valueOf(java.lang.String)
ps.setTimestamp(2, java.sql.Timestamp.valueOf("2019-03-04 13:30:00"); // 设置为当前时间 // 方式一: ps.setTimestamp(2, new java.sql.Timestamp(new Date().getTime())); // 方式二: ps.setTimestamp(2, new java.sql.Timestamp(System.currentTimeMillis())); // Java 8 ps.setTimestamp(2, java.sql.Timestamp.from(java.time.Instant.now())); ps.setTimestamp(2, java.sql.Timestamp.valueOf(java.time.LocalDateTime.now())); LocalDate localDate = LocalDate.now(ZoneId.of("Asia/Shanghai")); ps.setObject(1, localDate);
JDBC 驱动管理器 java.sql.DriverManager
的主要功能就是:获取当前可用的驱动列表;处理特定的的驱动程序和数据库之间的连接。
- registerDriver() : 需要保证驱动程序在编译时就是可用的
- Class.forName() 推荐使用 : 不需要驱动程序在编译时是可用的