JDBC学习笔记(6)——获取自动生成的主键值&处理Blob&数据库事务处理
获取数据库自动生成的主键
【孤立的技术是没有价值的】,我们这里只是为了了解具体的实现步骤:我们在插入数据的时候,经常会需要获取我们插入的这一行数据对应的主键值。
具体的代码实现:
/**
* 获取数据库自动生成的主键
*/
@Test
public void testGetKeyValues(){
Connection connection=null;
PreparedStatement preparedStatement=null;
ResultSet rs=null;
try {
connection=JDBCTools.getConnection();
String sql="insert into customers(name,email,birth)"+
" values(?,?,?)";
// preparedStatement=connection.prepareStatement(sql);
//我们这里使用重载的prepareStatement(sql,flag)方法
//来生成prepareStatement对象
preparedStatement=connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
preparedStatement.setString(1, "ABCDE");
preparedStatement.setString(2, "abcd@guigu.com");
preparedStatement.setDate(3, new Date(new java.util.Date().getTime()));
preparedStatement.executeUpdate();
//通过getGeneratedKeys方法获取包含了新生成的主键的ResultSet对象
//在ResultSet结果集中,只包含一列,列名:GENERATED_KEY,用于存放新生成的主键值
rs=preparedStatement.getGeneratedKeys();
if(rs.next()){
System.out.println(rs.getObject(1));
}
ResultSetMetaData rsmd=rs.getMetaData();
for(int i=0;i<rsmd.getColumnCount();i++){
System.out.println(rsmd.getColumnName(i+1));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBCTools.release(rs,preparedStatement,connection);
}
}
处理Blob
Blob的基本概念


1).插入Blob类型数据
/**
* 插入Blob类型的数据必须使用PreparedStatement
* 因为Blob类型的数据是无法使用字符串拼写的
*
* 调用setBlob(int index,InputStream,inputStream)
*/
具体代码实现:
@Test
public void testInsertBlod(){
Connection connection=null;
PreparedStatement preparedStatement=null;
ResultSet rs=null;
try {
connection=JDBCTools.getConnection();
String sql="insert into customers(name,email,birth,picture)"+
" values(?,?,?,?)";
// preparedStatement=connection.prepareStatement(sql);
//我们这里使用重载的prepareStatement(sql,flag)方法
//来生成prepareStatement对象
preparedStatement=connection.prepareStatement(sql);
preparedStatement.setString(1, "ABCDE");
preparedStatement.setString(2, "abcd@guigu.com");
preparedStatement.setDate(3, new Date(new java.util.Date().getTime()));
InputStream inputStream=new FileInputStream("blob.png");
preparedStatement.setObject(4, inputStream);
preparedStatement.executeUpdate(); } catch (Exception e) {
e.printStackTrace();
}finally{
JDBCTools.release(rs,preparedStatement,connection);
}
}
2).读取Blob类型数据
/**
* 读取Blob数据:
* 1.使用getBlob方法,读取Blod对象
* 2.调用Blob的getBinaryStream()方法得到输入流,再使用IO操作即可
*/
具体代码实现:
@Test
public void testReadBlob(){
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
connection = JDBCTools.getConnection();
String sql = "select id,name,email,birth,picture"+
" from customers where id =18";
preparedStatement = connection.prepareStatement(sql);
resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
int id=resultSet.getInt(1);
String name=resultSet.getString(2);
String email=resultSet.getString(3);
System.out.println(id+":"+name+":"+email);
Blob pictureBlob=resultSet.getBlob(5);
InputStream inputStream=pictureBlob.getBinaryStream();
OutputStream out=new FileOutputStream("flo.png");
byte[] buffer=new byte[1024];
int len =0;
while((len=inputStream.read(buffer))!=-1){
out.write(buffer,0,len);
}
out.close();
inputStream.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.release(resultSet, preparedStatement, connection);
}
}
数据库事务
数据库事务概述

数据库事务的四个属性

JDBC的数据库事务

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

