本篇讲述如何使用JDBC获取能自动增加的主键的值。有时候我们在向数据库插入数据时希望能返回主键的值,而不是通过查询的方式。一般来说,在多表相互关联主键约束,也就是说别的表的外键约束是该表的主键,那么在该表插入时主键自动增加,那么就应该将主键值给别的外键是该表的主键,以指示别的表在更新自己的外键项时应该关联哪个值。

前提:

  ① 这里探讨的首先只能是对数据库的插入操作(Insert)。

  ② 其次应该是表中的主键列,也就是在创建表的时候被赋予主键约束(PRIMARY KEY)的列数据项。

  ③ 其次该主键必须要有自动增加约束(AUTO_INCREMENT),满足这两样才能使用JDBC来获取自动增加的主键值。

  操作:在使用Statement对象或者PreparedStatement对象执行SQL语句后,调用getGeneratedKeys()方法,该方法返回的是结果集ResultSet对象。这个结果集对象包含自动生成的键。具体请看相关API文档:

  

  下面就以一个案例来简单地说明在每次对数据库插入一个新数据时,能获取被赋予自动增加约束的主键的值。

例:

创建数据库和表:

create database jdbcdemo;

use jdbcdemo;

create table people(
id int primary key auto_increment,
name varchar(40)
)

  我们以新建的people表为例,其中的id列设为主键约束(PRIMARY KEY),另外还有更重要的自动增加约束(AUTO_INCREMENT)。

创建工程,在工程中导入数据库连接驱动的jar包。在【src】目录下新建一个database.properties文件,内容如下:

    driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcdemo
username=root
password=root

构建JDBC的工具类,包括注册驱动,获取连接,释放资源和连接等,这部分同《JDBC操作数据库的学习(2)》中相同,此处略。

向数据库中插入新数据并获取自动生成的主键demo代码如下:

 public void insert() throws SQLException {
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
try{
conn = JdbcUtils.getConnection(); //获取链接
String sql = "insert into people(name) values(?)"; //因为id为自动增长主键
st = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
st.setString(1, "Ding");
st.executeUpdate(); rs = st.getGeneratedKeys(); //获取自动增加主键
if(rs.next()) {
System.out.println(rs.getInt(1));
}
}finally{
JdbcUtils.release(conn, st, rs); //释放资源
}
}

  当这个方法第一次执行时,由于是首次插入数据,因此在people表中的第一行数据项为id列主键自动生成为数值“1”,而我们通过JDBC的程序操作显示的也确实是这样:

  

在数据库中查看添加的数据:

  

  当上面的方法再次执行时,众所周知数据库会将第二行数据项的主键id列自动加1,而我们通过结果集查看确实也是这样:

  

在数据库中查看添加的数据:

  

  这样通过每次执行插入语句,之后调用getGeneratedKeys()方法返回的结果集对象,就可以知道刚刚添加数据项的主键值,而这主键的值就可以给其他相关表来关联外键数据了。

使用JDBC获取能自动增加的主键的更多相关文章

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

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

  2. JDBC 获取被插入数据的主键ID值

    除了用存储过程还有以下方法可以获取:     static int create() throws SQLException {     Connection conn = null;     Pre ...

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

    获取数据库自动生成的主键 [孤立的技术是没有价值的],我们这里只是为了了解具体的实现步骤:我们在插入数据的时候,经常会需要获取我们插入的这一行数据对应的主键值. 具体的代码实现: /** * 获取数据 ...

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

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

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

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

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

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

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

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

  8. 获取mysql自主生成的主键

    一.sql语句 CREATE TABLE `testgeneratedkeys` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) ...

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

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

随机推荐

  1. Android中弹出对话框,AlertDialog关键代码

    写在这里便于以后查看. Android中弹出对话框的关键代码: btn01.setOnClickListener(new OnClickListener() { @Override public vo ...

  2. USACO Party Lamps 【Binary code solvution】【规律】

    写这道题目的时候遇到了一个令人诧异的问题,就是平台上跑来的结果和我本机跑起来的结果不一样. 后来Debug了之后才发现是我数组开小了,只开到100 的数组竟然都去访问他170位的地址肯定要跪成翔啊.. ...

  3. 基于visual Studio2013解决算法导论之018栈实现(基于链表)

     题目 用链表实现栈 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <time.h> #in ...

  4. eclipse处理长字符串拼接快捷方法类

    情景: 你在后台写sql文访问数据库时是不是要这样写 String sql="select a," +"b," +"c " +"f ...

  5. css3处理sprite背景图压缩来解决H5网页在手机浏览器下图标模糊的问题

    近期在负责一个微信H5 App项目,遇到一个郁闷的问题,手机浏览器查看网页时图标都是模糊的,有锯齿,电脑浏览器显示则是正常.大概知道是分辨率适配等类型的问题,后来网上查找了一些办法.大部分的解决方式都 ...

  6. UVa 10330 Power Transmission / 最大流

    最大流 这题有很多起点和终点 在取2个点(0和n+1) 作为唯一的起点和终点 此外每个点也有容量限制 建图时每条边上的容量为这条边和2个端的容量的最小值 然后EK就行 #include <cst ...

  7. vs2016 创建 vsto excel 文件项目的一个问题

    新工作需要些一个基于Excel开发一个工具,vs的 vsto 功能很好用,封装了基于开发office 开的一些工具.但是在实际使用时,创建项目总是报错,提示打开excel文件失败.项目是需要创建一个e ...

  8. JVM--常见的虚拟机回收算法

    Serial GC -XX:+UseSerialGC 这样就设置为了串行GC回收方式,这种方式在Client模式下是默认的. 一般是使用在单机程序,小内存,CPU个数少的机器上. 没有复杂的算法,只用 ...

  9. android intent收集转载汇总

    Intent intent = new Intent(Settings.ACTION_WIRELESS_SETTINGS);                 ComponentName comp = ...

  10. C语言,const

    const意味着“只读” ubunto下的实验 1). 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的.如果你曾花很多时间清理 ...