JDBC 数据类型
JDBC 驱动程序将 Java 数据类型转换为适当的 JDBC 类型,然后将其发送到数据库。它为大多数数据类型提供并保持了默认映射。例如 Java 的int 类型会被转换为 SQL 的INTEGER 类型。创建默认映射以提供到驱动程序时保持一致性。
下表归纳了当调用PreparedStatement、CallableStatement 和 ResultSet.updateXXX()方法的 setXXX()方法时,将 Java 数据类型转换为默认的 JDBC 数据类型。
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 |
通常情况下,我们能用 setXXX()方法将绝大多数的 Java 数据类型映射到 JDBC 的数据类型。
日期与时间的数据类型
在实际开发中,日期和时间与我们的业务是紧密联系的,很多情况下我们都需要记录时间。而在 JDBC 中,java.sql.Date 类映射 SQL DATE 类型,java.sql.Time 类和 java.sql.Timestamp 类也分别映射 SQL TIME 数据类型和 SQL TIMESTAMP 数据类型。
Java 中的 Date 类型
@Test
public void JavaDateTest(){
java.util.Date date = new java.util.Date();
String s = date.toString();
System.out.println(s);
// 时间戳
long time = date.getTime();
System.out.println(time);
}
输出
Wed Apr 26 08:31:33 CST 2023
1682469093337
SQL 中的 Date 类型
/**
这里是从数据库jdbcdata中的employees表中获取SQL中的Date数据类型
*/
@Test
public void DateTest(){
Connection conn = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
// 这是我自己实现的一个关于JDBC的工具类
conn = JDBCUtils.getJDBCConnection();
// SQL的Date,employees的hire_date属性是Date类型
String sql = "select hire_date from employees";
preparedStatement = conn.prepareStatement(sql);
resultSet = preparedStatement.executeQuery();
while (resultSet.next()){
// 获取SQL的Date类型
Date hire_date = resultSet.getDate("hire_date");
System.out.println(hire_date.toString());
}
}catch (Exception e){
e.printStackTrace();
}finally {
try {
JDBCUtils.closeResource(conn,preparedStatement,resultSet);
}catch (Exception e){
e.printStackTrace();
}
}
}
/**
* 通过java自带的Date类获取的时间戳进行转换
*/
@Test
public void DateTest2(){
java.util.Date date = new java.util.Date();
// 获取时间戳
long dateTime = date.getTime();
Date sqlDate = new Date(dateTime);
System.out.println(sqlDate.toString());
}
输出
1987-06-17
1989-09-21
1993-01-13
1990-01-03
1991-05-21
1997-06-25
1998-02-05
……
2023-04-26
SQL 中的 Time 类型
@Test
public void TimeTest(){
// SQL的time需要通过Java的Date进行转换,因此需要先得到Java的Date,才能通过JDBC将该Date转为SQL的对应的数据类型
java.util.Date date = new java.util.Date();
// 转换的本质是通过时间戳进行实现的
long time = date.getTime();
Time sqlTime = new Time(time);
System.out.println(sqlTime.toString());
}
输出
08:42:45
SQL 中的 TimeStamp 类型
@Test
public void timeStampTest(){
java.util.Date date = new java.util.Date();
long dateTime = date.getTime();
Timestamp timestamp = new Timestamp(dateTime);
System.out.println(timestamp.toString());
}
输出
2023-04-26 08:44:35.961
通过上述几个示例,我们可以总结出如何通过 Java 自带的 Date 类映射到 SQL(JDBC)的任何时间和日期类型:
- 获取 Java 自带的 Date 类的实例对象
- 通过该对象获取时间戳
- 通过时间戳和 JDBC,转换到 SQL 的 Date 类型、Time 类型和 TimeStamp 类型
null 值处理
在实际开发过程中,我们的数据库很多情况下会出现 null 值,在一些特定的场合下,null 值会对我们的数据处理造成一定影响,因此对于数据库中的 null 值处理就显得尤为重要了。
SQL 使用 NULL 值和 Java 使用 null 是不同的概念,实际上我们有三种策略来处理 Java 中的 SQL NULL 值:
- 避免使用返回原始数据类型的 getXXX()方法。
- 使用包装类的基本数据类型,并使用 ResultSet 对象的 wasNull()方法来测试收到 getXXX()方法返回的值是否为 null,如果是 null,该包装类变量则被设置为 null。
- 使用原始数据类型和 ResultSet 对象的 wasNull()方法来测试通过 getXXX()方法返回的值,如果是 null,则原始变量应设置为可接受的值来代表 NULL。
下面给出一个示例
@Test
public void nullTest() throws Exception{
/**
* employees表中中的commission_pct属性含有很多的null值,我们以这个为例
*/
Connection conn = JDBCUtils.getJDBCConnection();
String sql = "SELECT commission_pct FROM employees";
PreparedStatement preparedStatement = conn.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()){
double commission_pct = resultSet.getDouble("commission_pct");
if(resultSet.wasNull()){
// null值处理逻辑
System.out.println("null值被处理了");
}else{
// 正常处理
System.out.println(commission_pct);
}
}
JDBCUtils.closeResource(conn,preparedStatement,resultSet);
}