试验中要用到的更新数据的通用方法update():
public static void update(Connection connection,String sql,
Object ...args){
/**
* 执行SQL语句,使用PreparedStatement
*/
PreparedStatement preparedStatement=null;
try {
preparedStatement=connection.prepareStatement(sql);
for(int i=0;i<args.length;i++){
preparedStatement.setObject(i+1, args[i]);
}
preparedStatement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBCTools.release(null, preparedStatement, null);
}
我们要完成的是:Tom->Jerry汇款500元
* 数据库事务
* 关于事务:
* 1.如果多个操作,每个操作使用的是自己的单独的连接,则无法保证事务
* 2.具体步骤:
* 1).开始事务,取消默认自动提交行为
* 2).如果事务的操作都成功,则提交事务:connection.commit();
* 3).回滚事务:若出现异常,则在catch块中回滚事务
我们组织代码就按照上面的步骤来进行.
public void testTeansaction() throws Exception{
Connection connection=null;
try {
connection=JDBCTools.getConnection();
System.out.println(connection.getAutoCommit());
String sql="update users set balance=balance-500 where id=1";
//开始事务:取消默认提交
connection.setAutoCommit(false);
update(connection,sql);
int i=10/0;
System.out.println(i);
sql="update users set balance=balance+500 where id=2";
JDBCTools.update(sql);
//提交事务
connection.commit();
} catch (Exception e) {
e.printStackTrace();
//回滚事务
try {
connection.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally{
//关闭连接
JDBCTools.release(null, null, connection);
}
}
可以发现,因为我们使用的是同一个connection连接,当异常(除数为0)发生的时候,事务会发生回滚,数据库的数据会恢复到事务开始之前的状态.
本文为博主原创文章,转载请注明出处:http://www.cnblogs.com/ysw-go/
1、本博客的原创原创文章,都是本人平时学习所做的笔记,如有错误,欢迎指正。
2、如有侵犯您的知识产权和版权问题,请通知本人,本人会即时做出处理文章。
3、本博客的目的是知识交流所用,转载自其它博客或网站,作为自己的参考资料的,感谢这些文章的原创人员
JDBC学习笔记(6)——获取自动生成的主键值&处理Blob&数据库事务处理的更多相关文章
- 【转】JDBC学习笔记(6)——获取自动生成的主键值&处理Blob&数据库事务处理
转自:http://www.cnblogs.com/ysw-go/ 获取数据库自动生成的主键 我们这里只是为了了解具体的实现步骤:我们在插入数据的时候,经常会需要获取我们插入的这一行数据对应的主键值. ...
- 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 ); 测试代码: ...
随机推荐
- bash: ./device/nexell/tools/build.sh: 权限不够
/bin/bash: build/tools/diff_package_overlays.py: 鏉冮檺涓嶅 i686-linux-gcc: error trying to exec 'cc1': ...
- Android手机拍照
参考的这个视频教程:http://v.youku.com/v_show/id_XNjI5MzkzMjQ4.html和官方API档file:///D:/Android/androidstudio/sdk ...
- 【转载】Java垃圾回收内存清理相关(虚拟机书第三章),GC日志的理解,CPU时间、墙钟时间的介绍
主要看<深入理解Java虚拟机> 第三张 P84 开始是垃圾收集相关. 1. 1960年诞生于MIT的Lisp是第一门采用垃圾回收的语言. 2. 程序计数器.虚拟机栈.本地方法栈3个区域随 ...
- Java 日期时间
Java 日期时间 标签 : Java基础 Date java.util.Date对象表示一个精确到毫秒的瞬间; 但由于Date从JDK1.0起就开始存在了,历史悠久,而且功能强大(既包含日期,也包含 ...
- UVA 10801 Lift Hopping 电梯换乘(最短路,变形)
题意: 有n<6部电梯,给出每部电梯可以停的一些特定的楼层,要求从0层到达第k层出来,每次换乘需要60秒,每部电梯经过每层所耗时不同,具体按 层数*电梯速度 来算.问经过多少秒到达k层(k可以为 ...
- 工作中的 Vim 和 git
————————Vim———————— 1. gf 可以转到文件中指明路径的文件. 这样可以实现文件的快速切换. ctrl+o: A -> B, 返回A ctrl+6: A.B之间快速切换 2 ...
- 【WEB小工具】BaseServlet—一个Servlet处理多个请求
package cn.itcast.test.web.servlet; import java.io.IOException; import java.io.PrintWriter; import j ...
- Data Binding(数据绑定)用户指南
1)介绍 这篇文章介绍了如何使用Data Binding库来写声明的layouts文件,并且用最少的代码来绑定你的app逻辑和layouts文件. Data Binding库不仅灵活而且广泛兼容- 它 ...
- Delphi ORD
//Char 类型与其编码值的转换:varb: Byte;c: Char;beginb := Ord('A'); {返回: 65}b := Ord(#65); {返回: 65}b := Ord ...
- SharePoint 2010 列表项事件接收器 ItemAdded 的使用方法
列表项事件处理器是继承于Microsoft.SharePoint.SPItemEventReceiver的类,Microsoft.SharePoint.SPItemEventReceiver类提供了许 ...