Java有一個數(shù)據(jù)類型系統(tǒng),例如,int,long,float,double,string。
數(shù)據(jù)庫系統(tǒng)也有一個類型系統(tǒng),如int,char,varchar,text,blob,clob。
JDBC驅(qū)動程序可以將Java數(shù)據(jù)類型來回轉(zhuǎn)換為適當?shù)臄?shù)據(jù)庫類型。
下表列出了缺省數(shù)據(jù)庫數(shù)據(jù)類型和Java數(shù)據(jù)類型映射。
當從PreparedStatement或CallableStatement對象或ResultSet.updateXXX()/getXXX()方法調(diào)用setXXX()方法時,將使用該映射。
SQL | JDBC / Java | setXXX | setXXX... | updateXXX |
---|---|---|---|---|
VARCHAR | java.lang.String | setString | getString | updateString |
CHAR | java.lang.String | setString | getString | updateString |
LONGVARCHAR | java.lang.String | setString | updateString | |
BIT | boolean | setBoolean | getBoolean | updateBoolean |
NUMERIC | java.math.BigDecimal | setBigDecimal | getBigDecimal | updateBigDecimal |
TINYINT | byte | setByte | getByte | updateByte |
SMALLINT | short | setShort | getShort | updateShort |
INTEGER | int | setInt | getInt | updateInt |
BIGINT | long | setLong | getLong | updateLong |
REAL | float | setFloat | getFloat | updateFloat |
FLOAT | float | setFloat | getFloat | updateFloat |
DOUBLE | double | setDouble | getDouble | updateDouble |
VARBINARY | byte [] | setBytes | getBytes | updateBytes |
BINARY | byte[] | setBytes | getBytes | updateBytes |
DATE | java.sql.Date | setDate | getDate | updateDate |
TIME | java.sql.Time | setTime | getTime | updateTime |
TIMESTAMP | java.sql.Timestamp | setTimestamp | getTimestamp | updateTimestamp |
CLOB | java.sql.Clob | setClob | getClob | updateClob |
BLOB | java.sql.Blob | setBlob | getBlob | updateBlob |
ARRAY | java.sql.Array | setARRAY | getARRAY | updateARRAY |
REF | java.sql.Ref | setRef | getRef | updateRef |
STRUCT | java.sql.Struct | setStruct | getStruct | updateStruct |
以下示例顯示如何轉(zhuǎn)換Java日期和時間類以匹配SQL數(shù)據(jù)類型。
public class Main { public static void main(String[] args) { java.util.Date javaDate = new java.util.Date(); long javaTime = javaDate.getTime(); System.out.println("The Java Date is:" + javaDate.toString()); // SQL DATE java.sql.Date sqlDate = new java.sql.Date(javaTime); System.out.println("The SQL DATE is: " + sqlDate.toString()); // SQL TIME java.sql.Time sqlTime = new java.sql.Time(javaTime); System.out.println("The SQL TIME is: " + sqlTime.toString()); // SQL TIMESTAMP java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(javaTime); System.out.println("The SQL TIMESTAMP is: " + sqlTimestamp.toString()); } }
上面的代碼生成以下結果。
SQL使用NULL值表示空,而Java空表示沒有分配內(nèi)存。
要正確處理來自數(shù)據(jù)庫的NULL值,我們應該避免使用返回原始數(shù)據(jù)類型的getXXX()方法。由于JDBC驅(qū)動程序可能將NULL值轉(zhuǎn)換為0,并且我們可能在同一列中具有0值。
或者我們可以使用ResultSet中的wasNull()方法來檢查該值是否為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; // or -1 }
Oracle數(shù)據(jù)庫中的簡單表腳本。
CREATE TABLE Person ( USER_ID NUMBER (5) NOT NULL, USERNAME VARCHAR2 (20) NOT NULL, CREATED_BY VARCHAR2 (20) NOT NULL, CREATED_DATE DATE NOT NULL, PRIMARY KEY ( USER_ID ) )
使用PreparedStatement
中的setTimestamp
將Timestamp插入到數(shù)據(jù)庫。
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; public class Main { private static final String DB_DRIVER = "oracle.jdbc.driver.OracleDriver"; private static final String DB_CONNECTION = "jdbc:oracle:thin:@localhost:1521:YourDatabase"; private static final String DB_USER = "user"; private static final String DB_PASSWORD = "password"; public static void main(String[] argv) throws Exception { Class.forName(DB_DRIVER); Connection dbConnection = DriverManager.getConnection(DB_CONNECTION, DB_USER, DB_PASSWORD); PreparedStatement preparedStatement = null; java.util.Date today = new java.util.Date(); String insertTableSQL = "INSERT INTO DBUSER" + "(USER_ID, USERNAME, CREATED_BY, CREATED_DATE) VALUES" + "(?,?,?,?)"; preparedStatement = dbConnection.prepareStatement(insertTableSQL); preparedStatement.setTimestamp(4,new java.sql.Timestamp(today.getTime())); dbConnection.commit(); dbConnection.close(); } }
或者我們可以使用 setDate
方法。
java.util.Date today = new java.util.Date(); preparedStatement.setDate(4, new java.sql.Date(today.getTime()));
更多建議: