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認証モード」を使用可能にします。

ログインユーザーについてパスワードの設定も行います。

詳細な手順は割愛しますが、以下のサイトを参考にさせて頂きました。

SQLServer認証のユーザーを作成してみた

事前準備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を開きます。

http://localhost:8080/

以下のように、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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です