【转】JDBC学习笔记(6)——获取自动生成的主键值&处理Blob&数据库事务处理
转自:http://www.cnblogs.com/ysw-go/
获取数据库自动生成的主键
我们这里只是为了了解具体的实现步骤:我们在插入数据的时候,经常会需要获取我们插入的这一行数据对应的主键值。
具体的代码实现:

1 /**
2 * 获取数据库自动生成的主键
3 */
4 @Test
5 public void testGetKeyValues(){
6 Connection connection=null;
7 PreparedStatement preparedStatement=null;
8 ResultSet rs=null;
9 try {
10 connection=JDBCTools.getConnection();
11 String sql="insert into customers(name,email,birth)"+
12 " values(?,?,?)";
13 // preparedStatement=connection.prepareStatement(sql);
14 //我们这里使用重载的prepareStatement(sql,flag)方法
15 //来生成prepareStatement对象
16 preparedStatement=connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
17 preparedStatement.setString(1, "ABCDE");
18 preparedStatement.setString(2, "abcd@guigu.com");
19 preparedStatement.setDate(3, new Date(new java.util.Date().getTime()));
20 preparedStatement.executeUpdate();
21 //通过getGeneratedKeys方法获取包含了新生成的主键的ResultSet对象
22 //在ResultSet结果集中,只包含一列,列名:GENERATED_KEY,用于存放新生成的主键值
23 rs=preparedStatement.getGeneratedKeys();
24 if(rs.next()){
25 System.out.println(rs.getObject(1));
26 }
27 ResultSetMetaData rsmd=rs.getMetaData();
28 for(int i=0;i<rsmd.getColumnCount();i++){
29 System.out.println(rsmd.getColumnName(i+1));
30 }
31 } catch (Exception e) {
32 e.printStackTrace();
33 }finally{
34 JDBCTools.release(rs,preparedStatement,connection);
35 }
36 }

处理Blob
Blob的基本概念


1).插入Blob类型数据

/**
* 插入Blob类型的数据必须使用PreparedStatement
* 因为Blob类型的数据是无法使用字符串拼写的
*
* 调用setBlob(int index,InputStream,inputStream)
*/

具体代码实现:

1 @Test
2 public void testInsertBlod(){
3 Connection connection=null;
4 PreparedStatement preparedStatement=null;
5 ResultSet rs=null;
6 try {
7 connection=JDBCTools.getConnection();
8 String sql="insert into customers(name,email,birth,picture)"+
9 " values(?,?,?,?)";
10 // preparedStatement=connection.prepareStatement(sql);
11 //我们这里使用重载的prepareStatement(sql,flag)方法
12 //来生成prepareStatement对象
13 preparedStatement=connection.prepareStatement(sql);
14 preparedStatement.setString(1, "ABCDE");
15 preparedStatement.setString(2, "abcd@guigu.com");
16 preparedStatement.setDate(3, new Date(new java.util.Date().getTime()));
17 InputStream inputStream=new FileInputStream("blob.png");
18 preparedStatement.setObject(4, inputStream);
19 preparedStatement.executeUpdate();
20
21 } catch (Exception e) {
22 e.printStackTrace();
23 }finally{
24 JDBCTools.release(rs,preparedStatement,connection);
25 }
26 }

2).读取Blob类型数据
/**
* 读取Blob数据:
* 1.使用getBlob方法,读取Blod对象
* 2.调用Blob的getBinaryStream()方法得到输入流,再使用IO操作即可
*/
具体代码实现:

