在此页面上,我们将学习如何在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
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