Java開発環境構築とSpring Bootプロジェクト設定ガイド

推奨リンク ----

リンク目次

Java環境構築

JDKインストール手順

Oracle公式サイトから最新の安定版JDKをダウンロードしてください

JDKインストール後、JAVA_HOMEという環境変数を設定し、JDKのインストールパスを指すようにします。例えば:C:\Program Files\Java\jdk\jdk-21 (注:jdkとjdk-21は異なるバージョン管理のために作成したフォルダです)

次に、JAVA_HOMEのbinディレクトリをシステム環境変数PATHに追加します。
Path=%JAVA_HOME%\bin;<既存の他のパス>

設定完了後、コマンドプロンプトで java -version を実行すると対応するバージョンが表示されます。もしバージョン21ではなく15や1.8などが表示される場合、複数のJDKがシステムに存在しており、デフォルトがJDK 21ではないことを意味しているため、JDK 21をPATHの先頭に配置する必要があります

最初のJavaアプリケーション

//ファイル名はGreetingApp.javaとし、クラス名GreetingAppと完全一致させる必要があります
public class GreetingApp {
    public static void main(String[] args) {
        System.out.println("Welcome, Java World!");
    }
}
//Javaソースコードはテキストファイルであり、まずjavacでGreetingApp.javaをバイトコードファイルGreetingApp.classにコンパイルし、その後javaコマンドで実行します
cd xxxx //Javaファイルのあるディレクトリへ移動
javac GreetingApp.java //カレントディレクトリにGreetingApp.classファイルが生成される
java GreetingApp //拡張子.classは不要

Spring Bootプロジェクト設定

標準的なディレクトリ構造

プロジェクトルート/src/main/java:プロジェクトのJavaソースコード配置場所
プロジェクトルート/src/main/resources:プロジェクトの静的リソースと設定ファイル配置場所
プロジェクトルート/src/test/java:プロジェクトのテストケースコード配置場所

///src/main/java
|_annotations:カスタムアノテーション配置
|_interceptors:インターセプター関連コード配置
|_configurations:設定クラス配置
|_constants:定数・列挙型定義配置
   |__constants:定数定義保管
   |__enumerations:列挙型定義保管
|_controllers:コントローラークラス配置
|_filters:フィルター・インターセプター関連コード配置
|_repositories:データアクセス層インターフェース配置
|_entities:データモデルクラス配置
   |__domain:データベースエンティティオブジェクト定義配置
   |__transfer:データ転送オブジェクト定義配置
   |__presentation:表示層オブジェクト定義配置
|_services:ビジネスロジック層コード配置(インターフェースと実装分離)
   |__interfaces:ビジネスロジックインターフェース定義配置
   |__implementations:ビジネスロジック実装クラス配置
|_utilities:ユーティリティクラス配置

///src/main/resources
|_mappers:MyBatisのXMLマッピングファイル配置(MyBatisプロジェクトの場合)
|_static:ウェブ静的リソース配置、js/css/imgなど
   |__javascripts:
   |__stylesheets:
   |__images:
   |__fonts:
   |__その他
|_templates:ウェブテンプレート配置、Thymeleaf/Freemarkerテンプレートなど
   |__headers
   |__sidebars
   |__footers
   |__XXX.htmlなど
|_application.yml       基本設定ファイル
|_application-dev.yml   開発環境設定ファイル
|_application-test.yml  テスト環境設定ファイル
|_application-prod.yml  本番環境設定ファイル

XML設定ファイル構造

<?xml version="1.0" encoding="UTF-8" ?>

<!--mybatis-3-mapper.dtd: 制約ファイル名で、現在のファイル内でのタグと属性がMyBatis要件を満たすことを制限・検証する-->
<!--namespace: 名前空間で、一意の値を持ち、DAOインターフェースの完全修飾名を使用する必要がある(1つのDAOインターフェースに対応する1つのマッパーで、namespaceで対応するDAOインターフェースを指定する)-->
<mapper namespace="com.example.project.repository.IEmployeeRepository">
 <!--すべてのデータベース操作はmapperタグ内に記述し、特定のタグでデータベースの特定操作を表現する-->
</mapper>

データベース接続設定

関連依存関係

MySQL接続
//Spring Bootプロジェクト作成時にMySQLドライバーを選択すると、Springのデフォルトドライバーが自動ダウンロードされる、通常MySQL依存関係のバージョンは高い
	<dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <scope>runtime</scope>
	</dependency>
    