1 @Test
2 public void testReadBlob(){
3 Connection connection = null;
4 PreparedStatement preparedStatement = null;
5 ResultSet resultSet = null;
6 try {
7 connection = JDBCTools.getConnection();
8 String sql = "select id,name,email,birth,picture"+
9 " from customers where id =18";
10 preparedStatement = connection.prepareStatement(sql);
11 resultSet = preparedStatement.executeQuery();
12 if (resultSet.next()) {
13 int id=resultSet.getInt(1);
14 String name=resultSet.getString(2);
15 String email=resultSet.getString(3);
16 System.out.println(id+":"+name+":"+email);
17 Blob pictureBlob=resultSet.getBlob(5);
18 InputStream inputStream=pictureBlob.getBinaryStream();
19 OutputStream out=new FileOutputStream("flo.png");
20 byte[] buffer=new byte[1024];
21 int len =0;
22 while((len=inputStream.read(buffer))!=-1){
23 out.write(buffer,0,len);
24 }
25 out.close();
26 inputStream.close();
27 }
28 } catch (Exception e) {
29 e.printStackTrace();
30 } finally {
31 JDBCTools.release(resultSet, preparedStatement, connection);
32 }
33 }

数据库事务
数据库事务概述

数据库事务的四个属性

JDBC的数据库事务

我们做一个小实验:
先建立一个数据表:

试验中要用到的更新数据的通用方法update():

1 public static void update(Connection connection,String sql,
2 Object ...args){
3 /**
4 * 执行SQL语句,使用PreparedStatement
5 */
6 PreparedStatement preparedStatement=null;
7 try {
8 preparedStatement=connection.prepareStatement(sql);
9 for(int i=0;i<args.length;i++){
10 preparedStatement.setObject(i+1, args[i]);
11 }
12 preparedStatement.executeUpdate();
13 } catch (Exception e) {
14 e.printStackTrace();
15 }finally{
16 JDBCTools.release(null, preparedStatement, null);
17 }

我们要完成的是:Tom->Jerry汇款500元
* 数据库事务
* 关于事务:
* 1.如果多个操作,每个操作使用的是自己的单独的连接,则无法保证事务
* 2.具体步骤:
* 1).开始事务,取消默认自动提交行为
* 2).如果事务的操作都成功,则提交事务:connection.commit();
* 3).回滚事务:若出现异常,则在catch块中回滚事务
我们组织代码就按照上面的步骤来进行.

1 public void testTeansaction() throws Exception{
2 Connection connection=null;
3 try {
4 connection=JDBCTools.getConnection();
5 System.out.println(connection.getAutoCommit());
6 String sql="update users set balance=balance-500 where id=1";
7 //开始事务:取消默认提交
8 connection.setAutoCommit(false);
9 update(connection,sql);
10 int i=10/0;
11 System.out.println(i);
12 sql="update users set balance=balance+500 where id=2";
13 JDBCTools.update(sql);
14 //提交事务
15 connection.commit();
16 } catch (Exception e) {
17 e.printStackTrace();
18 //回滚事务
19 try {
20 connection.rollback();
21 } catch (SQLException e1) {
22 e1.printStackTrace();
23 }
24 }finally{
25 //关闭连接
26 JDBCTools.release(null, null, connection);
27 }
28 }

