Java Spring Bootの開発を行う際にちょっとしたデータベースを簡単に用意できるSpring JDBCというのがあるみたいなので使い方を勉強しました。
pom.xmlの設定
Spring Bootを利用するにはpom.xmlで次の宣言を行います。
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> </dependency> </dependencies>
JdbcTemplateについて
JdbcTemplateをラップしたNameedParameterJdbcTempleteというクラスを利用すればいいみたいです。これを使用するには次のようにimportを行います。
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.jdbc.core.namedparam.SqlParameterSource;
SQLの実行
簡単なSQLの実行処理です。
String sql = "SELECT 1"; SqlParameterSource param = new MapSqlParameterSource(); Integer result = jdbcTemplate.queryForObject(sql, param, Integer.class);
MapSqlParameterSourceにはSQLで使用するパラメータを指定します。(上記は未指定で実行)
queryForObjectは『SQL文』、『パラメータ』、『戻り値のクラス』を指定します。
上記クエリを実行すると『1』が返ってきます。
result = 1
ここまでのサンプル
package com.example; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.jdbc.core.namedparam.SqlParameterSource; @EnableAutoConfiguration public class App implements CommandLineRunner { @Autowired NamedParameterJdbcTemplate jdbcTemplate; // (1) @Override public void run(String... strings) throws Exception { String sql = "SELECT 1"; SqlParameterSource param = new MapSqlParameterSource(); Integer result = jdbcTemplate.queryForObject(sql, param, Integer.class); System.out.println("result = " + result); } public static void main(String[] args) { SpringApplication.run(App.class, args); } }
パラメータありの場合
MapSqlParameterSourceを指定した場合の書き方です。
@Override public void run(String... strings) throws Exception { String sql = "SELECT :a + :b"; SqlParameterSource param = new MapSqlParameterSource() .addValue("a", 100) .addValue("b", 200); Integer result = jdbcTemplate.queryForObject(sql, param, Integer.class); System.out.println("result = " + result); }
これで『result = 300』と取得できます。
実際の使用例
最後にCustomersテーブルから値を取得する場合の例です。
Customer.javaを用意
package com.example.domain; import lombok.AllArgsConstructor; import lombok.Data; @Data @AllArgsConstructor public class Customer { private Integer id; private String firstName; private String lastName; }
App.javaを用意
package com.example; import com.example.domain.Customer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.jdbc.core.namedparam.SqlParameterSource; import java.sql.ResultSet; import java.sql.SQLException; @EnableAutoConfiguration public class App implements CommandLineRunner { @Autowired NamedParameterJdbcTemplate jdbcTemplate; @Override public void run(String... strings) throws Exception { String sql = "SELECT id, first_name, last_name FROM customers WHERE id = :id"; SqlParameterSource param = new MapSqlParameterSource() .addValue("id", 1); Customer result = jdbcTemplate.queryForObject(sql, param, new RowMapper<Customer>() { @Override public Customer mapRow(ResultSet rs, int rowNum) throws SQLException { return new Customer(rs.getInt("id"), rs.getString("first_name"), rs.getString("last_name")); } }); System.out.println("result = " + result); } public static void main(String[] args) { SpringApplication.run(App.class, args); } }
データベースの作成
src/main/resourcesフォルダに「database.sql」ファイルと「schema.sql」を用意します。
database.sql
INSERT INTO customers(first_name, last_name) VALUES('Nobita', 'Nobi'); INSERT INTO customers(first_name, last_name) VALUES('Takeshi', 'Goda'); INSERT INTO customers(first_name, last_name) VALUES('Suneo', 'Honekawa'); INSERT INTO customers(first_name, last_name) VALUES('Shizuka', 'Minamoto');
schema.sql
CREATE table customers(id int primary key auto_increment, first_name varchar(30), last_name varchar(30));
上記、2つのファイルはSpring Bootが自動で読み込んで実行してくれます。
実行結果
これを実行すると次の結果が返ってきます。
result = Customer(id=1, firstName=Nobita, lastName=Nobi)
※パラメータにid="1"を指定していたのでその条件と一致するレコードが取得されます。