Java 基础知识之 JDBC(下)

简介: 语句Statement 用于执行 SQL,返回执行结果 ResultSet,主要分为三种,分别是 Statement、PreparedStatement、CallableStatement,下面分别加以介绍。

语句


Statement 用于执行 SQL,返回执行结果 ResultSet,主要分为三种,分别是 Statement、PreparedStatement、CallableStatement,下面分别加以介绍。


Statement


Statement 用于执行静态 SQL 语句,并返回其产生的结果。默认情况下每个 Statement 只能打开一个 ResultSet,如果存在打开的 ResultSet ,则再次执行语句会甘比当前的 ResultSet,Statement 提供的方法如下。


1. 执行单条 SQL


// 执行查询语句
ResultSet executeQuery(String sql) throws SQLException;
// 执行更新语句,第二个参数表示是否可以获取自动生成的键或者指定获取哪些自动生成的键
int executeUpdate(String sql) throws SQLException;
int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException;
int executeUpdate(String sql, int columnIndexes[]) throws SQLException;
int executeUpdate(String sql, String columnNames[]) throws SQLException;
// 执行普通的 sql,增删改查都可以,第二个参数指定执行更新语句后可以获取哪些自动生成的键
boolean execute(String sql) throws SQLException;
boolean execute(String sql, int autoGeneratedKeys) throws SQLException;
boolean execute(String sql, int columnIndexes[]) throws SQLException;
// 使用 #execute 方法执行查询语句后,可以调用该方法获取查询结果
ResultSet getResultSet() throws SQLException;
// 使用 #execute 方法执行更新语句后,可以调用该方法获取更新的记录数量
int getUpdateCount() throws SQLException;
// 执行 #executeQuery 或 #execute 方法后判断是否还有更多的结果集
boolean getMoreResults() throws SQLException;
// 获取更多的结果集
boolean getMoreResults(int current) throws SQLException;
// 调用 #executeUpdate 或 #execute 方法执行更新语句后获取自动生成的键
ResultSet getGeneratedKeys() throws SQLException;


2. 批量执行 SQL


// 将 sql 添加到批量待执行的列表
void addBatch( String sql ) throws SQLException;
// 清除待批量执行的 sql
void clearBatch() throws SQLException;
// 批量执行 sql
int[] executeBatch() throws SQLException;
// 获取更新的数量
default long getLargeUpdateCount() throws SQLException
// 设置/获取执行查询语句后生成的 ResultSet 最大包含的行数 
default void setLargeMaxRows(long max) throws SQLException
default long getLargeMaxRows() throws SQLException
// 批量执行 sql
default long[] executeLargeBatch() throws SQLException
// 批量执行更新语句
default long executeLargeUpdate(String sql) throws SQLException
default long executeLargeUpdate(String sql, int autoGeneratedKeys) throws SQLException
default long executeLargeUpdate(String sql, int columnIndexes[]) throws SQLException
default long executeLargeUpdate(String sql, String columnNames[]) throws SQLException


3. 其他方法


// 获取/设置执行查询语句生成的 ResultSet 中字符和二进制值的列的最大字节数
int getMaxFieldSize() throws SQLException;
void setMaxFieldSize(int max) throws SQLException;
// 获取执行查询语句生成的 ResultSet 中最大的行数
int getMaxRows() throws SQLException;
// 设置是否处理转义字符
void setEscapeProcessing(boolean enable) throws SQLException;
// 获取/设置查询超时秒数
int getQueryTimeout() throws SQLException;
void setQueryTimeout(int seconds) throws SQLException;
// 取消查询
void cancel() throws SQLException;
// 获取/清除当前语句执行产生的警告信息
SQLWarning getWarnings() throws SQLException;
void clearWarnings() throws SQLException;
// 设置游标名称
void setCursorName(String name) throws SQLException;
// 设置游标方向
void setFetchDirection(int direction) throws SQLException;
int getFetchDirection() throws SQLException;
// 设置数据库每次返回的记录条数
void setFetchSize(int rows) throws SQLException;
int getFetchSize() throws SQLException;
// 获取执行查询语句后生成的 ResultSet 的并发性、类型、保持性
int getResultSetConcurrency() throws SQLException;
int getResultSetType()  throws SQLException;
int getResultSetHoldability() throws SQLException;
// 获取当前语句对应的连接
Connection getConnection()  throws SQLException;
// 当前语句是否已经关闭
boolean isClosed() throws SQLException;
// 设置/获取当前语句是否被池化
void setPoolable(boolean poolable) throws SQLException;
boolean isPoolable() throws SQLException;
// 设置/获取当前语句依赖的 ResultSet 全部完毕后是否关闭当前语句
public void closeOnCompletion() throws SQLException;
public boolean isCloseOnCompletion() throws SQLException;


