java_第一年_JDBC(3)
事务
我们在通过JDBC连接数据库并开始交互时,默认情况下是自动提交的,有时由于为了保持业务流程的完整性、提高性能或是使用分布式事务,需要启动支持事务,此时的方法是调用Connection对象的setAutoCommit();传递布尔值false关闭默认自动提交:
conn.setAutoCommit(false);
提交事务:
conn.setAutoCommit();
数据库回滚操作:
conn.rollback();
配合数据库的回滚,我们可以先设置保存点,通过Connection对象的方法setSavepoint(String savepointName)可以定义新的保存点、releaseSavepoint(Savepoint savepointName)可以删除保存点;通过以下实例加深理解:
try{
conn.setAutoCommit(false);
stmt = conn.createStatement();
Savepoint savepoint1 = conn.setSavepoint("DELETED_1");
String SQL = "DELETE FROM employees WHERE ID =100";
stmt.executeUpdate(SQL);
conn.rollback(savepoint1);
Savepoint savepoint2 = conn.setSavepoint("DELETED_2");
SQL = "DELETE FROM employees WHERE ID =101";
stmt.executeUpdate(SQL);
conn.commit();
}catch(SQLException e){
e.printStackTrace();
}
异常
对于JDBC,要处理的异常最常见的是java.sql.SQLException。
发生异常后会将其重定向catch子句中,如果没有相应的catch子句在,则程序的执行会结束。
处理异常有以下方法:

