tyoshikawa1106のブログ

- Force.com Developer Blog -

Java:Spring JDBCをつかったDBアクセスについて

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"を指定していたのでその条件と一致するレコードが取得されます。