执行SQL语句的方式
1.1. 使用executeUpdate执行DDL和DML语句
- 执行DDL语句(主要用来处理数据库对象,包括create、drop、alter操作),返回0
- 执行DML语句(主要用来处理数据表里的数据,包括insert、update和delete操作),返回受影响的行数
1.2. 使用execute执行SQL语句
- 不推荐使用此方法,一般只在不清楚SQL语句类型时使用
- 返回值只能是boolean值,表明执行该SQL语句是否返回了ResultSet对象
- ResultSet getResultSet() throws SQLException:获取执行SQL语句后得到的ResultSet对象
- int getUpdateCount() throws SQLException:获取执行SQL语句所影响的记录行数
1.3. 使用PreparedStatement执行SQL语句
- 优点
- 预编译SQL语句,性能好
- 无须拼装SQL语句,编程简单
- 防止SQL注入,安全性更好
1.4. 使用CallableStatement调用存储过程
- void setXxx(String parameterName, Xxx value) throws SQLException:为传入参数设值
- void registerOutParameter(int parameterIndex, int sqlType) throws SQLException:为传出参数设值
- xxx getXxx(int parameterIndex) throws SQLException:获取指定传出参数的值
管理结果集
2.1. 可滚动、可更新的结果集- 以默认方式打开的结果集是不可更新的,如果希望创建可更新的结果集,必须在创建Statement或PreparedStatement时传入额外的参数
- resultSetType:控制ResultSet的类型
- ResultSet.TYPE_FORWARD_ONLY:该常量控制记录指针只能向前移动
- ResultSet.TYPE_SCROLL_INSENSITIVE:该常量控制记录指针可以自由移动(可滚动结果集),但底层数据的改变不会影响ResultSet的内容。
- ResultSet.TYPE_SCROLL_SENSITIVE:该常量控制记录指针可以自由移动(可滚动结果集),而且底层数据的改变会影响ResultSet的内容
- resultSetConcurrency:控制ResultSet的并发类型
- ResultSet.CONCUR_READ_ONLY:指示ResultSet是只读的并发模式(默认)
- ResultSet.CONCUR_UPDATABLE:指示ResultSet是可更新的并发模式
- resultSetType:控制ResultSet的类型
- 如果要创建可更新的结果集,查询语句查询的数据通常只能来自于一个数据表,而且查询结果集中的数据列必须包含主键列,否则将会引起更新失败
2.2. 处理Blob类型数据
- PreparedStatement.setBinaryStream(int parameterIndex, java.io.InputStream x, int length) throws SQLException:只能使用此方法来保存Blob类型的数据
2.3. 使用ResultSetMetaData分析结果集
- 通过ResultSet.getMetaData()方法来获取对应ResultSet的ResultSetMetaData对象
- 常用方法
- int getColumnCount() throws SQLException:返回该ResultSet的列数
- String getColumnName(int column) throws SQLException:返回指定索引的列名
- int getColumnType(int column) throws SQLException:返回指定索引的列类型
- 以默认方式打开的结果集是不可更新的,如果希望创建可更新的结果集,必须在创建Statement或PreparedStatement时传入额外的参数
事务处理
3.1. 事务的四大特性- 原子性
- 一致性
- 隔离性
- 持续性
3.2. 事务的组成
- 一组DML语句
- 一个DDL或者DCL语句,因为执行DDL和DCL语句都会导致事务立即提交,所以只能存在一个语句
3.3. 事务的提交方式
- 显示提交:使用commit
- 自动提交:执行DDL或DCL语句,或者程序正常退出
3.4. 事务的回滚方式
- 显式回滚:使用rollback
- 自动回滚:系统错误或强制退出
3.5. JDBC的事务支持
// 关闭自动提交,开启事务
conn.setAutoCommit(false);
/*
* 执行一系列的SQL语句,获取结果
*/
// 提交事务
conn.commit();
3.6. 在事务中可以设置中间点,可在回滚时指定程序回滚到哪个中间点
3.7. 批量更新
- 批量更新必须得到底层数据库的支持,可以通过调用 DatabaseMetaData的supportsBatchUpdates方法来查看底层数据库是否支持批量更新
- 一个批量更新应该当成一个事务来处理,即如果批量更新中出现异常则要回滚
- 创建Statement对象,然后使用此对象的addBatch方法将多条SQL语句同时收集起来,最后调用Statement对象的executeBatch方法来执行,返回值为 int[]