在此页面上,我们将学习如何在Spring JDBC中获取自动生成的ID。在Spring JDBC 中,我们可以使用JdbcTemplate方法和SimpleJdbcInsert方法来执行 SQL 查询,并将自动生成的密钥作为KeyHolder返回。
KeyHolder是用于检索自动生成的密钥的接口。KeyHolder由 JDBC 插入语句返回。通常,键作为List包含每行键的键的Map键返回。KeyHolder具有以下方法。
getKey() :从第一张地图中检索第一个项目。
getKeyAs(Class
getKeyList() :返回对包含密钥的列表的引用。
getKeys() :检索第一个密钥映射。
从春季文档中查找方法声明。JdbcTemplate.update
int update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder) throws DataAccessException
1. 该方法使用PreparedStatementCreator发出更新语句。
2.生成的密钥将被放入给定的KeyHolder.
3. 该方法返回受影响的行数。
示例 :
- String sql = "insert into person (name, age) values (?, ?)";
- KeyHolder keyHolder = new GeneratedKeyHolder();
- jdbcTemplate.update(connection -> {
- PreparedStatement pst = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
- pst.setString(1, p.getName());
- pst.setInt(2, p.getAge());
- return pst;
- }, keyHolder);
- int id = keyHolder.getKey().intValue();
SimpleJdbcInsert为工作台提供简单的插入功能。我们需要提供的只是表的名称和包含列名和列值的Map。查找执行SimpleJdbcInsert查询并返回自动生成的密钥的方法。
- Number executeAndReturnKey(Map
args) - Number executeAndReturnKey(SqlParameterSource parameterSource)
- KeyHolder executeAndReturnKeyHolder(Map
args) - KeyHolder executeAndReturnKeyHolder(SqlParameterSource parameterSource)
示例:
在这里,我们使用JdbcTemplate.update和KeyHolder检索自动生成的密钥。
- Map
params = new HashMap(); - params.put("name", p.getName());
- params.put("age", p.getAge());
-
- KeyHolder keyHolder = simpleJdbcInsert
- .withTableName("person")
- .usingColumns("name", "age")
- .usingGeneratedKeyColumns("id")
- .withoutTableColumnMetaDataAccess()
- .executeAndReturnKeyHolder(params);
- int id = keyHolder.getKey().intValue();
表:person
- CREATE TABLE `person` (
- `id` INT(5) NOT NULL AUTO_INCREMENT,
- `name` VARCHAR(100) NOT NULL,
- `age` INT(3) NOT NULL,
- PRIMARY KEY (`id`)
- )
PersonDAO.java
- package com.concretepage;
- import java.sql.PreparedStatement;
- import java.sql.Statement;
- import java.util.HashMap;
- import java.util.Map;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.jdbc.core.JdbcTemplate;
- import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
- import org.springframework.jdbc.support.GeneratedKeyHolder;
- import org.springframework.jdbc.support.KeyHolder;
- import org.springframework.stereotype.Repository;
-
- @Repository
- public class PersonDAO {
- @Autowired
- private JdbcTemplate jdbcTemplate;
-
- private SimpleJdbcInsert simpleJdbcInsert;
-
- @Autowired
- private void setSimpleJdbcInsert(JdbcTemplate jdbcTemplate) {
- simpleJdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
- }
-
- public void addPersonUsingJdbcTemplate(Person p) {
- String sql = "insert into person (name, age) values (?, ?)";
- KeyHolder keyHolder = new GeneratedKeyHolder();
- jdbcTemplate.update(connection -> {
- PreparedStatement pst = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
- pst.setString(1, p.getName());
- pst.setInt(2, p.getAge());
- return pst;
- }, keyHolder);
- int id = keyHolder.getKey().intValue();
- p.setId(id);
- System.out.println(id);
- }
-
- public void addPersonUsingSimpleJdbcInsert(Person p) {
- Map
params = new HashMap(); - params.put("name", p.getName());
- params.put("age", p.getAge());
-
- KeyHolder keyHolder = simpleJdbcInsert
- .withTableName("person")
- .usingColumns("name", "age")
- .usingGeneratedKeyColumns("id")
- .withoutTableColumnMetaDataAccess()
- .executeAndReturnKeyHolder(params);
- int id = keyHolder.getKey().intValue();
- p.setId(id);
- System.out.println(id);
- }
- }
application.properties
- spring.datasource.url=jdbc:mysql://localhost:3306/concretepage
- spring.datasource.username=root
- spring.datasource.password=cp
- spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
Person.java
- package com.concretepage;
- public class Person {
- private int id;
- private String name;
- private int age;
- public Person(String name, int age) {
- this.name = name;
- this.age = age;
- }
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public int getAge() {
- return age;
- }
- @Override
- public String toString() {
- return id + " - " + name + " - " + age;
- }
- }
pom.xml
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
4.0.0 -
com.concretepage -
soap-ws -
0.0.1-SNAPSHOT -
jar -
spring-demo -
Spring Demo Application -
-
org.springframework.boot -
spring-boot-starter-parent -
2.7.1 -
-
-
-
11 -
-
-
-
org.springframework.boot -
spring-boot-starter -
-
-
org.springframework.boot -
spring-boot-starter-jdbc -
-
-
mysql -
mysql-connector-java -
8.0.30 -
-
-
-
-
-
org.springframework.boot -
spring-boot-maven-plugin -
-
-
MyApplication.java
- package com.concretepage;
-
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.context.ApplicationContext;
-
- @SpringBootApplication
- public class MyApplication {
- public static void main(String[] args) {
- ApplicationContext ctx = SpringApplication.run(MyApplication.class, args);
- PersonDAO personDAO = ctx.getBean(PersonDAO.class);
-
- Person p1 = new Person("Mohan", 25);
- personDAO.addPersonUsingJdbcTemplate(p1);
- System.out.println(p1);
- Person p2 = new Person("Shiva", 30);
- personDAO.addPersonUsingSimpleJdbcInsert(p2);
- System.out.println(p2);
- }
- }
引用
Interface KeyHolder
Class JdbcTemplate
Class SimpleJdbcInsert
下载源代码
how-to-get-auto-generated-id-in-spring-jdbc.zip