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 ...
随机推荐
- HTML培训课程-------Day02(表格和框架)
表格 在网页中表格是一种经常使用到得设计结构,就像表格的内容中可以包含任何的数据,如文字.图像.表单.超链接.表格等等,所有在HTML中可以使用的数据,都可以被设置在表格中,所以有关表格设置的标记与属 ...
- Zabbix应用五:Zabbix监控多Tomcat
利用Zabbix Trapper方式监控多Tomcat实例 Zabbix自带的模版(JMX Tomcat.JMX Generic)默认只能在一台机器上监控一个tomcat实例(因为监控项中的key不能 ...
- oracle 工作笔记,不定期更新
此博客为工作时,所见技术问题的解决方案笔记,欢迎大家转载,转载请注明出处,谢谢~ 更新时间: 2017-07-12 1. clob字段值读取时,借用extractvalue或extract函数读取节点 ...
- C语言复习---打印菱形
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <math ...
- js判断当前页面是顶级窗口
<script> if(top.location!=self.location){ alert("不是顶层窗口"); }else{ alert("是顶层窗口& ...
- bzoj千题计划228:bzoj2095: [Poi2010]Bridges
http://www.lydsy.com/JudgeOnline/problem.php?id=2095 二分答案,判断是否存在混合图的欧拉回路 如果只有一个方向的风力<=mid,这条边就是单向 ...
- Struts2_day02
一.内容大纲 1 结果页面配置 (1)全局结果页面 (2)局部结果页面 - 配置全局也配置局部,最终局部为准 (3)result标签type属性 - 默认值 dispatcher做转发 - redir ...
- ASP.NET私有构造函数作用
一.私有构造函数的特性 1.一般构造函数不是私有或者保护成员,但构造函数可以使私有成员函数,在一些特殊的场合,会把构造函数定义为私有或者保护成员. 2.私有构造函数是一种特殊的实例构造函数.它通常用在 ...
- 运算符,比如+, -, >, <, 以及下标引用[start:end]等等,从根本上都是定义在类内部的方法。
python解释器在碰到+号运算符时,会调用加号前面的对象的__add__方法 class a: def __add__(self,b): print "ghh" aa=a() a ...
- AC自动机(Keywords Search)
题目链接:https://cn.vjudge.net/contest/280743#problem/A 题目大意:首先给你T组测试样例,然后给你n个字符串,最后再给你一个模式串,然后问你这一些字符串中 ...