PreparedStatement


PreparedStatement 继承了 Statement,表示预编译 SQL 语句,SQL 会保存在 PreparedStatement 对象中从而可以多次执行。提供了大量用于设置 sql 参数的 set 方法,需要注意的是调用的 set 方法的参数的类型需要和数据库兼容。PreparedStatement 中常用的方法如下。


// 执行查询语句
ResultSet executeQuery() throws SQLException;
// 执行更新语句
int executeUpdate() throws SQLException;
// 清空当前的参数值
void clearParameters() throws SQLException;
// 执行 SQL语句,获取结果集可以调用 #getResultSet,获取更新行数可以调用 #getUpdateCount,判断是否还有结果集可以调用 #getMoreResults
boolean execute() throws SQLException;
// 将设置的参数添加到批量执行的命令中
void addBatch() throws SQLException;
// 执行批量更新
default long executeLargeUpdate() throws SQLException
// 获取结果集的元数据
ResultSetMetaData getMetaData() throws SQLException;
// 获取参数的元数据
ParameterMetaData getParameterMetaData() throws SQLException;
// 将指定的参数设置为 null
void setNull(int parameterIndex, int sqlType) throws SQLException;
/**
 * 将指定的参数设置为指定的值,值的类型需要和数据库兼容,Xxx 可取的值及对应的 JDBC 类型如下:
 * Boolean -> BIT 或 BOOLEAN
 * Byte -> TINYINT
 * Short -> SMALLINT
 * Int -> INTEGER
 * Long -> BIGINT
 * Float -> REAL
 * Double -> DOUBLE
 * 
 */
void setXxx(int parameterIndex, xxx x) throws SQLException;
/**
 * 将指定的参数设置为指定的值,值的类型需要和数据库兼容,Xxx 可取的值及对应的 JDBC 类型如下:
 * BigDecimal -> NUMERIC
 * String -> VARCHAR 或 LONGVARCHAR
 * Date -> DATE
 * Time -> TIME
 * Timestamp -> TIMESTAMP
 */
void setXxx(int parameterIndex, Xxx x) throws SQLException;
// 将指定的参数设置为字节数组值,发送到数据库时将转换为 VARBINARY 或 LONGVARBINARY
void setBytes(int parameterIndex, byte x[]) throws SQLException;
// 将指定的参数设置为给定的值,发送到数据库时将转换为对应的 SQL 类型
void setObject(int parameterIndex, Object x, int targetSqlType) throws SQLException;
void setObject(int parameterIndex, Object x) throws SQLException;


CallableStatement


CallableStatement 继承 PreparedStatement,是一个用于执行存储过程的接口,在 PreparedStatement 的基础上添加了注册和获取输出参数的方法,执行前注册输出参数,执行后就可以获取到输出参数的值。常用的方法如下。


