- 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://127.0.0.1/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://127.0.0.1/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:\>