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. Java基础-原码反码补码

    Java基础-原码反码补码 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 注意,我们这里举列的原码和反码只是为了求负数的补码,在计算机中没有原码,反码的存在,只有补码. 一.原码 ...

  2. 关于Html class id 命名规范

    CSS命名规则 头:header 内容:content/containe 尾:footer 导航:nav 侧栏:sidebar 栏目:column 页面外围控制整体布局宽度:wrapper 左右中:l ...

  3. jQuery中Animate进阶用法(二)

    Step Type: Function( Number now, Tween tween )每个动画元素的每个动画属性将调用的函数.这个函数为修改Tween 对象提供了一个机会来改变设置中得属性值. ...

  4. 第10月第1天 iOS crash

    1. find /Applications/Xcode6.1.app -name symbolicatecrash -type f tempdeMac-mini:crash temp$ dwarfdu ...

  5. requests(三):json请求中中文乱码处理

    最近收到一个问题:json格式请求数据中有中文,导致服务端签名失败. 问题详情: 一位同学在发送json格式的post请求时,请求数据中有中文内容: {"inputCodes":[ ...

  6. vim命令学习

    文本编辑器vim vim常用操作 vim是一个强大的全屏幕文本编辑器,是Linux上最常用的文本编辑器,它的作用是建立,编辑,显示文本文件. vim没有菜单,只有命令. 输入a或i或o进入编辑命令,下 ...

  7. 关于iTerm2中颜色配置及快捷键使用技巧(亲测)

    https://github.com/mbadolato/iTerm2-Color-Schemes http://chriskempson.com/projects/base16 (同事用的) 按照g ...

  8. redis,nodejs,php,pub/sub 实战: 微信语音识别

    2015年5月22日 20:20:20 星期五 效果: 这边对微信说话,  浏览器端及时显示语音识别的文字 注意: 在连接socket.io时, 按下浏览器f12, 如果一直有请求不断的刷, 说明so ...

  9. 前后端分离之mockjs实战demo

    基于vue-cli+webpack的demo 项目结构 axios文件夹用来创建axios相关配置: import axios from 'axios' import vue from 'vue' a ...

  10. vs2010 快捷键

    我自己的快捷键: visual studio 2010快捷键: visual studio 2010快捷键: 强迫智能感知:Ctrl+J撤销:Ctrl+Z强迫显示参数信息:Ctrl+Shift+空格重 ...