// 注册输出参数
void registerOutParameter(int parameterIndex, int sqlType) throws SQLException;
void registerOutParameter(int parameterIndex, int sqlType, int scale) throws SQLException;
default void registerOutParameter(int parameterIndex, SQLType sqlType) throws SQLException
default void registerOutParameter(int parameterIndex, SQLType sqlType, int scale) throws SQLException
default void registerOutParameter(int parameterIndex, SQLType sqlType, String typeName) throws SQLException
default void registerOutParameter(String parameterName, SQLType sqlType) throws SQLException
default void registerOutParameter(String parameterName, SQLType sqlType, int scale) throws SQLException
default void registerOutParameter(String parameterName, SQLType sqlType, String typeName) throws SQLException 
// 检查上次调用 getXxx 方法获取的输出参数是否为 SQL null
boolean wasNull() throws SQLException;
// 获取输出参数,其中 XXX 可表示的类型包括 boolean、byte、double、float、int、long、short、Object、String、Date、Time、Timestamp、Array、BigDecimal 等
Xxx getXxx(int parameterIndex) throws SQLException;
Xxx getXxx(String parameterName) throws SQLException;
// 将指定参数设置为给定的值,XXX 可表示的类型包括 boolean、byte、double、float、int、long、short、Object、Date等
void setXxx(String parameterName, xxx x) throws SQLException;


结果集


ResultSet 是执行查询语句后生成的表示查询结果的数据表。它维护了一个指向当前数据行的游标,默认位于第一行之前,使用 #next 方法可以将光标移动到下一行,当没有更多行的时候返回 false。默认的 ResultSet 不能更新,游标只能向前移动,因此只能从第一行遍历到最后一行。ResultSet 提供了一些 getXxx 方法用于从当前行中获取列的值。在 JDBC 2.0 时,ResultSet 中添加了 一些 updateXxx 方法,用于更新当前行中的值。生成 ResultSet 的 Statement 关闭、执行新语句、获取下一个 ResultSet 时,当前 ResultSet 对象将会被关闭。具体涉及常用的方法如下。


1. 遍历记录的方法


// 将游标向前移动一行,默认游标在第一行之前,第一次调用会使第一行成为当前行,返回 false 时表示游标已经位于最后一行之后。
boolean next() throws SQLException;
// 获取当前行中列的值,Xxx 可取的类型包括 String、boolean、byte、short、int、long、float、double、Date、Time、Timestamp、Object 等,列的索引从1开始
Xxx getXxx(int columnIndex) throws SQLException;
// 获取当前行中列的值,Xxx 可取的类型包括 String、boolean、byte、short、int、long、float、double、Date、Time、Timestamp、Object 等,columnLabel 表示 列名或 as 语句指定的别名
Xxx getXxx(String columnLabel) throws SQLException;
// 根据列标签查询列索引
int findColumn(String columnLabel) throws SQLException;
// 游标是否在第一行之前
boolean isBeforeFirst() throws SQLException;
// 游标是否在最后一行之后
boolean isAfterLast() throws SQLException;
// 游标是否在第一行
boolean isFirst() throws SQLException;
// 游标是否在最后一行
boolean isLast() throws SQLException;
// 将游标移动到第一行之前
void beforeFirst() throws SQLException;
// 将游标移动到最后一行之后
void afterLast() throws SQLException;
// 将游标移动到第一行
boolean first() throws SQLException;
// 将游标移动到最后一行
boolean last() throws SQLException;
// 获取当前行号,行号从第一行开始
int getRow() throws SQLException;
// 移动游标到给定的行号
boolean absolute( int row ) throws SQLException;
// 移动游标到相对于当前行的给定行数的位置
boolean relative( int rows ) throws SQLException;
// 移动游标到上一行
boolean previous() throws SQLException;


2. 更新记录的方法


// 将给定列更新为空值
void updateNull(int columnIndex) throws SQLException;
// 将给定的列更新为给定的值,Xxx 可取的类型包括 Boolean、Byte、Short、Int、Long、Float、Double、BigDecimal、String、Date、Time、Timestamp、Object 等
void updateXxx(int columnIndex, xxx x) throws SQLException;
// 将给定的列更新为给定的值,Xxx 可取的类型包括 Boolean、Byte、Short、Int、Long、Float、Double、BigDecimal、String、Date、Time、Timestamp、Object 等
void updateXxx(String columnLabel, xxx x) throws SQLException;
// 将游标位置移动到插入行,插入行本质上是一个与可更新 ResultSet 关联的缓冲区
void moveToInsertRow() throws SQLException;
// 将游标移动到当前行,如果游标不在插入行则调用该方法无效
void moveToCurrentRow() throws SQLException;
// 将插入行的内容插入到当前 ResultSet 和数据库,调用此方法时游标需要位于插入行
void insertRow() throws SQLException;
// 将当前行从 ResultSet 和数据库中删除
void deleteRow() throws SQLException;
// 将当前行更新到数据库,位于插入行时不能调用该方法
void updateRow() throws SQLException;
// 使用当前行在数据库中的最新值更新当前行,位于插入行时不能调用该方法
void refreshRow() throws SQLException;
// 取消对当前行的更新,可以在调用 #updateNow 方法之前调用
void cancelRowUpdates() throws SQLException;
// 当前行是否已更新
boolean rowUpdated() throws SQLException;
// 当前行是否有插入
boolean rowInserted() throws SQLException;
// 当前行是否已经被删除
boolean rowDeleted() throws SQLException;


