Skip to content

Springboot

SpringBoot は Pivotal チームが提供した新しいフレームワークです。設計目的は、Spring アプリケーションの初期構築と開発過程を簡単にすることです。

クイックスタート

Step 1:新しいモジュールを作成する

Spring boot プログラムを作成する場合は、Spring Initializr を選択します。

Step 2:必要な技術セットを選択する

Web プロジェクトを開発するため、Spring Web 技術を選択します。

Step 3:Controller クラスを開発する

java
@RestController
@RequestMapping("/user")
public class UserController {
    @GetMapping("/{id}")
    public String getById(@PathVariable Integer id) {
        System.out.println("Hello Spring boot" + id);
        return "Hello Spring boot";
    }
}

Step 4:Application クラスを実行する

コンソールに次のような内容が出力されれば、プログラムは正常に起動しています。

この入門例から分かるように、多くの設定作業が省略され、プロジェクトの初期構築がかなり簡単になります。

クイック起動

Spring Boot はクイック起動方式も提供しています。追加ソフトウェアをインストールする必要はなく、対応バージョンの Java があれば実行できます。

まず開発者が Spring Boot プロジェクトをパッケージ化します(Maven の package コマンドを実行)。
他の人はコマンドラインで java -jar bootProjectName.jar を実行するだけで、プログラムを起動できます。

YML 設定ファイル形式

三つのファイル形式:

  • application.properties
  • application.yml
  • application.yaml

優先度:.properties > .yml > .yaml

今後は主に yml 形式の設定ファイルを使います。

