• 如何在Spring JDBC 中获取自动生成的 ID


     在此页面上,我们将学习如何在Spring JDBC中获取自动生成的ID。在Spring  JDBC 中,我们可以使用JdbcTemplate方法和SimpleJdbcInsert方法来执行 SQL 查询,并将自动生成的密钥作为KeyHolder返回。

    KeyHolder

    KeyHolder是用于检索自动生成的密钥的接口。​​​​​​​KeyHolder由 JDBC 插入语句返回。通常,键作为List包含每行键的键的​​​​​​​​​​​​​​Map键返回。
    KeyHolder具有以下方法。
    getKey() :从第一张地图中检索第一个项目。
    getKeyAs(Class keyType)  从给定键类型的第一个映射中检索第一个项目。
    getKeyList()  :返回对包含密钥的列表的引用。
    getKeys() :检索第一个密钥映射。​​​​​​​


     

    使用 Jdbc 模板更新

    从春季文档中查找方法声明。JdbcTemplate.update

    int update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder) throws DataAccessException 

    1. 该方法使用PreparedStatementCreator发出更新语句。
    2.生成的密钥将被放入给定的KeyHolder.
    3. 该方法返回受影响的行数。

    示例 :​​​​​​​

    1. String sql = "insert into person (name, age) values (?, ?)";
    2. KeyHolder keyHolder = new GeneratedKeyHolder();
    3. jdbcTemplate.update(connection -> {
    4. PreparedStatement pst = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
    5. pst.setString(1, p.getName());
    6. pst.setInt(2, p.getAge());
    7. return pst;
    8. }, keyHolder);
    9. int id = keyHolder.getKey().intValue();

    使用简单Jdbc插入

    SimpleJdbcInsert为工作台提供简单的插入功能。我们需要提供的只是表的名称和包含列名和列值的​​​​​​​Map。查找执行SimpleJdbcInsert查询并返回自动生成的密钥的方法。​​​​​​​

    1. Number executeAndReturnKey(Map args)
    2. Number executeAndReturnKey(SqlParameterSource parameterSource)
    3. KeyHolder executeAndReturnKeyHolder(Map args)
    4. KeyHolder executeAndReturnKeyHolder(SqlParameterSource parameterSource)

    示例
    在这里,我们使用JdbcTemplate.update和​​​​​​​KeyHolder检索自动生成的密钥。

    1. Map params = new HashMap();
    2. params.put("name", p.getName());
    3. params.put("age", p.getAge());
    4. KeyHolder keyHolder = simpleJdbcInsert
    5. .withTableName("person")
    6. .usingColumns("name", "age")
    7. .usingGeneratedKeyColumns("id")
    8. .withoutTableColumnMetaDataAccess()
    9. .executeAndReturnKeyHolder(params);
    10. int id = keyHolder.getKey().intValue();

    完整示例

    表:person

    1. CREATE TABLE `person` (
    2. `id` INT(5) NOT NULL AUTO_INCREMENT,
    3. `name` VARCHAR(100) NOT NULL,
    4. `age` INT(3) NOT NULL,
    5. PRIMARY KEY (`id`)
    6. )

    PersonDAO.java

    1. package com.concretepage;
    2. import java.sql.PreparedStatement;
    3. import java.sql.Statement;
    4. import java.util.HashMap;
    5. import java.util.Map;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.jdbc.core.JdbcTemplate;
    8. import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
    9. import org.springframework.jdbc.support.GeneratedKeyHolder;
    10. import org.springframework.jdbc.support.KeyHolder;
    11. import org.springframework.stereotype.Repository;
    12. @Repository
    13. public class PersonDAO {
    14. @Autowired
    15. private JdbcTemplate jdbcTemplate;
    16. private SimpleJdbcInsert simpleJdbcInsert;
    17. @Autowired
    18. private void setSimpleJdbcInsert(JdbcTemplate jdbcTemplate) {
    19. simpleJdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
    20. }
    21. public void addPersonUsingJdbcTemplate(Person p) {
    22. String sql = "insert into person (name, age) values (?, ?)";
    23. KeyHolder keyHolder = new GeneratedKeyHolder();
    24. jdbcTemplate.update(connection -> {
    25. PreparedStatement pst = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
    26. pst.setString(1, p.getName());
    27. pst.setInt(2, p.getAge());
    28. return pst;
    29. }, keyHolder);
    30. int id = keyHolder.getKey().intValue();
    31. p.setId(id);
    32. System.out.println(id);
    33. }
    34. public void addPersonUsingSimpleJdbcInsert(Person p) {
    35. Map params = new HashMap();
    36. params.put("name", p.getName());
    37. params.put("age", p.getAge());
    38. KeyHolder keyHolder = simpleJdbcInsert
    39. .withTableName("person")
    40. .usingColumns("name", "age")
    41. .usingGeneratedKeyColumns("id")
    42. .withoutTableColumnMetaDataAccess()
    43. .executeAndReturnKeyHolder(params);
    44. int id = keyHolder.getKey().intValue();
    45. p.setId(id);
    46. System.out.println(id);
    47. }
    48. }

    application.properties

    1. spring.datasource.url=jdbc:mysql://localhost:3306/concretepage
    2. spring.datasource.username=root
    3. spring.datasource.password=cp
    4. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

    Person.java

    1. package com.concretepage;
    2. public class Person {
    3. private int id;
    4. private String name;
    5. private int age;
    6. public Person(String name, int age) {
    7. this.name = name;
    8. this.age = age;
    9. }
    10. public int getId() {
    11. return id;
    12. }
    13. public void setId(int id) {
    14. this.id = id;
    15. }
    16. public String getName() {
    17. return name;
    18. }
    19. public int getAge() {
    20. return age;
    21. }
    22. @Override
    23. public String toString() {
    24. return id + " - " + name + " - " + age;
    25. }
    26. }

    pom.xml

    1. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    3. 4.0.0
    4. com.concretepage
    5. soap-ws
    6. 0.0.1-SNAPSHOT
    7. jar
    8. spring-demo
    9. Spring Demo Application
    10. org.springframework.boot
    11. spring-boot-starter-parent
    12. 2.7.1
    13. 11
    14. org.springframework.boot
    15. spring-boot-starter
    16. org.springframework.boot
    17. spring-boot-starter-jdbc
    18. mysql
    19. mysql-connector-java
    20. 8.0.30
    21. org.springframework.boot
    22. spring-boot-maven-plugin

    MyApplication.java

    1. package com.concretepage;
    2. import org.springframework.boot.SpringApplication;
    3. import org.springframework.boot.autoconfigure.SpringBootApplication;
    4. import org.springframework.context.ApplicationContext;
    5. @SpringBootApplication
    6. public class MyApplication {
    7. public static void main(String[] args) {
    8. ApplicationContext ctx = SpringApplication.run(MyApplication.class, args);
    9. PersonDAO personDAO = ctx.getBean(PersonDAO.class);
    10. Person p1 = new Person("Mohan", 25);
    11. personDAO.addPersonUsingJdbcTemplate(p1);
    12. System.out.println(p1);
    13. Person p2 = new Person("Shiva", 30);
    14. personDAO.addPersonUsingSimpleJdbcInsert(p2);
    15. System.out.println(p2);
    16. }
    17. }

    引用

    Interface KeyHolder
    Class JdbcTemplate
    Class SimpleJdbcInsert

    下载源代码

    how-to-get-auto-generated-id-in-spring-jdbc.zip

  • 相关阅读:
    git项目如何打patch以及打patch的注意事项
    使用C语言实现各种排序(总结)
    什么是 SRE?一文详解 SRE 运维体系
    java.util.EnumSet complementOf (EnumSet<E> s)方法具有什么功能呢?
    CodeTON Round 2 (Div. 1 + Div. 2, Rated, Prizes) A.B.C
    LOSER的预习笔记——————————清除setlinterval定时器
    Spring MVC(一)— DispatcherServlet
    每天5分钟快速玩转机器学习算法:支持向量机SVM的优势和缺点
    C# 形状的绘制
    PMP每日一练 | 考试不迷路-11.04(包含敏捷+多选)
  • 原文地址:https://blog.csdn.net/allway2/article/details/127180604