批量处理SQL语句
需要先使用DatabaseMeteData.supportsBatchUpdates()方法来确认目标数据库是否支持批量处理,若支持则会返回true;
通过交互对象Statement中的addBatch()增加SQL语句,然后通过executeBatch()方法来批量处理,其返回一个整数数组,每个元素是相应更新语句的更新计数;可以使用clearBatch()方法来删除SQL语句,会将所有addBatch()增加的语句都删除,没法删除指定的语句
Statement stmt = conn.createStatement();
conn.setAutoCommit(false);
String SQL = "INSERT INTO employees (id,age,first,last) VALUES(200,30,'ZHAO','XIAO')";
stmt.addBatch(SQL);
String SQL = "INSERT INTO employees (id,age,first,last) VALUES(201,35,'JIA','XIAO')";
stmt.addBatch(SQL);
int[] count = stmt.executeBatch();
conn.commit
获取自动生成的主键:
通常我们在应用中对mysql执行了insert操作后,需要获取插入记录的自增主键,这时候通常用getGeneratedKeys()方法获取主键
1. 获得数据库返回的主键
insert into book values(null,'编程珠玑',45);
2. 获得主键的步骤
conn.prepareStatement(sql,autoGeneratedKeys)
autoGeneratedKeys是一个int值 ,1代表返回生成的主键,2代表不返回生成的主键;为了方便记忆,使用 Statement.Statement.RETURN_GENERATED_KEYS,Statement.NO_GENERATED_KEYS
3.获得生成的主键
ResultSet rs=ps.getGeneratedKesy();
rs.next();
int userno= rs.getInt(1);
Statement stmt = null;
ResultSet rs = null;
try {
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_UPDATABLE);
// ...
// 省略若干行
// ...
stmt.executeUpdate(
"INSERT INTO xxx (dataField) "
+ "values ('xxx')",
Statement.RETURN_GENERATED_KEYS); // 向驱动指明需要自动获取generatedKeys!
int autoIncKeyFromApi = -;
rs = stmt.getGeneratedKeys(); // 获取自增主键!
if (rs.next()) {
autoIncKeyFromApi = rs.getInt();
} else {
// throw an exception from here
}
rs.close();
rs = null;
System.out.println("Key returned from getGeneratedKeys():"
+ autoIncKeyFromApi);
} finally { ... }
java_第一年_JDBC(3)的更多相关文章
- java_第一年_JDBC(7)
Commons-dbutils是一个开源的JDBC工具类库,对JDBC进行封装,简化编码的工作量,包含的API: org.apache.commons.dbutils.QueryRunner org. ...
- java_第一年_JDBC(2)
上篇说到,通过JDBC可实现java编程程序和mysql数据库进行连接并交互,而交互后所形成的结果集是通过ResultSet对象来操作的. 创建ResultSet对象: stmt = conn.cre ...
- java_第一年_JDBC(1)
JDBC(Java Data Base Connectivity),用于实现java语言编程与数据库连接的API. 数据库驱动:应用程序并不能直接使用数据库,而需要通过相应的数据库驱动程序后再操作数据 ...
- java_第一年_JDBC(6)
DataBaseMetaData对象:由Connection.getDataBaseMetaData()方法获得,可以用来获取数据库的元数据,提供的方法有: getURL():返回一个String类, ...
- java_第一年_JDBC(5)
事务概念:事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功: 开始事务:start transaction 提交事务:commit 回滚事务:rollback 事务的四大特 ...
- java_第一年_JDBC(4)
注:该篇只是为了小白的我熟悉下JDBC的代码,练习篇 在mysql中建test测试库,并创建一张employees表,加入一些数据如下图: 通过JDBC连接对表中数据进行添加: package lzj ...
- java_第一年_JavaWeb(14)
EL :EL表达式主要用于获取数据.执行运算.获取对象.调用java方法: 获取数据 语法:"${标识符}" 会调用pageContext.findAttribute方法,从pag ...
- java_第一年_JavaWeb(13)
JSTL标签库——核心标签库 为了弥补html标签的不足,为了更加方便地在jsp页面中使用java逻辑代码,JSTL标签库因运而生,而其中的佼佼者,被恩宠最多的就是核心标签库了: 核心标签库从功能上可 ...
- java_第一年_JavaWeb(11)
自定义标签:主要是用来移除JSP页面中的java代码. 先从一个简单的案例了解其怎么移除代码: 一个正常的jsp页面: <%@ page language="java" pa ...
随机推荐
- jQuery学习总结02-属性
1.attr(name|properties|key,value|fn) 说明:设置和返回被选元素的属性值 示例: 参数: name(属性名称) string properties(作为属性的'名/值 ...
- V7双雄-基于Virtex7XC7VX690T的高性能计算板卡解决方案
北京太速V7双雄-基于Virtex7XC7VX690T的高性能计算板卡
- Linux性能优化从入门到实战:17 网络篇:网络基础
网络模型 为了解决网络互联中异构设备的兼容性问题,并解耦复杂的网络包处理流程,国际标准化组织制定了开放式系统互联通信参考模型(Open System Interconnection Reference ...
- LA 3263 That Nice Euler Circuit(欧拉定理)
That Nice Euler Circuit Little Joey invented a scrabble machine that he called Euler, after the grea ...
- nginx-博客阅读笔记记录-20190916
Nginx 入门学习教程 Ng官网解释: nginx [engine x]是最初由Igor Sysoev编写的HTTP和反向代理服务器,邮件代理服务器和通用TCP / UDP代理服务器. 维基百科解释 ...
- Intellij IDEA 插件开发秘籍
来这里找志同道合的小伙伴! 这里总结一下 Intellij IDEA 插件开发的知识,供大家参考,本篇文章包含以下内容: 开发环境搭建 Component 介绍 Extension Point And ...
- 通过反射获取方法的参数名称(JDK8以上支持)
方法的参数名,在很多时候我们是需要反射得到的.但是在java8之前,代码编译为class文件后,方法参数的类型是固定的,但参数名称却丢失了,这和动态语言严重依赖参数名称形成了鲜明对比.(java是静态 ...
- elememt-ui 的 el-icon-iconName 图标 显示问题!
今天想在按钮处添加一个图标,但是显示不出.自己找了半天,终于找到了,希望帮到大家! 1,首先是没有报错的,但是有警告⚠ 意思是说什么拦截了之类的问题,但是到底是哪里问题导致拦截了呢?找了好久,原来是我 ...
- [CF846D]Monitor题解
看了一眼这题所用的操作,我觉得二维树状数组珂做,然后发现如果按时间顺序把节点一个个加进去再判会TLE,但发现二分时间明显比刚刚的做法快,于是二分时间+暴力插入该时间之内的点+树状数组维护即可AC 贴个 ...
- [CF846A]Curriculum Vitae题解
枚举一个点,假设它一定符合条件,据此珂以\(O(n)\)算出要删去几个点 于是就\(O(n^2)\)解决了,貌似加一个前缀和可以在\(O(n)\)的时间复杂度内解决本问题,但对于这个数据范围来说\(O ...