- JDBC 教程
- JDBC - 首頁
- JDBC - 簡介
- JDBC - SQL 語法
- JDBC - 環境
- JDBC - 示例程式碼
- JDBC - 驅動程式型別
- JDBC - 連線
- JDBC - 語句
- JDBC - 結果集
- JDBC - 資料型別
- JDBC - 事務
- JDBC - 異常
- JDBC - 批處理
- JDBC - 儲存過程
- JDBC - 資料流
- JDBC - RowSet
- JDBC - 複製資料庫
- JDBC - ACID 屬性
- JDBC - 連線池
- JDBC 示例
- JDBC - 建立資料庫
- JDBC - 選擇資料庫
- JDBC - 刪除資料庫
- JDBC - 建立表
- JDBC - 刪除表
- JDBC - 插入記錄
- JDBC - 選擇記錄
- JDBC - 更新記錄
- JDBC - 刪除記錄
- JDBC - WHERE 子句
- JDBC - LIKE 子句
- JDBC - 資料排序
- JDBC 有用資源
- JDBC - 問答
- JDBC - 快速指南
- JDBC - 有用資源
- JDBC - 討論
- 有用 - Java 教程
JDBC - 資料型別
JDBC 驅動程式在將 Java 資料型別傳送到資料庫之前,會將其轉換為相應的 JDBC 型別。它對大多數資料型別使用預設對映。例如,Java int 將轉換為 SQL INTEGER。建立預設對映是為了在驅動程式之間提供一致性。
下表總結了呼叫 PreparedStatement 或 CallableStatement 物件的 setXXX() 方法或 ResultSet.updateXXX() 方法時,Java 資料型別轉換成的預設 JDBC 資料型別。
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 |
| XML | SQLXML | setSQLXML | updateSQLXML |
| ROWID | RowId | setRowId | updateRowId |
| DISTINCT | BigDecimal | setBigDecimal | updateBigDecimal |
| DATALINK | java.net.URL | setURL | updateURL |
| NCLOB | NClob | setNClob | updateNClob |
JDBC 3.0 增強了對 BLOB、CLOB、ARRAY 和 REF 資料型別的支援。ResultSet 物件現在具有 updateBLOB()、updateCLOB()、updateArray() 和 updateRef() 方法,使您可以直接操作伺服器上的相應資料。
setXXX() 和 updateXXX() 方法允許您將特定的 Java 型別轉換為特定的 JDBC 資料型別。setObject() 和 updateObject() 方法允許您將幾乎任何 Java 型別對映到 JDBC 資料型別。
ResultSet 物件為每種資料型別提供相應的 getXXX() 方法來檢索列值。每個方法都可以與列名或其序號位置一起使用。
獲取/設定 SQL 值的 ResultSet 方法
| SQL | JDBC/Java | setXXX | getXXX |
|---|---|---|---|
| VARCHAR | java.lang.String | setString | getString |
| CHAR | java.lang.String | setString | getString |
| LONGVARCHAR | java.lang.String | setString | getString |
| BIT | boolean | setBoolean | getBoolean |
| NUMERIC | java.math.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 |
| TIME | java.sql.Time | setTime | getTime |
| 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 |
| XML | SQLXML | setSQLXML | getSQLXML |
| ROWID | RowId | setRowId | getRowId |
| DISTINCT | BigDecimal | setBigDecimal | getBigDecimal |
| DATALINK | java.net.URL | setURL | getURL |
| NCLOB | NClob | setNClob | getNClob |
日期和時間資料型別
java.sql.Date 類對映到 SQL DATE 型別,java.sql.Time 和 java.sql.Timestamp 類分別對映到 SQL TIME 和 SQL TIMESTAMP 資料型別。
從 Java Util Date 和 Java SQL Date 物件獲取當前時間的示例
以下示例顯示 Date 和 Time 類如何格式化標準 Java 日期和時間值以匹配 SQL 資料型別要求。
package com.tutorialspoint;
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
}//end SqlDateTime
輸出
現在讓我們按照如下方式編譯上面的示例:
C:\>javac SqlDateTime.java C:\>
執行 **SqlDateTime** 時,它會產生以下結果:
C:\>java SqlDateTime The Java Date is:Fri Jun 07 09:38:32 IST 2024 The SQL DATE is: 2024-06-07 The SQL TIME is: 09:38:32 The SQL TIMESTAMP is: 2024-06-07 09:38:32.243 C:\>
處理 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;
}
int、float 和 varchar 資料型別
java.lang.String 類對映到 SQL VARCHAR 和其他基於文字的型別,而 java 原始型別可用於 SQL 原始型別,例如 int、float 等。
以下示例顯示如何設定 int、float、varchar SQL 資料型別以及如何相應地獲取資料。
讓我們首先建立一個名為 **Officers** 的新表,如下所示:
mysql> use TUTORIALSPOINT;
mysql> create table Officers
-> (
-> off_id int primary key auto_increment,
-> salary float not null,
-> name varchar (255),
-> dept varchar (255)
-> );
Query OK, 0 rows affected (0.08 sec)
mysql>
建立資料記錄
最後,您按照如下方式在 Officers 表中建立一些記錄:
mysql> INSERT INTO OFFICERS( NAME, SALARY, DEPT ) VALUES( 'Vijendra Singh', 30000.00, 'Accounts'); Query OK, 1 row affected (0.05 sec) mysql> INSERT INTO OFFICERS( NAME, SALARY, DEPT ) VALUES( 'Jeet Aagarwal', 40000.00, 'Management -1'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO OFFICERS( NAME, SALARY, DEPT ) VALUES( 'Gary Hayes', 20000.00, 'Software Engineer - 1'); Query OK, 1 row affected (0.00 sec) mysql>
從資料庫獲取數值和基於文字的值示例
在此示例中,我們有五個靜態字串,包含資料庫連線 url、使用者名稱、密碼、SELECT 查詢和 UPDATE 查詢。現在,使用 DriverManager.getConnection() 方法,我們準備了一個數據庫連線。連線準備就緒後,我們使用 connection.prepareStatement() 方法建立了一個 PreparedStatement 物件。現在,使用 statement.executeUpdate(),我們運行了更新查詢。最後,使用 statement.executeQuery(),執行 SELECT 查詢並將結果儲存在結果集中。現在迭代結果集並列印每條記錄以檢查更新的內容。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.PreparedStatement;
public class JDBCDataTypesExample {
static final String DB_URL = "jdbc:mysql:///TUTORIALSPOINT";
static final String USER = "guest";
static final String PASS = "guest123";
static final String QUERY = "SELECT off_id, name, salary, dept FROM Officers";
static final String UPDATE_QUERY ="UPDATE Officers set salary=? WHERE off_id=?";
public static void main(String args[]) {
// prepare the database connection and PreparedStatement using connection
try(Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
PreparedStatement pstmt = conn.prepareStatement(UPDATE_QUERY);
){
// set a float value
pstmt.setFloat( 1, (float)15000.00);
// set an int value
pstmt.setInt(2,2 );
// execute the update query
pstmt.executeUpdate();
System.out.println("Update successfully executed.....");
ResultSet rs = pstmt.executeQuery(QUERY);
System.out.println("-----------------------------------");
System.out.println("Showing results from updated table.....");
while(rs.next()){
// get the int value in int variable
int off_id = rs.getInt("off_id");
System.out.print(off_id + ",");
// get the varchar value in String variable
String name =rs.getString("name");
System.out.print(name + ",");
// get the float value in float variable
float sal = rs.getFloat("salary");
System.out.print(sal + ",");
String dept = rs.getString("dept");
System.out.print(dept +"\n");
}
System.out.print("------------------------------");
} catch( SQLException e){
e.printStackTrace();
}
}
}
輸出
現在讓我們按照如下方式編譯上面的示例:
C:\>javac JDBCDataTypesExample.java C:\>
執行 **JDBCDataTypesExample** 時,它會產生以下結果:
C:\>java JDBCDataTypesExample Update successfully executed..... ----------------------------------- Showing results from updated table..... 2,Vijendra Singh,15000.0,Accounts 3,Jeet Agarwal,40000.0,Management 1 4,Gary Hayes,20000.0, Software Engineer - 1 ------------------------------ C:\>
CLOB 和 BLOB 資料型別
java.sql.CLOB 類對映到 SQL CLOB 型別,java.sql.BLOB 類分別對映到 SQL BLOB 資料型別。
以下示例顯示 CLOB 和 BLOB 類如何格式化標準 Java 文字和二進位制值以匹配 SQL 資料型別要求。
讓我們首先建立一個名為 **JDBC_BLOB_CLOB** 的新表,如下所示:
mysql> use TUTORIALSPOINT;
mysql> create table JDBC_BLOB_CLOB
-> (
-> plain_text longtext,
-> name varchar (255),
-> image longblob
-> );
Query OK, 0 rows affected (0.08 sec)
mysql>
從資料庫獲取影像作為二進位制資料和文字作為 CLOB 的示例
在此示例中,我們有一個包含資料庫連線 url 的字串。現在,使用 DriverManager.getConnection() 方法,我們使用給定的使用者名稱和密碼準備了一個數據庫連線。連線準備就緒後,我們使用 connection.prepareStatement() 方法建立了一個 PreparedStatement 物件。我們使用 FileReader 物件讀取文字檔案內容,使用 InputStream 讀取影像檔案內容。
使用 PreparedStatement.setClob() 方法,我們為 CLOB 欄位設定 fileReader,並使用 PreparedStatement.setBlob() 方法為 BLOB 欄位設定 InputStream。現在,使用 statement.execute(),我們運行了插入查詢。最後,使用 statement.executeQuery(),執行 SELECT 查詢並將結果儲存在結果集中。現在迭代結果集並列印每條記錄以檢查更新的內容。
ResultSet.getClob() 方法用於讀取 CLOB 變數中的值,ResultSet.getBlob() 方法用於讀取 BLOB 變數中的值。使用 CLOB.getCharacterStream(),檢索一個讀取器,然後將其用於將 CLOB 的內容寫入 txt 格式的檔案。使用 BLOB.getBinaryStream() 方法,檢索一個流,然後將其用於將 BLOB 的內容寫入 jpg 格式的影像檔案。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.Reader;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBCDataTypesExample {
public static void main(String args[]) throws Exception {
//Getting the connection
String mysqlUrl = "jdbc:mysql:///TUTORIALSPOINT";
Connection con = DriverManager.getConnection(mysqlUrl, "guest", "guest123");
System.out.println("Connection established......");
//Inserting values
String query = "INSERT INTO JDBC_BLOB_CLOB(Name, PLAIN_TEXT, IMAGE) VALUES (?, ?, ?)";
PreparedStatement pstmt = con.prepareStatement(query);
pstmt.setString(1, "ClOB_BLOB Example");
FileReader fileReader = new FileReader("C:\\Users\\Saikat\\OneDrive\\Documents\\mysql_create_table.txt");
pstmt.setClob(2, fileReader);
InputStream inputStream = new FileInputStream("C:\\Users\\Saikat\\OneDrive\\Documents\\saikat_upwork1.jpg");
pstmt.setBlob(3, inputStream);
pstmt.execute();
System.out.println("Record inserted......");
//Retrieving the results
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * from jdbc_blob_clob");
while(rs.next()) {
String name = rs.getString("Name");
Clob clob = rs.getClob("plain_text");
Blob blob = rs.getBlob("image");
System.out.println("Name: "+name);
System.out.println("Clob value: "+clob);
System.out.println("Blob value: "+blob);
System.out.println("");
System.out.print("Clob data is stored at: ");
//Storing clob to a file
int i = 0;
Reader r = clob.getCharacterStream();
String filePath = "C:\\Users\\Saikat\\clob_output_mysql_create_table.txt";
FileWriter writer = new FileWriter(filePath);
while ((i=r.read())!=-1) {
writer.write(i);
}
writer.close();
System.out.println(filePath);
System.out.print("Blob data is stored at: ");
InputStream is = blob.getBinaryStream();
byte byteArray[] = new byte[is.available()];
is.read(byteArray);
filePath = "C:\\Users\\Saikat\\output_saikat_upwork1.jpg";
FileOutputStream outPutStream = new FileOutputStream(filePath);
outPutStream.write(byteArray);
System.out.println(filePath);
}
}
}
輸出
現在讓我們按照如下方式編譯上面的示例:
C:\>javac JDBCDataTypesExample.java C:\>
執行 **JDBCDataTypesExample** 時,它會產生以下結果:
C:\>java JDBCDataTypesExample Connection established...... Record inserted..... 1. Name: ClOB_BLOB Example Clob value: com.mysql.cj.jdbc.Clob@db57326 Blob value: com.mysql.cj.jdbc.Blob@34a875b3 Clob data is stored at: C:\Users\Saikat\clob_output_mysql_create_table.txt Blob data is stored at: C:\Users\Saikat\output_saikat_upwork1.jpg Name: ClOB_BLOB Example Clob value: com.mysql.cj.jdbc.Clob@1a6c1270 Blob value: com.mysql.cj.jdbc.Blob@18a136ac Clob data is stored at: C:\Users\Saikat\clob_output_mysql_create_table.txt Blob data is stored at: C:\Users\Saikat\output_saikat_upwork1.jpg C:\>