JDBC之 自增长与事务
JDBC之 自增长与事务
1.自增长
有这样一个现象:数据库中有两个表格 学生表(学生姓名,所在班级),班级表(班级号(自增长的主键),班级人数)。
现在我往班级表插入一条信息, 只提供班级人数,班级号由自增长自动生成。然后我们插入一条学生信息入这个新的班,这就需要新增的班级的班级号,但是这个班级号由自增长自动生成,那么我们该如何正确把这个学生的信息插入呢?
看下面代码演示吧~
public class AutoIncrement { Connection connection = null; @Test
public void TestAuto() throws Exception
{
//获取连接
connection = sqlUtil.getconnection(); //准备SQL语句
String classSQL = "insert into class(ccount) values(?)";
String studentSQL = "insert into student values(?,?)"; //获取对象,先往CLASS表插入一条数据,使用有两个参数的方法。
//第二个参数Statement.RETURN_GENERATED_KEYS 可以获得自增长的值
PreparedStatement preparedStatement =
connection.prepareStatement(classSQL,Statement.RETURN_GENERATED_KEYS); //设置参数
preparedStatement.setObject(1, 66); //执行
preparedStatement.executeUpdate(); //下面就来获得这个自增长的ID值
Integer cid = null;
//使用getGeneratedKeys()获得自增长参数的一个结果集
ResultSet res = preparedStatement.getGeneratedKeys();
//迭代得到该值,我这里只有一个自增长的参数
if(res.next())
{
cid = res.getInt(1);
} //******得到该增长的值后,我们就 来插入员工信息********
preparedStatement=connection.prepareStatement(studentSQL); //设置参数,把获取的自增长的值作为参数
preparedStatement.setObject(1, "张三");
preparedStatement.setObject(2, cid); //执行
preparedStatement.executeUpdate(); //关闭资源
sqlUtil.close(preparedStatement, connection); }
}
2.事务
大家都知道,数据库中常常会用到事务,那么如何用java代码来操作呢~看下面代码和说明吧~
有一个表:bank(bname,money),用来记录人物的姓名和金钱数
@Test
public void doCommit() throws Exception {
// 获取连接
connection = sqlUtil.getconnection(); // Jack向Mark转账100元。
String sql1 = "update bank set money=money-100 where bname='Jack'";
// Mark的账户获得100元
String sql2 = "update bank set money=money+100 where bname='Mark'"; // 开始事务,false表示关闭自动提交,即开启事务
// true 表示自动提交SQL
connection.setAutoCommit(false); // Jack执行转账100
PreparedStatement state = connection.prepareStatement(sql1);
state.executeUpdate(); // Mark获得100
state = connection.prepareStatement(sql2);
state.executeUpdate(); // 提交事务
connection.commit(); // 关闭资源
sqlUtil.close(state, connection); }
这样就能创建和提交一个事务。
那么,如果在”Jack执行转账100“ 这个操作执行后,出现了异常,没有执行:sql2语句, 那两个用户岂不是都有损失? 这时候就体现出事务的重要性,事务还有一个功能:回滚
下面就故意制造一个异常,然后回滚事务吧~
public class CommitTest {
Connection connection = null; @Test
public void doCommit() {
// Jack执行转账100
PreparedStatement state = null;
try {
// 获取连接
connection = sqlUtil.getconnection(); // Jack向Mark转账100元。
String sql1 = "update bank set money=money-100 where bname='Jack'";
// Mark的账户获得100元
String sql2 = "update bank set money=money+100 where bname='Mark'"; // 开始事务,false表示关闭自动提交,即开启事务
// true 表示自动提交SQL
connection.setAutoCommit(false); // Jack执行转账100
state = connection.prepareStatement(sql1);
state.executeUpdate(); //故意制造异常
int a = 1/0; // Mark获得100
state = connection.prepareStatement(sql2);
state.executeUpdate(); // 提交事务
connection.commit();
} catch (SQLException e) {
e.printStackTrace();
try {
//遇到任何异常情况,回滚事务
connection.rollback(); } catch (SQLException e1) {
e1.printStackTrace();
throw new RuntimeException(e);
}
}finally{
// 关闭资源
sqlUtil.close(state, connection);
} }
}
JDBC之 自增长与事务的更多相关文章
- Jdbc执行存储过程报数据库事务无法执行的异常
Jdbc执行存储过程报数据库事务无法执行的异常 环境: Eclipse+Jdk1.7+spring-jdbc-3.0.7+同版本的jdbctemplate+Sqlserver 2012 问题: 一个小 ...
- 一个jdbc connection连接对应一个事务
Spring保证在methodB方法中所有的调用都获得到一个相同的连接.在调用methodB时,没有一个存在的事务,所以获得一个新的连接,开启了一个新的事务. Spring保证在methodB方法中所 ...
- JDBC 学习笔记(四)—— 自定义JDBC框架+Apache—DBUtils框架+事务管理+操作多表
本文目录: 1.自定义JDBC框架 ——数据库元数据:DataBaseMetaData 2.自定义JDBC框架 ——数据库元数据:DataBaseMetaData ...
- sql 批处理、获取自增长、事务、大文本处理
批处理 需要批量执行sql语句! 需求:批量保存信息! 设计: AdminDao Public void save(List<Admin list){ // 目前用这种方式 // 循环 // 保 ...
- JDBC基础学习(四)—数据库事务
一.事务基本认识 1.事务的概述 为了保证数据库中数据的一致性,数据的操作应当是离散的成组的逻辑单元.当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应当全部视 ...
- JDBC第三篇--【事务、元数据、改造JDBC工具类】
这是我JDBC的第一篇 http://blog.csdn.net/hon_3y/article/details/53535798 这是我JDBC的第二篇 http://blog.csdn.net/ho ...
- springmvc学习笔记三:整合JDBC,简单案例==数据库事务配置(切面)
package cn.itcast.bean; import org.springframework.jdbc.core.PreparedStatementSetter; public class U ...
- 数据库程序接口——JDBC——功能第四篇——事务之Spring事务
综述 事务的实现方式有三种,JTA,Spring事务,Web Container方式.本篇讲述Spring事务. Spring事务分为两个部分核心对象,Spring事务的实现方式. Spring事务实 ...
- jdbc java数据库连接 9)事务编程
1. 事务 基本概念: 事务使指一组最小逻辑操作单元,里面有多个操作组成. 组成事务的每一部分必须要同时提交成功,如果有一个操作失败,整个操作就回滚. 事务ACID特性: l 原子性(Atomicit ...
随机推荐
- 使用pandas导入csv文件到MySQL
之前尝试过用命令行来解决csv文件导入到MySQL这个问题,没想到一直没有成功.之后会继续更新的吧,现在先用pandas来解决这个问题,虽然会复杂一点,但至少能用. 例子是导入movielens的ra ...
- OpenStack 网络服务 Neutron 私有网络构建(十九)
本章内容基于之前提供者网络构建的基础上进行改动,之前文章参考如下: Openstack 网络服务 Neutron介绍和控制节点部署 (九) Openstack 网络服务 Neutron计算节点部署(十 ...
- Java基础-赋值运算符Assignment Operators与条件运算符Condition Operators
Java基础-赋值运算符Assignment Operators与条件运算符Condition Operators 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.赋值运算符 表 ...
- bzoj千题计划295:bzoj3140: [Hnoi2013]消毒
http://www.lydsy.com/JudgeOnline/problem.php?id=3140 如果只有两维,那就是二分图最小点覆盖 现在是三维,但是a*b*c<=5000,说明最小的 ...
- 《Linux命令行与shell脚本编程大全》 第五章理解shell
5.1 1. cat /etc/passwd 可以查看每个用户自己的默认的shell程序. 2.默认的交互shell会在用户登录某个虚拟控制台终端时启动. 不过还有另外一个默认的shell是/bin/ ...
- eclipse中可以导入其它工具编写的RobotFramework脚本吗?
在Robotframework的官方网站中,提供了非常多的编辑RF的工具.比如Ride,eclipse,sublime,notepad++等. 网上查到的资料,大部分都是Ride这个编辑工具的使用.在 ...
- phantomjs waitFor
function waitFor(testFx, onReady, timeOutMillis) { var maxtimeOutMillis = timeOutMillis ? timeOutMil ...
- VS 2013 中如何自定义快捷键(图解)
随着软件的升级其功能也越来越多,所以相应的快捷键也多了起来.VS2013中的快捷方式已经发展为了两个快捷键的组合.例如VS2013中默认的多行注释的快捷功能键为(ctrl+k,ctrl+u).像这样类 ...
- centos7系统下安装配置jdk、tomcat教程
JDK安装与配置 1.下载linux版本的jdk,我下的版本是jdk6.0,下载rpm版本的. 可通过百度搜索文件名:jdk-6u45-linux-x64-rpm.bin下载 也可通过oracle官网 ...
- The project cannot be built until its prerequisite base-service is built. Cleaning and building all projects is recommended
参考网址:http://chiangfai.iteye.com/blog/2223661,谢谢! 果然如文中所述,close,重新编译即可!