3. 其他方法


// 获取结果集的元数据, 如列的数量、类型、元数据等
ResultSetMetaData getMetaData() throws SQLException;
// 获取游标名称
String getCursorName() throws SQLException;
// 设置/获取游标的方向
void setFetchDirection(int direction) throws SQLException;
int getFetchDirection() throws SQLException;
// 获取 ResultSet 的类型
int getType() throws SQLException;
// 获取 ResultSet 的并发模式
int getConcurrency() throws SQLException;
// 获取生成该 ResultSet 的 Statement
Statement getStatement() throws SQLException;


总结

本篇主要对 JDBC 进行了简单的介绍,其他的内容如数据类型 JDBCType 或 异常 SQLException 等感兴趣的小伙伴可自行研究。JDBC 简化了对关系型数据库的操作,但是同时带来了样板式代码,各种持久层框架都在尝试对其简化,了解其底层的 API 是了解这些持久层框架的基础,后面的文章会尝试对 Mybatis 的底层实现进行解析。


目录
相关文章
|
4天前
|
SQL Java 关系型数据库
【前端学java】JDBC快速入门
【8月更文挑战第12天】JDBC快速入门
11 2
【前端学java】JDBC快速入门
|
5天前
|
Java 数据库连接 网络安全
JDBC数据库编程(java实训报告)
这篇文章是关于JDBC数据库编程的实训报告,涵盖了实验要求、实验环境、实验内容和总结。文中详细介绍了如何使用Java JDBC技术连接数据库,并进行增删改查等基本操作。实验内容包括建立数据库连接、查询、添加、删除和修改数据,每个部分都提供了相应的Java代码示例和操作测试结果截图。作者在总结中分享了在实验过程中遇到的问题和解决方案,以及对Java与数据库连接操作的掌握情况。
JDBC数据库编程(java实训报告)
|
11天前
|
SQL druid Java
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
35 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
|
11天前
|
SQL Java 关系型数据库
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(上)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
47 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(上)
|
6天前
|
SQL 存储 Java
完整java开发中JDBC连接数据库代码和步骤
该博客文章详细介绍了使用JDBC连接数据库的完整步骤,包括加载JDBC驱动、提供连接URL、创建数据库连接、执行SQL语句、处理结果以及关闭JDBC对象的过程,并提供了相应的示例代码。
|
11天前
|
SQL 关系型数据库 MySQL
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)
22 6
|
11天前
|
存储 关系型数据库 MySQL
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)(上)
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)
21 4
|
11天前
|
SQL 关系型数据库 MySQL
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)(中)
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)
18 3
|
5天前
|
SQL 存储 Java
完整java开发中JDBC连接数据库代码和步骤
该博客文章详细介绍了使用JDBC连接数据库的完整步骤,包括加载JDBC驱动、提供连接URL、创建数据库连接、执行SQL语句、处理结果以及关闭JDBC对象的过程,并提供了相应的示例代码。
|
22天前
|
SQL Java 数据库连接
什么是JDBC(Java Database Connectivity)?
JDBC(Java Database Connectivity)是Java语言用于连接和操作数据库的一个标准API。它提供了一种统一的方法来访问不同的数据库系统,使得Java程序能够与数据库进行交互,执行SQL语句,并处理查询结果。
16 0