YML(または YAML、YAML Ain't Markup Language)は、よく使われるデータシリアライズ形式です。特に設定ファイルに適しています。人が読み書きしやすく、簡単なデータ表現もできます。

基本構文

  1. 大文字と小文字を区別する。
  2. 値の前には区切りとしてスペースが必要。
  3. インデントで階層を表す。Tab は使えず、Space だけを使う。一般的には 2 個または 4 個。
  4. スペースの数は重要ではない。同じ階層の要素が左揃えであればよい。
  5. # はコメントを表し、その行をコメントにする。

データ形式

  1. コロンでキーと値を分ける。
yml
person:  
  name: John Doe  
  age: 30  
  city: New York
  1. 配列(リスト):ハイフンでリスト項目を表し、各項目は一行に書く。
yml
hobbies:  
  - reading  
  - sports  
  - movies  
# またはインライン形式  
hobbies: [reading, sports, movies]
  1. 文字列
    • 通常文字列:そのまま書く。引用符は不要。
    • ダブルクォート文字列:文字列内の特殊文字をエスケープしない。
    • シングルクォート文字列:文字列内の特殊文字をエスケープする。
  2. 複数行文字列
    • 改行を保持する複数行文字列:| を使う。
yml
description: |  
  This is a multi-line  
  string with newlines preserved.
* 改行を折りたたむ複数行文字列:`>` を使う。
yml
poem: >  
  Roses are red,  
  violets are blue.  
  Sugar is sweet,  
  and so are you.

実例

yml
# 現在のサーバー情報を設定する
server:
 port: 8080
 address: 127.0.0.1
# データソースを設定する
spring:
 datasource:
  type: com.alibaba.druid.pool.DruidDataSource
  driverClassName: com.mysql.cj.jdbc.Driver
  druid:
   # メインデータソース
   master:
   url: jdbc:mysql://localhost:3306/dataBase
   username: root
   password: root

読み取り方式

  1. 方式一

クラス内に対応する private メンバ変数を作成し、@Value アノテーションで値を注入します。

yml
lesson: "张三"
java
@Value("@{lesson}")
private String name;
  1. 方式二

自動装配を使い、get() メソッドで取得します。

java
@Autowired
private Environment environment;
  1. 方式三

対応するエンティティクラスを作成し、そのクラスを Bean として宣言します。その後、@ConfigurationProperties() で受け取ります。

複数環境設定

実際の開発では、各工程で設定情報を変える必要があります。そのため、複数の環境を設定し、必要に応じて切り替えます。
例:本番環境、開発環境、テスト環境。

yml ファイルでは、異なる環境の間に三つのハイフン --- を追加します。

yml
# 起動環境を設定する
spring:
  profiles:
    active: dev

---
# 本番環境
spring:
  profiles: pro

server:
  port: 8081
---
# 開発環境
spring:
  profiles: dev

server:
  port: 8082
---
# テスト環境
spring:
  profiles: test

server:
  port: 8083

後で jar パッケージを使うとき、コマンドラインで直接環境を指定できます。

powershell
java -jar springbootName.jar --spring.profiles.active=dev
java -jar springbootName.jar --spring.profiles.active=pro
java -jar springbootName.jar --spring.profiles.active=test

Maven の環境との互換

yml 設定ファイルのデフォルト環境が dev で、maven のデフォルト環境が pro の場合、コマンドラインで jar を起動すると、Maven 側のデフォルトである pro が起動します。

そのため、yml のデフォルト環境は、できるだけ pom のプロパティから読み取る形にします。

xml
<!--Mavenで複数環境プロパティを設定する-->
<profiles>
    <profile>
        <id>dev env</id>
        <properties>
        	<profile.active>dev</profile.active>
        </properties>
        <activation>
        	<activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <profile>
        <id>pro env</id>
        <properties>
        	<profile.active>pro</profile.active>
        </properties>
    </profile>
    <profile>
        <id>test env</id>
        <properties>
        	<profile.active>test</profile.active>
        </properties>
    </profile>
</profiles>
yml
# SpringBootでMavenプロパティを参照する
spring:
  profiles:
    active: ${profile.active}

リソースファイルでデフォルトプレースホルダー解析を有効にします。

xml
<build>
    <plugins>
        <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <configuration>
                <encoding>utf-8</encoding>
                <useDefaultDelimiters>true</useDefaultDelimiters>
            </configuration>
        </plugin>
    </plugins>
</build>

Mybatis との統合

Step 1:プロジェクトを作成する

ここでも Spring Initializr を選択します。

Step 2:技術セットを選択する

Mybatis と統合するため、Mybatis フレームワークを導入します。
使用するデータベースは MySQL なので、MySQL の依存も導入します。

Step 3:エンティティクラスを作成する

データベースに User ユーザーテーブルがあると仮定します。テーブル構造は次の通りです。

ユーザーテーブル user

フィールド名データ型説明制約
idint主キー主キー、自動増加
namevarchar(5)名前
phonevarchar(11)電話番号
sexvarchar(2)性別

対応するエンティティクラスを作成します。

java
public class User {  
    private Long id;  
    private String name;  
    private String phone;  
    private String sex;  

    //setter & getter & toString
}

Step 4:データベースへ接続する

yml 設定ファイルでデータベースへ接続します。

yml
server:
  port: 8080

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/store
    username: root
    password: 123456
    type: com.alibaba.druid.pool.DruidDataSource

Step 5:データ層を作成する

Application 起動クラスと同じ階層に mapper ディレクトリを作成し、UserMapper インターフェースを作ります。

java
@Mapper
public interface UserMapper {
    @Select("SELECT * FROM user WHERE id = #{id}")
    User selectById(Long id);
}

テスト

Spring Boot が提供する SpringBootTest でテストできます。

java
@SpringBootTest
class UserApplicationTests {

  @Autowired
  private UserMapper userMappper;

  @Test
  void test(){
      User user = userMapper.selectById(1);
      System.out.println(user);
  }
}

開発全体フロー

はじめに

現在、多くの CRUD サイトは Springboot + mybatis をもとに開発されています。ここでは、この技術スタックで企業レベルの機能モジュールを一通り開発する流れを説明します。

要件分析

要件分析は非常に重要です。要件側と十分にコミュニケーションし、実装すべき機能と業務要件を詳しく収集、整理、分析します。たとえば、ユーザー操作の流れ、期待されるデータ表示形式、各機能モジュールの関係などを明確にします。最終的に、後続開発の根拠となる明確な要件文書を作ります。

ここでは、ユーザー情報を管理する簡単なモジュールを例にします。
管理者はユーザー情報を追加、削除、変更、検索できます。

データベース定義

要件分析の結果に基づいて、データベース構造と関連設定を決めます。ここでは MySQL データベースを使い、次の User テーブルを作成します。

フィールド名説明制約
idint一意識別子主キー、自動増加
usernamevarchar(50)アカウント非 NULL、一意
passwordvarchar(100)パスワード非 NULL
namevarchar(10)ユーザー名非 NULL
phonevarchar(20)電話番号非 NULL、一意
addressvarchar(50)住所非 NULL
create_timedatetime作成時間非 NULL
update_timedatetime更新時間非 NULL

対応する SQL:

sql
CREATE TABLE `user` (
    `id` int AUTO_INCREMENT PRIMARY KEY,
    `username` varchar(50) NOT NULL UNIQUE,
    `password` varchar(100) NOT NULL,
    `name` varchar(10) NOT NULL,
    `phone` varchar(20) NOT NULL UNIQUE,
    `address` varchar(50) NOT NULL,
    `create_time` datetime NOT NULL,
    `update_time` datetime NOT NULL
);

インターフェース定義

外部システムとやり取りする API を定義します。リクエスト方式、パラメータ形式、戻り値形式などを明確にします。

SpringMVC の REST スタイルに従い、次の API を定義します。

  • http://localhost/users:すべてのユーザー情報を検索、GET
  • http://localhost/users/1:指定ユーザー情報を検索、GET
  • http://localhost/users:ユーザー情報を追加、POST
  • http://localhost/users:ユーザー情報を変更、PUT
  • http://localhost/users/1:ユーザー情報を削除、DELETE

ツール選択

Windows 10 上で IDEA を使って開発します。

  1. OS:Windows 10 X 64
  2. Java 開発キット:JDK 21
  3. プロジェクト管理ツール:Maven 3.6.3
  4. 開発ツール:IntelliJ IDEA 2021.1.3 x64
  5. データベース:Mysql
  6. ブラウザ:Edge
  7. サーバー構成:Spring Boot 3.3.3 + MyBatis 3.0.3 + Mysql Driver 8.3.0

開発を簡単にするため、Lombok 1.18.34 も使います。

プロジェクト作成

ここではモジュール分割方式でプロジェクトを作成します。
プロジェクト Store は三つのモジュールで構成されます。

  • store-common:共通常量、例外、統一結果、ツールなどを保存する
  • store-pojo:エンティティクラスを保存する
  • store-server:主な業務を保存する

データベース接続とエンティティクラス

yml
server:
  port: 8080
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/store?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
    username: root
    password: yourPassword

mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.store.entity
  configuration:
    map-underscore-to-camel-case: true

エンティティクラスは store-pojo パッケージ下の entity に置きます。

java
@Data
public class User{
  private Long id;
  private String username;
  private String password;
  private String name;
  private String phone;
  private String address;
  private LocalDateTime createTime;
  private LocalDateTime updateTime;
}

データ層

開発順序は、データベース -> 永続層 -> 業務層 -> 表示層 -> フロントエンドページ にします。
機能面では、基本機能から作り、追加 -> 検索 -> 削除 -> 変更の順で開発します。

新しいユーザーを追加する SQL:

sql
INSERT INTO `user` (`username`, `password`, `name`, `phone`, `address`, `create_time`, `update_time`)
VALUES ('test_user', 'hashed_password', '张三', '13812345678', '北京市朝阳区', '2024-12-20 10:00:00', '2024-12-20 10:00:00');

store-service パッケージ下に mapper.UserMapper インターフェースを作成します。

java
@Mapper
public interface UserMapper {
    @Insert("INSERT INTO user (username,password,name,phone,address,create_time,update_time)" +
            "VALUES (#{username},#{password},#{name},#{phone},#{address},#{createTime},#{updateTime})")
    void addUser(User user);
}

XML マッピング方式も使えます。resources 下に mapper パッケージを作成し、UserMapper のマッピングファイルを置きます。

java
@Mapper
public interface UserMapper {
    void addUser(User user);
}
xml
<mapper namespace="com.angelday.mapper.UserMapper">
    <insert id="addUser" useGeneratedKeys="true" keyProperty="uid">
        INSERT INTO user (username,password,name,phone,address,create_time,update_time)" +
        "VALUES (#{username},#{password},#{name},#{phone},#{address},#{createTime},#{updateTime})
    </insert>
</mapper>

マッピングファイルを使う場合は、設定ファイルでスキャンパスを指定する必要があります。

yml
mybatis:
 mapper-locations: classpath:mapper/*.xml

永続層が完成したら、SpringBootTest で必ずテストします。問題範囲を小さくできます。

業務層

ルートディレクトリ下に service.UserService インターフェースを作成します。

java
public interface UserService {
  void addUser(User user);
}

実装クラス service.impl.UserServiceImpl を作成します。

java
@Service
public class UserServiceImpl implements UserService {
  
  @Autowired
  private UserMapper userMapper;

  @Override
  public void add(User user) {
      user.setCreateTime(LocalDateTime.now());
      userMapper.addUser(user);
  }
}

実装後は単体テストを行います。

表示層

先に統一結果クラスを作成します。ここでは store-common 下に result.Result クラスを作ります。

java
@Data
public class Result<T> {
    private Integer code;
    private String msg;
    private T data;

    public static <T> Result<T> success() {
        Result<T> result = new Result<T>();
        result.code = 200;
        return result;
    }

    public static <T> Result<T> success(T object) {
        Result<T> result = new Result<T>();
        result.data = object;
        result.code = 200;
        return result;
    }

    public static <T> Result<T> error(String msg) {
        Result result = new Result();
        result.msg = msg;
        result.code = 0;
        return result;
    }
}

前に定義した API によると、このモジュールのパスはすべて http://localhost/users 配下です。
controller.UserController クラスを作成します。

java
@RestController
@RequestMapping("users")
public class UserController{

    @Autowired
    private UserService userService;

    @PostMapping()
    public Result addUser(@RequestBody User user){
        userService.addUser(user);
        return Result.success();
    }
}

フロントエンドとバックエンドの連携テスト

バックエンド開発では、PostMan で API テストを行えます。

localhost:8080/users

リクエストボディ:

json
{
    "username": "test_user",
    "password": "test_password",
    "name": "张三",
    "phone": "13812345678",
    "address": "北京市朝阳区"
}

データベースへ正常に追加されれば、このモジュールの開発は完了です。

最適化

この記事では例外設計を行っていません。厳密には、SpringMVC の章のように例外を分け、集中処理する必要があります。
本文中の 200 ステータスコードはリテラルとして直接書かれています。厳密には store-common パッケージ下に定数クラスを作成し、事前に決めた定数をまとめて管理するべきです。

Released under the MIT License.