Spring Bootでデータベース(SQL Server)にアクセスする方法
Spring Bootでデータベース(SQL Server)にアクセスする方法をご紹介します。
条件
- Spring Boot 2.1.4
- SQL Server 2019 Express Edition
- Spring Data JPA
- maven
- Microsoft SQL Server Management Studio
事前準備1
データベース作成
まずは、SQL Serverにデータベースおよびテーブルを作成します。
Microsoft SQL Server Management Studioでサーバーに接続後、以下を選択します。
オブジェクトエクスプローラー > データベース > 新しいデータベース
任意のデータベース名を入力してOKボタンを押します。
(ここでは「testdb」としました。)
テーブル作成
メニューバーの新しいクエリボタンを押して、クエリ画面を開きます。
例として以下のようなテーブルを作成します。
create table weather ( id int NOT NULL IDENTITY (1, 1) primary key, -- ID name varchar(20), -- 地名 temperature int, -- 気温 humidity int, -- 湿度 );
データ追加
テーブルにデータを追加します。
insert into weather (name, temperature, humidity) values ('稚内', 1, 55), ('盛岡', 6, 53), ('前橋', 10, 40), ('名古屋', 12, 65), ('佐賀', 14, 67), ('那覇', 22, 69);
事前準備2
SQL Server認証モード
Microsoft SQL Server Management Studioで「SQL Server認証モード」を使用可能にします。
ログインユーザーについてパスワードの設定も行います。
詳細な手順は割愛しますが、以下のサイトを参考にさせて頂きました。
事前準備3
Sql ServerのTCP/IPの設定
Sql Server Configuration Managerで以下を設定/確認します。
(C:\Windows\System32 のSQLServerManager15.mscをダブルクリックで起動できます。)
- SQLEXPRESSのプロトコルでTCP/IPを「有効」にする。
- TCP/IPのプロパティ > IPアドレス > IPALL > TCP動的ポートのポート番号を確認する。(DB接続設定で使用します)
※TCP/IPを有効に設定変更した場合、Microsoft SQL Server Management StudioでSQLサーバーのサービスを再起動するのを忘れずに。
プロジェクト作成
プロジェクト構成
今回は以下のような構成としました。
DB接続情報の設定
「application.properties」に以下のような記述を追記します。(環境に応じて適宜変更してください。)
localhostの後のポート番号は、先ほど確認したTCP動的ポートのポート番号を設定します。
application.properties
spring.datasource.url=jdbc:sqlserver://localhost:51792;databaseName=testdb spring.datasource.username=sa spring.datasource.password=password
依存関係
「pom.xml」に以下の記述を追記します。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <scope>runtime</scope> </dependency>
今回は以下のようになりました。
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.2</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>helloSqlServer</artifactId> <version>0.0.1-SNAPSHOT</version> <name>helloSqlServer</name> <description>Example Project</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <scope>runtime</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
モデル
以下の通りとします。
Weather.java
package com.example.model; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "weather") public class Weather { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String name; private Integer temperature; private Integer humidity; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getTemperature() { return temperature; } public void setTemperature(Integer temperature) { this.temperature = temperature; } public Integer getHumidity() { return humidity; } public void setHumidity(Integer humidity) { this.humidity = humidity; } }
リポジトリ
以下の通りとします。
WeatherRepository.java
package com.example.repository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import com.example.model.Weather; @Repository public interface WeatherRepository extends JpaRepository<Weather, Integer> { }
サービス
以下の通りとします。
WeatherService.java
package com.example.services; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.example.model.Weather; import com.example.repository.WeatherRepository; @Service public class WeatherService { @Autowired WeatherRepository weatherRepository; /** * レコードを全件取得する。 * * @return */ public List<Weather> findAllWeatherData() { return weatherRepository.findAll(); } }
コントローラ
以下の通りとします。
HelloSqlServerController.java
package com.example; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import com.example.model.Weather; import com.example.services.WeatherService; @Controller public class HelloSqlServerController { @Autowired WeatherService weatherService; @RequestMapping("/") public String hello(Model model) { model.addAttribute("title", "SQL Serverから取得したデータ"); // 気象データの取得 List<Weather> weatherDataList = weatherService.findAllWeatherData(); model.addAttribute("weatherDataList", weatherDataList); return "index"; } }
テンプレート
以下の通りとします。
index.html
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8" /> <title></title> </head> <body> <p> <span th:text="${title}">Hello World!</span> </p> <table> <tr th:each="data : ${weatherDataList}" th:object="${data}"> <td th:text="*{id}"></td> <td th:text="*{name}"></td> <td th:text="*{temperature}"></td> <td th:text="*{humidity}"></td> </tr> </table> </body> </html>
実行結果
プロジェクトを右クリック > 実行 > Spring Bootアプリケーション で実行します。
ブラウザで以下のURLを開きます。
以下のように、SQL Serverからデータを読み込んで表示できることがわかります。
参考
Microsoft:SQL Serverダウンロード
https://www.microsoft.com/ja-jp/sql-server/sql-server-downloads
Code Java:Spring Boot Connect to Microsoft SQL Server Examples
https://www.codejava.net/frameworks/spring-boot/connect-to-microsoft-sql-server-examples
JavaからSQL Serverに接続する
http://www.ria-lab.com/archives/1218