获取数据库自动生成的主键

【孤立的技术是没有价值的】,我们这里只是为了了解具体的实现步骤:我们在插入数据的时候,经常会需要获取我们插入的这一行数据对应的主键值。

具体的代码实现:

 /**
* 获取数据库自动生成的主键
*/
@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&数据库事务处理的更多相关文章

  1. 【转】JDBC学习笔记(6)——获取自动生成的主键值&处理Blob&数据库事务处理

    转自:http://www.cnblogs.com/ysw-go/ 获取数据库自动生成的主键 我们这里只是为了了解具体的实现步骤:我们在插入数据的时候,经常会需要获取我们插入的这一行数据对应的主键值. ...

  2. JDBC 获取自动生成的主键

    为什么需要获取自动生成的主键 例如:

  3. Java -- JDBC 获取数据库自动 生成的主键值

    public class Demo4 { /* create table test1 ( id int primary key auto_increment, name varchar(20) ); ...

  4. MYSQL 之 JDBC(十一): JDBC获取插入记录的主键值

    取得数据库自动生成的主键值 package com.litian.jdbc; import javax.swing.plaf.nimbus.State; import java.sql.*; /** ...

  5. (jdbc)取得数据库自动生成的主键方法

    一些类,在前面的博客中有,就不重复了 public class Test2 { TestDAO t=new TestDAO(); /*前提是数据表的主键是自动增加的, *取得数据库自动生成的主键 * ...

  6. javaweb学习总结(三十七)——获得MySQL数据库自动生成的主键

    测试脚本如下: 1 create table test1 2 ( 3 id int primary key auto_increment, 4 name varchar(20) 5 ); 测试代码: ...

  7. Java_jdbc 基础笔记之十五 数据库连接(取得数据库自动生成的主键)

    public class testGetKeyValue { /** * 取得数据库自动生成的主键 */ @Test public void testGeneratedKeys() { Connect ...

  8. 五.获得MYSQL数据库自动生成的主键

    测试脚本如下: 1 create table test1 2 ( 3 id int primary key auto_increment, 4 name varchar(20) 5 ); 测试代码: ...

  9. javaweb(三十七)——获得MySQL数据库自动生成的主键

    测试脚本如下: 1 create table test1 2 ( 3 id int primary key auto_increment, 4 name varchar(20) 5 ); 测试代码: ...

随机推荐

  1. java--面向接口编程

    之前看的一本书的笔记,上周再看设计模式的时候,想到了这篇之前在看某本书时候的笔记. 面向接口编程很重要的一点就是接口回调,用接口声明的变量称作接口变量,属于引用型变量,可以存放实现该接口的类的实例的引 ...

  2. jboolean

    bool为C中变量类型,jboolean 为JNI中变量类型,boolean为Java中变量类型:jboolean在C语言的定义为:typedef unsigned char jboolean;uns ...

  3. Android Studio修改包名和applicationId的方法

    背景: 如果新做的项目跟以前做的某一个项目十分相似,那么一个简单的方法就是把原来项目拷贝一份,然后修改代码,但是这样包名还是原来项目的包名,还有如果想在同一台手机上同时安装新做的app和原来的app会 ...

  4. 面试题_76_to_81_Java 最佳实践的面试问题

    包含 Java 中各个部分的最佳实践,如集合,字符串,IO,多线程,错误和异常处理,设计模式等等. 76)Java 中,编写多线程程序的时候你会遵循哪些最佳实践?(答案)这是我在写Java 并发程序的 ...

  5. trackr: An AngularJS app with a Java 8 backend – Part II

    该系列文章来自techdev The Frontend 在本系列的第一部分我们已经描述RESTful端建立在Java 8和Spring.这一部分将介绍我们的第一个用 AngularJS建造的客户端应用 ...

  6. MySQL select into 和 SQL select into

    现在有张表为student,我想将这个表里面的数据复制到一个为dust的新表中去,虽然可以用以下语句进行复制,总觉得不爽,希望各位帮助下我,谢谢.  answer 01: create table d ...

  7. 30道Linux面试题

    1.linux如何挂在windows下的共享目录 mount.cifs //192.168.1.3/server /mnt/server -o user=administrator,pass=1234 ...

  8. Mybatis学习——一对多关联表查询

    1.实体类 public class Student { private int id; private String name; } public class Classes { private i ...

  9. MySQL基础之第7章 索引

    第7章 索引 MySQL中,所有的数据类型都可以被索引,包括普通索引,唯一性索引,全文索引,单列索引,多列索引和空间索引等. 7.1.索引简介 7.1.1.索引的含义和特点 BTREE索引,HASH索 ...

  10. Android-监听sdcard状态

    public class MyService extends Service { private static final String TAG = "MyService"; Fi ...