//MySQL 8.xバージョン用設定
//MySQL 5.7依存関係がダウンロードできない場合、以下に変更可能   
	 <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.13</version>
      <!--<version>8.0.27</version>-->
	 </dependency>
	 
//5.1.xバージョンのMySQL依存関係	 
	<dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.49</version>
	</dependency>
JPAサポート
//import javax.persistence.*;

/**
Jakarta EE 8以上バージョンでは以下のインポートを使用
import jakarta.persistence.*; 
*/
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

ログレベル設定

ログレベルは以下の順序で並べられる(高い順から低い順):ERROR > WARN > INFO > DEBUG > TRACE。したがって、ログレベルをWARNに設定することで警告レベル以上のログメッセージのみが出力される。
logging.levelはログレベルを指定するプロパティで、rootはルートログ記録装置を表す。
logging.level.rootの値をWARNに設定することで、ログフレームワークに警告レベル(WARN)以上のログメッセージのみを出力し、それより低いレベルのメッセージを無視するよう指示する。これによりログ出力量を削減し、警告、エラー、重大なログのみを表示できる。

application.properties設定

#Spring Boot 2.0バージョン時(組み込みJDBC5ドライバー)
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/database_name?characterEncoding=utf-8&useSSL=false
#ユーザー名
spring.datasource.username=root
#データベースパスワード
spring.datasource.password=root

------------------------------------------------------------------------------
注意:ドライバーとURLの変更点
------------------------------------------------------------------------------

#Spring Boot 2.1以上バージョン時(組み込みJDBC8ドライバー)
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/database_name?serverTimezone=GMT%2B8
#ユーザー名
spring.datasource.username=root
#データベースパスワード
spring.datasource.password=root

#JPA設定
//このプロパティはHibernateが使用するデータベース方言を指定する。この場合、HibernateにMySQL x.xバージョンの方言を使用するよう指示し、Spring Bootが参照するMySQL依存関係バージョンを確認してデータベースとの互換性を確保すること。
#5.7.x
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
#8.x
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

#このプロパティはコンソールに生成されたSQL文を表示するかどうかを指定する。trueに設定すると、Hibernateは実行されたSQL文をコンソールに出力し、デバッグと生成SQLの確認に便利。
spring.jpa.show-sql=true

#このプロパティはHibernate起動時のデータベーステーブル自動操作を指定する。updateはHibernateがエンティティクラス定義に基づいてデータベーステーブル構造を自動的に更新することを意味し、テーブルの削除や再作成はしない。つまり、テーブルが存在しない場合、Hibernateは作成を試みる。既存テーブルがあれば、エンティティクラス定義に基づいてテーブル構造を更新する。
spring.jpa.hibernate.ddl-auto=update


#MyBatis

#エンティティ別名
#mybatis.type-aliases-packageは型別名のパッケージパスを指定する設定項目。
#com.springboot.entityは具体的なパッケージパスで、スキャン対象のパッケージを示し、使用するエンティティクラスが含まれている。
#この設定により、マッピングファイル内のresultType属性で直接エンティティクラス名を使用できる。
mybatis.type-aliases-package=com.springboot.entity

