Spring BootでMySQLに接続する
Spring BootでMySQLに接続してみます。
まずpom.xmlを変更します。
<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>
次にMySQLに接続する情報を、src/main/resources/配下にapplication.propertiesというファイル名を作成し、以下情報を記述します。
spring.datasource.url=jdbc:mysql://ホスト名:3306/testdb spring.datasource.username=test spring.datasource.password=test spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
ホスト名は、localhostか他PCの場合、そのIPアドレスを指定します。今回はMySQLをインストールしているPCを別のPCにしています。
2019/01/09追記
では、MySQLに接続してコンソールに結果を表示するプログラムです。
package com.mysql; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.ComponentScan; import org.springframework.jdbc.core.JdbcTemplate; @EnableAutoConfiguration @ComponentScan public class App{ @Autowired private JdbcTemplate jdbc; public void method() { List<Map<String, Object>> list = jdbc.queryForList("SELECT * FROM TBL_CUSTOMER"); list.forEach(System.out::println); } public static void main(String[] args) { try (ConfigurableApplicationContext ctx = SpringApplication.run(App.class, args)) { App m = ctx.getBean(App.class); m.method(); } } }
プロジェクトを右クリックして、「実行」-「Spring boot app」で実行できます。
この時、以下のようなエラーが出る場合があるかもしれません。
Cannot determine embedded database driver class for database type NONE
この場合、ググって調べましたがpom.xmlに以下を追記するとエラーが解消されるとのことでした。
<dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>test</scope> </dependency>
それでもエラーが出た場合はとりあえず他PCのファイアウォールを無効にしてください。
これでコンソールにSQLの結果が表示されるはずです。
※MySQLのテーブルについては「MySQLのテーブル作成と存在確認」参照
普通に全件取得するSQLを記述しましたがプレースホルダを使用してSQLを作成することも可能です。
package com.mysql; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.ComponentScan; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.jdbc.core.namedparam.SqlParameterSource; @EnableAutoConfiguration @ComponentScan public class App{ @Autowired private NamedParameterJdbcTemplate jdbc; public void method() { // プレースホルダ SqlParameterSource param = new MapSqlParameterSource().addValue("p",2); String name = jdbc.queryForObject("SELECT COUNT(*) FROM TBL_CUSTOMER WHERE ID=:p",param,String.class); System.out.println("count = " + name); } public static void main(String[] args) { try (ConfigurableApplicationContext ctx = SpringApplication.run(App.class, args)) { App m = ctx.getBean(App.class); m.method(); } } }
JdbcTemplateをNamedParameterJdbcTemplateに変えています。
MapSqlParameterSource().addValue()の第一引数にプレースホルダ、第二引数に置換文字を指定するだけです。
上記は、カウントを取得するだけですが、idとfirst_nameを取得して表示したい場合があるとします。
その場合は、RowMapperを使用します。
package com.mysql; import java.sql.ResultSet; import java.sql.SQLException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.ComponentScan; 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 com.mysql.domain.Customer; @EnableAutoConfiguration @ComponentScan public class App{ @Autowired private NamedParameterJdbcTemplate jdbc; public void method() { // プレースホルダ SqlParameterSource param = new MapSqlParameterSource().addValue("p",1); // 匿名クラスにする Customer result = jdbc.queryForObject("SELECT ID , FIRSTNAME,LASTNAME FROM TBL_CUSTOMER WHERE ID=:p",param, new RowMapper<Customer>(){ @Override public Customer mapRow(ResultSet rs,int rownum) throws SQLException{ // コンストラクタ return new Customer(rs.getInt("ID"),rs.getString("FIRSTNAME"),rs.getString("LASTNAME")); } } ); System.out.println("result = " + result); } public static void main(String[] args) { try (ConfigurableApplicationContext ctx = SpringApplication.run(App.class, args)) { App m = ctx.getBean(App.class); m.method(); } } }
結果は以下になります。
result = Customer(id=1, firstname=yamada, lastname=taro)
mysql-connector-java → mysql-connector-j
Note: This artifact was moved to:
com.mysql » mysql-connector-j
MySQL Connector/J artifacts moved to reverse-DNS compliant Maven 2+ coordinates.
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント