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 ...
随机推荐
- css拾遗(一)(inline-block,absolute)
一:inline-block中不要嵌套其他block标签,不然会破坏布局 <style> .left{ float:left; } .hide{ display:none; } a{ di ...
- SpringJMS解析--使用示例
Spring配置文件: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="h ...
- AngularJS入门基础——过滤器
在HTML中的模板绑定符号{{ }}内通过 | 符号来调用过滤器 {{ name | uppercase }} 以HTML的形式使用过滤器时,如果需要传递参数给过滤器,只要在过滤器名字后面加冒号即 ...
- 1、Saltstack简介及安装配置
1.Saltstack简介 Saltstack是基于Python开发的一套C/S架构,具备Puppet.Ansible功能于一身的配置管理工具,功能十分强大,各模块融合度及复用性极高:使用号称世界上最 ...
- Zookeeper命名服务——生成分布式有序且唯一id
生成分布式有序且唯一id的方法有很多种,使用zookeeper是比较简单的一种方法,只是生成的速度不高,这里只是一个借助zk的版本号生成分布式唯一且有序id的例子. ZkIdGenerator.jav ...
- Javascript - Vue - 过滤器
过滤器 输出的数据由vue对象提供,但它的数据可能需要做进一步的处理才适合展示给用户看,为此,可以在静态的Vue上定义一个过滤器对实例vue对象的data数据进行过滤处理. //调用过滤器//msg是 ...
- Java多线程学习(八)线程池与Executor 框架
目录 历史优质文章推荐: 目录: 一 使用线程池的好处 二 Executor 框架 2.1 简介 2.2 Executor 框架结构(主要由三大部分组成) 2.3 Executor 框架的使用示意图 ...
- request_irq与request_threaded_irq
/* * Allocate the IRQ */ #if 0 retval = request_irq(uap->port.irq, pl011_int, 0, "uart-pl011 ...
- python里面的引用
1 对象及其引用 python中,引用是用命名空间来实现的,命名空间维护了变量和对象之间的引用关系. myInt = 27 yourInt = myInt #change the value of y ...
- 初始ADO.NET数据操作
以下介绍直接来源与百度百科,介绍十分全面和详细,作为小菜的我们没有理由不看完这些枯燥的介绍原有: ADO.NET的名称起源于ADO(ActiveX Data Objects),是一个COM组件库,用于 ...