#マッピングファイル配置場所
#mybatis.mapper-locationsはMyBatisマッピングファイルの配置場所を指定する設定項目。
#classpath:はプレフィックスで、クラスパスからリソースを探すことを示す。Spring Bootではクラスパスはプロジェクトのresourcesディレクトリを指す。
#mapper/はマッピングファイルの相対パスを示す。ここではresourcesディレクトリ下のmapperディレクトリにあると仮定。
#*.xmlはワイルドカードで、.xmlで終わるすべてのファイルを示す。ここでいうと、.xmlで終わるすべてのファイルがMyBatisマッピングファイルとして扱われる。
mybatis.mapper-locations=classpath:mapper/*.xml



#ポート設定
#SpringBootアプリケーションのWebポート変更
server.port=9090

#ポート番号を0に設定すると、OSが利用可能なポート番号を自動割り当て
server.port=0

#ログレベルをより高いもの(WARNやERROR)に設定して出力ログ量を削減
logging.level.root=WARN

データベース接続確認テスト

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
//import org.junit.runner.RunWith;
//import org.springframework.test.context.junit4.SpringRunner;

//@RunWith(SpringRunner.class)
@SpringBootTest
public class DatabaseConnectionVerificationTest {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Test
    public void verifyDatabaseConnection() {
    	//テストが通過し期待結果が出力されれば、データベース接続設定が正しく、アプリケーションがデータベースに正常に接続できることを示す。
		//テストメソッド実行後、最終ログに:Database connection verification successful. Result: 1 が表示されるか確認、ログ上部の赤い警告は無視可
		//2回目のSELECT VERSION();は、接続データベースのバージョンを確認するために使用、再度実行して最初のクエリ結果と異なるか観察

		//データベース接続テストが失敗する場合、上記のコメントアウトされたアノテーションとインポートを解除して再度試す。

        String result = jdbcTemplate.queryForObject("SELECT 1;", String.class);
        //データベースバージョン確認
//      String result = jdbcTemplate.queryForObject("SELECT VERSION();", String.class);

        System.out.println("Database connection verification successful. Result: " + result);
    }
}

エンティティクラス作成

@Data // getter、setter、equals、hashCode、toStringメソッド自動生成
@AllArgsConstructor //全フィールドを含むコンストラクタ自動生成
@NoArgsConstructor //引数なしコンストラクタ自動生成
@Active //カスタムアノテーションと仮定、必要に応じて定義
@Table(name = "users_table") //データベーステーブル名指定
public class UserEntity {
    @Id //主キー識別
    @GeneratedValue(strategy = GenerationType.IDENTITY) //主キー生成戦略を自動採番に指定
    private Long userId;
    private String userName;
    private String createdBy;
    private LocalDateTime creationTime;
}

コントローラー層作成

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;

@RestController
public class UserManagementController {

    @GetMapping("/welcome")
    public String welcome(){
        return "GET: Welcome, Spring Boot!";
    }

    @PostMapping("/welcome")
    public String welcome(@RequestBody String username) {
        return "POST: Welcome, " + username + "!";
    }
    
    @GetMapping("/welcome/{identifier}/{username}")
    public String welcomeGet(@PathVariable Long identifier,@PathVariable String username){
        //パスパラメータ@PathVariable
        return "GET: Welcome, " + "id :" + identifier + "username :" + username;
    }
    
    @PostMapping("/welcomePost")
    public String welcomePost(@RequestParam(name = "inputName",required = false) String username){
        //@RequestParam(name = "inputName",required = false) パラメータ名をinputNameとし、必須パラメータを解除
        return "POST: Welcome, Spring Boot!";
    }

    @GetMapping("/welcomeTime")
    public String  welcomeTime(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime creationTime){
        //時間パラメータ形式制御
        return "Welcome " + creationTime;
    }
}

リポジトリ層作成

import com.springboot.entity.UserEntity;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;

@Mapper
public interface UserRepository {
    
    List<UserEntity> fetchAllUsers();
}

//DAO層対応XMLメソッド、配置場所 src/main/resources/mapper/UserRepository.xml
<?xml version="1.0" encoding="UTF-8" ?>

<!--mybatis-3-mapper.dtd: 制約ファイル名で、現在のファイル内でのタグと属性がMyBatis要件を満たすことを制限・検証する-->
<!--namespace: 名前空間で、一意の値を持ち、DAOインターフェースの完全修飾名を使用する必要がある(1つのDAOインターフェースに対応する1つのマッパーで、namespaceで対応するDAOインターフェースを指定する)-->
<mapper namespace="com.springboot.repository.UserRepository">
    <!--すべてのデータベース操作はmapperタグ内に記述し、特定のタグでデータベースの特定操作を表現する-->
    <select id="fetchAllUsers" resultType="UserEntity">
        select user_id,user_login,user_name,user_description,create_time from users_table
    </select>
</mapper>

サービス層作成

import com.springboot.entity.UserEntity;
import java.util.List;

public interface UserServiceInterface {
    List<UserEntity> fetchAllUsers();
}

//サービス層インターフェース実装
import com.springboot.repository.UserRepository;
import com.springboot.entity.UserEntity;
import com.springboot.service.UserServiceInterface;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class UserServiceImplementation implements UserServiceInterface {
    @Autowired
    private  UserRepository userRepository;
    
    @Override
    public List<UserEntity> fetchAllUsers() {
       return userRepository.fetchAllUsers();
    }
}

特別機能

Spring Bootプロジェクトの/src/main/resourcesディレクトリ下にbanner.txtファイルを作成し、ASCIIアートをコピーすればデフォルトのバナーを置き換えられます

${AnsiColor.BRIGHT_RED}:コンソール出力色設定
${application.version}:MANIFEST.MFファイルからバージョン番号取得
${application.formatted-version}:整形後の${application.version}バージョン情報
${spring-boot.version}:Spring Bootバージョン番号
${spring-boot.formatted-version}:整形後の${spring-boot.version}バージョン情報

タグ: Java spring-boot MySQL jpa MyBatis

6月1日 21:52 投稿