-  JDBC驱动程序将Java数据类型转换成适当的JDBC类型,然后将其发送给数据库。它为大多数数据类型提供并使用默认映射。例如,Java int 类型会被转换成SQL INTEGER。创建默认映射以提供到驱动程序时保持一致性。

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

SQL类型JDBC/Java类型setXXXupdateXXX
VARCHARjava.lang.StringsetStringgetString
CHARjava.lang.StringsetStringgetString
LONGVARCHARjava.lang.StringsetStringgetString
BITbooleansetBooleangetBoolean
NUMERICjava.math.BigDecimalsetBigDecimalgetBigDecimal
TINYINTbytesetBytegetByte
SMALLINTshortsetShortgetShort
INTEGERintsetIntgetInt
BIGINTlongsetLonggetLong
REALfloatsetFloatgetFloat
FLOATfloatsetFloatgetFloat
DOUBLEdoublesetDoublegetDouble
VARBINARYbyte[ ]setBytesgetBytes
BINARYbyte[ ]setBytesgetBytes
DATEjava.sql.DatesetDategetDate
TIMEjava.sql.TimesetTimegetTime
TIMESTAMPjava.sql.TimestampsetTimestampgetTimestamp
CLOBjava.sql.ClobsetClobgetClob
BLOBjava.sql.BlobsetBlobgetBlob
ARRAYjava.sql.ArraysetARRAYgetARRAY
REFjava.sql.RefSetRefgetRef
STRUCTjava.sql.StructSetStructgetStruct

-  JDBC3.0增强了对BLOB,CLOB,ARRAY和REF数据类型的支持。ResultSet对象现在具有updateBLOB(),updateCLOB(),updateArray()和updateRef()方法,使能够直接操作数据库服务器上的相应数据

-  setXXX()和updateXXX()方法将特定的Java类型转换成特定的JDBC数据类型。

-  setObject()和updateObject()方法可以将几乎任何Java类型映射到JDBC数据类型。

-  ResultSet对象为每个数据类型提供相应的getXXX()方法来检索列值。每个方法都可以使用列名或者其序数位置来检索列值。

SQL类型JDBC/Java类型setXXXupdateXXX
VARCHARjava.lang.StringsetStringgetString
CHARjava.lang.StringsetStringgetString
LONGVARCHARjava.lang.StringsetStringgetString
BITbooleansetBooleangetBoolean
NUMERICjava.math.BigDecimalsetBigDecimalgetBigDecimal
TINYINTbytesetBytegetByte
SMALLINTshortsetShortgetShort
INTEGERintsetIntgetInt
BIGINTlongsetLonggetLong
REALfloatsetFloatgetFloat
FLOATfloatsetFloatgetFloat
DOUBLEdoublesetDoublegetDouble
VARBINARYbyte[ ]setBytesgetBytes
BINARYbyte[ ]setBytesgetBytes
DATEjava.sql.DatesetDategetDate
TIMEjava.sql.TimesetTimegetTime
TIMESTAMPjava.sql.TimestampsetTimestampgetTimestamp
CLOBjava.sql.ClobsetClobgetClob
BLOBjava.sql.BlobsetBlobgetBlob
ARRAYjava.sql.ArraysetARRAYgetARRAY
REFjava.sql.RefSetRefgetRef
STRUCTjava.sql.StructSetStructgetStruct



1、日期和时间数据类型

-  java.sql.Date类映射到SQL DATE类型,java.sql.Time和java.sql.Timestamp类分别映射到SQL TIME和SQL TIMESTAMP数据类型。

-  以下示例显示了Date和Time类如何格式化为标准Java日期和时间值以匹配SQL数据类型要求。

import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.*;

public class SqlDateTime {
   public static void main(String[] args) {
      //Get standard date and time
      java.util.Date javaDate = new java.util.Date();
      long javaTime = javaDate.getTime();
      System.out.println("The Java Date is:" + 
             javaDate.toString());

      //Get and display SQL DATE
      java.sql.Date sqlDate = new java.sql.Date(javaTime);
      System.out.println("The SQL DATE is: " + 
             sqlDate.toString());

      //Get and display SQL TIME
      java.sql.Time sqlTime = new java.sql.Time(javaTime);
      System.out.println("The SQL TIME is: " + 
             sqlTime.toString());
      //Get and display SQL TIMESTAMP
      java.sql.Timestamp sqlTimestamp =
      new java.sql.Timestamp(javaTime);
      System.out.println("The SQL TIMESTAMP is: " + 
             sqlTimestamp.toString());
     }//end main
}

-  编译并执行上面代码,得到以下结果:

The Java Date is:Wed May 31 23:54:57 CST 2017
The SQL DATE is: 2017-05-31
The SQL TIME is: 23:54:57
The SQL TIMESTAMP is: 2017-05-31 23:54:57.937



2、处理NULL值

-  SQL使用NULL值和Java使用null是不同的概念。所以,要在Java中处理SQL NULL值,可以使用三种策略。

-  避免使用返回原始数据类型的getXXX()方法

-  对原始数据类型使用包装类,并使用ResultSet对象的wasNull()方法来测试接收getXXX()方法的返回值的包装器类变量是否应该设置为null。

-  使用原始数据类型和ResultSet对象的wasNull()方法来测试接收到由getXXX()方法返回的值的原始变量是否应设置为表示NULL的可接受值。

-  下面是一个用来处理NULL值的例子:

Statement stmt = conn.createStatement( );
String sql = "SELECT id, first, last, age FROM Employees";
ResultSet rs = stmt.executeQuery(sql);

int id = rs.getInt(1);
if( rs.wasNull( ) ) {
   id = 0;
}