Spring Jdbc— KeyHolder to retrieve database auto-generated keys

Prateek
2 min readFeb 12, 2022

In this example, we will make the use of KeyHolder to immediately return the value of primary key.

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>spring-jdbc</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-jdbc</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>

</project>

Person.java — It’s model class.

@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Person {
private Long id;
private String firstName;
private String lastName;
private String phone;
private String email;
private String address;
}

PersonDao.java —

PersonDaoImpl.javaimport com.example.springjdbc.model.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Service;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

@Service
public class PersonDaoImpl implements PersonDao {
@Autowired
private JdbcTemplate jdbcTemplate;

@Override
public void savePersons() {
String SQL = "INSERT INTO test.person " +
"(first_name, last_name, phone, email, address) " +
"VALUES(?, ?, ?, ?, ?)";


KeyHolder keyHolder = new GeneratedKeyHolder();

jdbcTemplate.update(con -> {
PreparedStatement ps = con.prepareStatement(SQL, new String[]{"id"});
ps.setString(1, "Mamta");
ps.setString(2, "Mohadikar");
ps.setString(3, "234-567-9999");
ps.setString(4, "mamta.mohadikar@gmail.com");
ps.setString(5, "Daryapur, Amravati");
return ps;
}, keyHolder);


Number key = keyHolder.getKey();
System.out.println("Newly persisted customer generated id: " + key.longValue());
System.out.println("-- loading customer by id --");
System.out.println(findByPersonId(key.longValue()));
}

private Person toPerson(ResultSet resultSet) throws SQLException {
Person person = new Person();
person.setId(resultSet.getLong("id"));
person.setFirstName(resultSet.getString("first_name"));
person.setLastName(resultSet.getString("last_name"));
person.setPhone(resultSet.getString("phone"));
person.setEmail(resultSet.getString("email"));
person.setAddress(resultSet.getString("address"));
return person;
}

@Override
public Person findByPersonId(Long id) {
String sql = "select * from person where id = ?";
List<Person> personList = jdbcTemplate.query(sql, new RowMapper<Person>() {
@Override
public Person mapRow(ResultSet rs, int rowNum) throws SQLException {
return toPerson(rs);
}
}, new Object[]{id});

if (personList.size() == 1) {
return personList.get(0);
}
return null;
}
}

MainApp.java

import com.example.springjdbc.dao.PersonDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringJdbcApplication implements CommandLineRunner {

public static void main(String[] args) {
SpringApplication.run(SpringJdbcApplication.class, args);
}

@Autowired
private PersonDao personDao;

@Override
public void run(String... args) throws Exception {
personDao.savePersons();
}
}

--

--