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之 自增长与事务的更多相关文章

  1. Jdbc执行存储过程报数据库事务无法执行的异常

    Jdbc执行存储过程报数据库事务无法执行的异常 环境: Eclipse+Jdk1.7+spring-jdbc-3.0.7+同版本的jdbctemplate+Sqlserver 2012 问题: 一个小 ...

  2. 一个jdbc connection连接对应一个事务

    Spring保证在methodB方法中所有的调用都获得到一个相同的连接.在调用methodB时,没有一个存在的事务,所以获得一个新的连接,开启了一个新的事务. Spring保证在methodB方法中所 ...

  3. JDBC 学习笔记(四)—— 自定义JDBC框架+Apache—DBUtils框架+事务管理+操作多表

    本文目录:       1.自定义JDBC框架 ——数据库元数据:DataBaseMetaData        2.自定义JDBC框架 ——数据库元数据:DataBaseMetaData       ...

  4. sql 批处理、获取自增长、事务、大文本处理

    批处理 需要批量执行sql语句! 需求:批量保存信息! 设计: AdminDao Public void save(List<Admin list){ // 目前用这种方式 // 循环 // 保 ...

  5. JDBC基础学习(四)—数据库事务

    一.事务基本认识 1.事务的概述      为了保证数据库中数据的一致性,数据的操作应当是离散的成组的逻辑单元.当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应当全部视 ...

  6. JDBC第三篇--【事务、元数据、改造JDBC工具类】

    这是我JDBC的第一篇 http://blog.csdn.net/hon_3y/article/details/53535798 这是我JDBC的第二篇 http://blog.csdn.net/ho ...

  7. springmvc学习笔记三:整合JDBC,简单案例==数据库事务配置(切面)

    package cn.itcast.bean; import org.springframework.jdbc.core.PreparedStatementSetter; public class U ...

  8. 数据库程序接口——JDBC——功能第四篇——事务之Spring事务

    综述 事务的实现方式有三种,JTA,Spring事务,Web Container方式.本篇讲述Spring事务. Spring事务分为两个部分核心对象,Spring事务的实现方式. Spring事务实 ...

  9. jdbc java数据库连接 9)事务编程

    1. 事务 基本概念: 事务使指一组最小逻辑操作单元,里面有多个操作组成. 组成事务的每一部分必须要同时提交成功,如果有一个操作失败,整个操作就回滚. 事务ACID特性: l 原子性(Atomicit ...

随机推荐

  1. HTML培训课程-------Day02(表格和框架)

    表格 在网页中表格是一种经常使用到得设计结构,就像表格的内容中可以包含任何的数据,如文字.图像.表单.超链接.表格等等,所有在HTML中可以使用的数据,都可以被设置在表格中,所以有关表格设置的标记与属 ...

  2. Zabbix应用五:Zabbix监控多Tomcat

    利用Zabbix Trapper方式监控多Tomcat实例 Zabbix自带的模版(JMX Tomcat.JMX Generic)默认只能在一台机器上监控一个tomcat实例(因为监控项中的key不能 ...

  3. oracle 工作笔记,不定期更新

    此博客为工作时,所见技术问题的解决方案笔记,欢迎大家转载,转载请注明出处,谢谢~ 更新时间: 2017-07-12 1. clob字段值读取时,借用extractvalue或extract函数读取节点 ...

  4. C语言复习---打印菱形

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <math ...

  5. js判断当前页面是顶级窗口

    <script> if(top.location!=self.location){ alert("不是顶层窗口"); }else{ alert("是顶层窗口& ...

  6. bzoj千题计划228:bzoj2095: [Poi2010]Bridges

    http://www.lydsy.com/JudgeOnline/problem.php?id=2095 二分答案,判断是否存在混合图的欧拉回路 如果只有一个方向的风力<=mid,这条边就是单向 ...

  7. Struts2_day02

    一.内容大纲 1 结果页面配置 (1)全局结果页面 (2)局部结果页面 - 配置全局也配置局部,最终局部为准 (3)result标签type属性 - 默认值 dispatcher做转发 - redir ...

  8. ASP.NET私有构造函数作用

    一.私有构造函数的特性 1.一般构造函数不是私有或者保护成员,但构造函数可以使私有成员函数,在一些特殊的场合,会把构造函数定义为私有或者保护成员. 2.私有构造函数是一种特殊的实例构造函数.它通常用在 ...

  9. 运算符,比如+, -, >, <, 以及下标引用[start:end]等等,从根本上都是定义在类内部的方法。

    python解释器在碰到+号运算符时,会调用加号前面的对象的__add__方法 class a: def __add__(self,b): print "ghh" aa=a() a ...

  10. AC自动机(Keywords Search)

    题目链接:https://cn.vjudge.net/contest/280743#problem/A 题目大意:首先给你T组测试样例,然后给你n个字符串,最后再给你一个模式串,然后问你这一些字符串中 ...