可以发现,因为我们使用的是同一个connection连接,当异常(除数为0)发生的时候,事务会发生回滚,数据库的数据会恢复到事务开始之前的状态.
【转】JDBC学习笔记(6)——获取自动生成的主键值&处理Blob&数据库事务处理的更多相关文章
- JDBC学习笔记(6)——获取自动生成的主键值&处理Blob&数据库事务处理
获取数据库自动生成的主键 [孤立的技术是没有价值的],我们这里只是为了了解具体的实现步骤:我们在插入数据的时候,经常会需要获取我们插入的这一行数据对应的主键值. 具体的代码实现: /** * 获取数据 ...
- JDBC 获取自动生成的主键
为什么需要获取自动生成的主键 例如:
- Java -- JDBC 获取数据库自动 生成的主键值
public class Demo4 { /* create table test1 ( id int primary key auto_increment, name varchar(20) ); ...
- MYSQL 之 JDBC(十一): JDBC获取插入记录的主键值
取得数据库自动生成的主键值 package com.litian.jdbc; import javax.swing.plaf.nimbus.State; import java.sql.*; /** ...
- (jdbc)取得数据库自动生成的主键方法
一些类,在前面的博客中有,就不重复了 public class Test2 { TestDAO t=new TestDAO(); /*前提是数据表的主键是自动增加的, *取得数据库自动生成的主键 * ...
- javaweb学习总结(三十七)——获得MySQL数据库自动生成的主键
测试脚本如下: 1 create table test1 2 ( 3 id int primary key auto_increment, 4 name varchar(20) 5 ); 测试代码: ...
- Java_jdbc 基础笔记之十五 数据库连接(取得数据库自动生成的主键)
public class testGetKeyValue { /** * 取得数据库自动生成的主键 */ @Test public void testGeneratedKeys() { Connect ...
- 五.获得MYSQL数据库自动生成的主键
测试脚本如下: 1 create table test1 2 ( 3 id int primary key auto_increment, 4 name varchar(20) 5 ); 测试代码: ...
- javaweb(三十七)——获得MySQL数据库自动生成的主键
测试脚本如下: 1 create table test1 2 ( 3 id int primary key auto_increment, 4 name varchar(20) 5 ); 测试代码: ...
随机推荐
- Maven进阶宝典
前言: 团队在开发过程中用的是maven项目,由于对maven的一些打包流程以及相关参数配置不是太了解,因此应大家的需求做一下maven的讲解,为了不误导大家,看了很多相关资料,自己也实验了一下,就把 ...
- am335x uboot2016.05 (MLO u-boot.img)执行流程
am335x的cpu上电后,执行流程:ROM->MLO(SPL)->u-boot.img 第一级bootloader:引导加载程序,板子上电后会自动执行这些代码,如启动方式(SDcard. ...
- 算法模板——LCA(最近公共祖先)
实现的功能如下——在一个N个点的无环图中,共有N-1条边,M个访问中每次询问两个点的距离 原理——既然N个点,N-1条边,则说明这是一棵树,而且联通.所以以1为根节点DFS建树,然后通过求两点的LCA ...
- 循环单词 java
链接:https://www.nowcoder.com/questionTerminal/9d5fbe7750a34d0b91c73943f93b2d7d来源:牛客网如果一个单词通过循环右移获得的单词 ...
- 不懂这些分布式架构、分布式系统的数据一致性解决方案,你如何能找到高新互联网工作呢?强势解析eBay BASE模式、去哪儿及蘑菇街分布式架构
互联网行业是大势所趋,从招聘工资水平即可看出,那么如何提升自我技能,满足互联网行业技能要求?需要以目标为导向,进行技能提升,本文主要针对招聘中高频提及的分布式系统设计.架构(数据一致性)做了分析,祝各 ...
- 配置adb环境变量
作为Android开发人员,会经常使用adb命令来进行push.pull.install.看数据库等.记录一下adb配置流程,以备后用. 在没有配置adb之前,我们打开Windows命令处理程序(cm ...
- R处理大数据集
R会把所有的对象读存入虚拟内存中.对我们大多数用户来说,这种设计可以提高与R相互的速度,但是当分析大数据集时,这种设计会降低程序运行速度有时还会产生跟内存相关的错误. 内存限制主要取决于R的build ...
- supermap开发webgis的经验
SuperMap 开发WebGIS的经验总结 - 综合课件 - 道客巴巴 http://www.doc88.com/p-743552004620.html
- restful restAPI 的定义方式
今天听了一些rest 的讲解,感谢玖遥老大教导,晚上把整理出来,帮助那些和我一样有过迷茫的人! 我举的例子是经过我的老大讲解,以及观看阮一峰的restful架构的一些整合,和自己的拙劣见解. 首先:每 ...
- Flex表格中添加图片
Flex4.5中datagrid加入图片显示image <s:DataGrid id="maingrid" x="0" y="36" ...