JdbcTemplate の使い方です。
pom.xml
spring-jdbc, spring-context, そして利用しているデータベースに合わせた JDBC ドライバを依存ライブラリとして追加します。
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>example</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>example</name>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
</dependencies>
</project>
Dao を作成する
JdbcTemplate を使用する際は Spring の設定ファイルで DataSource を設定し、それを Dao に Inject するのが一般的です。JdbcTemplate は DataSource のセッターで作成されます。
package com.example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
@Repository
public class UserDao {
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public int count() {
return jdbcTemplate.queryForObject("select count(*) from users", Integer.class);
}
public User selectById(int id) {
return jdbcTemplate.queryForObject("select id, name from users where id = ?", new UserRowMapper(), id);
}
public List<User> selectAll() {
return jdbcTemplate.query("select id, name from users", new UserRowMapper());
}
}
/**
* ResultSetクラスからデータクラスへの変換は専用のRowMapperを定義します。
*/
class UserRowMapper implements RowMapper<User> {
@Override
public User mapRow(ResultSet resultSet, int i) throws SQLException {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
return new User(id, name);
}
}
package com.example;
public class User {
private int id;
private String name;
public User(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
設定
Java ベースでの設定例です。
package com.example;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.SimpleDriverDataSource;
import javax.sql.DataSource;
@Configuration
@ComponentScan
public class AppConfig {
@Bean
public DataSource getDataSource() {
SimpleDriverDataSource simpleDriverDataSource = new SimpleDriverDataSource();
simpleDriverDataSource.setDriverClass(com.mysql.cj.jdbc.Driver.class);
simpleDriverDataSource.setUrl("jdbc:mysql://localhost/testdb");
simpleDriverDataSource.setUsername("test_user");
simpleDriverDataSource.setPassword("test_pass");
return simpleDriverDataSource;
}
}
実行
package com.example;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Example {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
UserDao userDao = ctx.getBean(UserDao.class);
System.out.println("-- count");
System.out.println(userDao.count());
System.out.println("-- selectAll");
for (User user : userDao.selectAll()) {
System.out.println(user);
}
System.out.println("-- selectById");
System.out.println(userDao.selectById(1));
}
}
実行結果
-- count
2
-- selectAll
User{id=1, name='John'}
User{id=2, name='Paul'}
-- selectById
User{id=1, name='John'}