转载至:https://www.liyongzhen.com/

上一节课里我们学习通过PreparedStatement对象执行带参数的查询SQL和修改SQL。

这节课我们学习使用 PreparedStatement对象执行插入SQL,并且返回主键。

要返回主键,有一个前提,就是数据库表必须有主键自增。

下面的代码演示了执行插入SQL并返回主键的用法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
String sql = "INSERT INTO products(`ProductName`,`SupplierID`,`CategoryID`,`Unit`,`Price`)VALUES(?,?,?,?,?);";
PreparedStatement statement =
   connection.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS); //加入参数Statement.RETURN_GENERATED_KEYS
statement.setString(1, "milk"); //设置参数……
statement.setLong(2, 16);
statement.setLong(3, 1);
statement.setString(4, "500ml");
statement.setBigDecimal(5, new BigDecimal(5.6));
int value = statement.executeUpdate();
 
System.out.println("受影响的记录数 "+value);
 
int id = 0;
ResultSet rs = statement.getGeneratedKeys();  //得到生成的主键,主键放在ResultSet对象里
if(rs.next()){ //提取主键值
    id = rs.getInt(1);
}
 
System.out.println("主键 "+id);

关键技术:

  1. 在创建PreparedStatement对象时,指定一个常量Statement.RETURN_GENERATED_KEYS,表示有返回主键的能力。
  2. 执行SQL语句时,仍然调用executeUpdate()方法。另外要调用getGeneratedKeys()方法,返回ResultSet对象。 ResultSet对象是结果集,存储查询结果,主键就保存在这里。
  3. 第三步,从ResultSet对象里提取主键。

完整代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
public class Insert {
 
    public static void main(String[] args) {
        String url = "jdbc:mysql://127.0.0.1:3306/northwind";
        String user = "northwind";
        String password = "northwind";
 
        try (Connection connection = DriverManager.getConnection(url, user, password)) {
 
            String sql = "INSERT INTO products(`ProductName`,`SupplierID`,`CategoryID`,`Unit`,`Price`)VALUES(?,?,?,?,?);";
            PreparedStatement statement = connection.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
            statement.setString(1, "milk");
            statement.setLong(2, 16);
            statement.setLong(3, 1);
            statement.setString(4, "500ml");
            statement.setBigDecimal(5, new BigDecimal(5.6));
            int value = statement.executeUpdate();
             
            System.out.println("受影响的记录数 "+value);
             
            int id = 0;
            ResultSet rs = statement.getGeneratedKeys();
            if(rs.next()){
                id = rs.getInt(1);
            }
             
            System.out.println("主键 "+id);
 
            rs.close();
            statement.close(); // 关闭statement,释资源
 
        } catch (SQLException e) {
            e.printStackTrace();
        }
 
    }
 
}

JDBC 返回主键的更多相关文章

  1. MyBatis返回主键,MyBatis Insert操作返回主键

    MyBatis返回主键,MyBatis Insert操作返回主键 >>>>>>>>>>>>>>>>> ...

  2. MyBatis在Oracle中插入数据并返回主键的问题解决

    引言:  在MyBatis中,希望在Oracle中插入数据之时,同一时候返回主键值,而非插入的条数... 环境:MyBatis 3.2 , Oracle. Spring 3.2   SQL Snipp ...

  3. [oracle] 如何使用myBatis在数据库中插入数据并返回主键

    在MyBatis中,希望在Oracle中插入数据的同时返回主键值,而非插入的条数. ① oracle使用 selectKey. U_USER_INFO_SEQ 是在数据库中定义好的这张表关联的序列se ...

  4. mybatis 08: 返回主键值的insert操作 + 利用UUID获取字符串(了解)

    返回主键值的insert操作 应用背景 图示说明 在上述业务背景下,涉及两张数据表的关联操作:用户表 + 用户积分表 传统操作:在对用户表执行完插入语句后,再次查询该用户的uid,将该uid作为外键, ...

  5. Java MyBatis 插入数据库返回主键

    最近在搞一个电商系统中由于业务需求,需要在插入一条产品信息后返回产品Id,刚开始遇到一些坑,这里做下笔记,以防今后忘记. 类似下面这段代码一样获取插入后的主键 User user = new User ...

  6. mybatis批量插入返回主键问题

    今天整合mybatis时候用到返回主键问题,批量插入总是返回不了主键还报错. 记录入下: pom版本: <mybatis.version>3.2.6</mybatis.version ...

  7. 开启事务时mybatis返回主键id

    先说一下没有注解的 先给出实体类: public class City { private int city_id; private String city_name; public int getC ...

  8. MyBatis框架——mybatis插入数据返回主键(mysql、oracle)

    向数据库中插入数据时,大多数情况都会使用自增列或者UUID做为主键.主键的值都是插入之前无法知道的,但很多情况下我们在插入数据后需要使用刚刚插入数据的主键,比如向两张关联表A.B中插入数据(A的主键是 ...

  9. MyBatis insert返回主键(sqlserver2008)

    mybatis insert返回主键(sqlserver2008)   MyBatisXML配置,下面两种方式都行 方式1: <insert id="insert" para ...

随机推荐

  1. Android艺术——Bitmap高效加载和缓存代码分析(2)

    Bitmap的加载与缓存代码分析: 图片的压缩 比如有一张1024*768像素的图像要被载入内存,然而最终你要用到的图片大小其实只有128*96,那么我们会浪费很大一部分内存,这显然是没有必要的,下面 ...

  2. SELECT list is not in GROUP BY clause and contains nonaggregated column

    报错如下: Expression # of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘sss.m ...

  3. JarvisOJ Basic 握手包

    得到的是一个.cap文件,我看着好像可以用wireshark打开,就试了一下 报错了,pcapfix上,得到了一个新的.cap文件,用wireshark打开,发现分析不出来 查了一下,有破解握手包的专 ...

  4. python之常用模块二(hashlib logging configparser)

    摘要:hashlib ***** logging ***** configparser * 一.hashlib模块 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 摘要算法 ...

  5. 【APIO2016】【UOJ205】【LOJ2568】烟花表演 可合并堆

    题目大意 有一棵树,每条边都有一个边权,现在你要修改边权,使得修改后根到所有叶子的距离相等. 要求所有边权非负. 修改的代价为\(\lvert\)每条边修改前的边权\(-\)修改后的边权\(\rver ...

  6. mongodb中比较级查询条件:($lt $lte $gt $gte)(大于、小于)、查找条件

    查询表中学生年级大于20,如下: db.getCollection('student').find({'age':{'$gt':'20'}}) $lt    <   (less  than ) ...

  7. Django admin修改密码

    django的admin用户被我多动症一样的测试,给密码弄丢了,需要重置. 从数据库重置的可能性为0,因为django对于密码有保护策略.考虑从运行程序的地方进行重置: 1.在程序的文件夹下,执行这样 ...

  8. 静态IP设置

    先查看自动网络的ip地址,然后设置 cmd进入DOS输入命令:ipconfig /all 设置固定IP

  9. 第十二节:Lambda、linq、SQL的相爱相杀(1)

    一. 谈情怀  Lambda.Linq.SQL伴随着我的开发一年又一年,但它们三者并没有此消彼长,各自占有这一定的比重,起着不可替代的作用. 相信我们最先接触的应该就是SQL了,凡是科班出身的人,大学 ...

  10. Dijkstra算法的C++实现

    Dijkstra算法是在图中寻找两顶点最短路径的算法.   下面以下图有向图为例,说明其基本思想. 上图为转化为邻接矩阵存储:     现在我要寻找1点到其他点的最短距离以及路径: a)1点到各点的距 ...