PS:どんな時でも変化を恐れる必要はありません。それこそがあなたをより良くする道です。
JDBC(Java Data Base Connectivity、Java データベース接続)の主な用途は、データベースの接続、SQL 文の実行、SQL 実行結果の処理などです。Spring Boot における JDBC の学習をゼロから始めると、主な内容は以下の通りです:
- MySQL のインストール
- MySQL への接続
- データベースの作成
- 依存関係と設定
- エンティティクラス
- CRUD の実装
- 効果のテスト
- 複数データソースの設定
MySQL のインストール#
公式サイトから対応するバージョンの MySQL をダウンロードします:
https://dev.mysql.com/downloads/
ここでは Windows オペレーティングシステムに対応するインストーラーパッケージを選択してダウンロードします。以下の図のように:
次に、次へを選択してインストールを進め、インストールが完了したら MySQL を起動できます。
MySQL への接続#
MySQL のインストールが完了したら MySQL を起動し、navicat を使用して MySQL に接続します。新しい接続を作成します:
ユーザー名、パスワードなどを入力し、接続テストをクリックします。設定が正しければ、接続成功のメッセージが表示されます。
データベースとテーブルの作成#
MySQL に接続した後、右クリックして接続を選択し、データベース db_student を作成します:
データベース作成の対応コマンドは以下の通りです:
CREATE DATABASE `db_student` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_0900_ai_ci';
データベースを作成した後、student という名前のテーブルを作成します。navicat を使用して作成することも、コマンドを使用して作成することもできます。テーブル作成のコマンドは以下の通りです:
CREATE TABLE `student` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主キーid',
`name` varchar(32) DEFAULT NULL COMMENT 'ユーザー名',
`password` varchar(32) DEFAULT NULL COMMENT 'パスワード',
`age` int DEFAULT NULL COMMENT '年齢',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
依存関係と設定#
Spring Boot プロジェクトを作成し、その build.gradle ファイルに JDBC と MySQL ドライバーの依存関係を追加します:
dependencies {
// jdbc依存関係
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
// mysqlドライバー
runtime("mysql:mysql-connector-java")
// ...
}
次に、プロジェクトの application.properties ファイルでデータベースの基本設定を行います。以下のように:
# データベースユーザー名
spring.datasource.username=root
# データベースパスワード
spring.datasource.password=admin
# JDBCドライバー
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# JDBC URL
spring.datasource.url=jdbc:mysql://localhost:3306/db_student?serverTimezone=Asia/Shanghai
設定が完了したら、IDEA の Database ツールを利用して設定が正しいかテストできます。テストが成功した場合、以下の図のようになります:
エンティティクラス#
データテーブルstudent
に対応するデータエンティティクラスは以下の通りです:
/**
* エンティティクラス
*/
public class Student {
private long id;
private String name;
private String password;
private int age;
public Student() {
}
public Student(String name, String password, int age) {
this.name = name;
this.password = password;
this.age = age;
}
public Student(long id,String name, String password, int age) {
this.id = id;
this.name = name;
this.password = password;
this.age = age;
}
// setter、getterメソッド
}
CRUD の実装#
CRUD インターフェースIStudentRepository
を定義します:
/**
* @Desc: CRUDインターフェースの定義
* @Author: jzman
*/
public interface IStudentRepository {
/**
* データを保存
* @param student 単一のstudentレコード
*/
void save(Student student);
/**
* データを削除
* @param id 学生id
*/
void delete(long id);
/**
* データを更新
* @param student 単一のstudentレコード
*/
void update(Student student);
/**
* データを検索
* @param name 名前
* @return 単一のレコードを返す
*/
Student findByName(String name);
/**
* すべてのデータを検索
* @return すべてのレコードを返す
*/
List<Student> findAll();
}
StudentRepositoryImpl
を作成し、IStudentRepository
インターフェースを実装して CRUD を実装します:
/**
* @Desc: 具体的な実装
* @Author: jzman
*/
@Repository
public class StudentRepositoryImpl implements IStudentRepository {
public JdbcTemplate mJdbcTemplate;
/**
* コンストラクタで自動配線
* @param jdbcTemplate JdbcTemplate
*/
public StudentRepositoryImpl(JdbcTemplate jdbcTemplate) {
this.mJdbcTemplate = jdbcTemplate;
}
@Override
public void save(Student student) {
mJdbcTemplate.update("INSERT INTO student(name,password,age) values(?,?,?) ",
student.getName(), student.getPassword(), student.getAge());
}
@Override
public void delete(long id) {
mJdbcTemplate.update("DELETE FROM student where id=?", id);
}
@Override
public void update(Student student) {
mJdbcTemplate.update("UPDATE student SET name=?,password=?,age=? WHERE id=?",
student.getName(), student.getPassword(), student.getAge(), student.getId());
}
@Override
public Student findByName(String name) {
Object[] args = {name};
return mJdbcTemplate.queryForObject("SELECT * FROM student WHERE name=?", args,
new BeanPropertyRowMapper<Student>(Student.class));
}
@Override
public List<Student> findAll() {
return mJdbcTemplate.query("SELECT * FROM student",new BeanPropertyRowMapper<>(Student.class));
}
}
効果のテスト#
テストプログラムを作成してテストします。ここではデータを追加する例として、2 つのデータを挿入します:
* @Desc: StudentRepositoryTests
* @Author: jzman
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class StudentRepositoryTests {
@Autowired
private IStudentRepository mStudentRepository;
@Test
public void testSave(){
Student student1 = new Student("躬行之", "111",3);
Student student2 = new Student(2,"jzman", "123",20);
mStudentRepository.save(student1);
mStudentRepository.save(student2);
}
}
testSave
を実行した後、IDEA が提供する Database ツールを使用して、student テーブルをダブルクリックしてデータテーブルの内容を確認します。以下のようになります:
これでデータ挿入操作は成功しました。削除、更新、検索も同様です。
複数データソースの設定#
複数データソースの設定は、対応するDataSource
とJdbcTemplate
を設定することが主な目的です。複数データソースを定義します:
/**
* @Desc: データソース設定
* @Author: jzman
*/
@Configuration
public class DataSourceConfig {
@Primary
@Bean(name = "primaryDataSource")
@Qualifier("primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondaryDataSource")
@Qualifier("secondaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "primaryJdbcTemplate")
public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource dataSource){
return new JdbcTemplate(dataSource);
}
@Bean(name = "secondaryJdbcTemplate")
public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource dataSource){
return new JdbcTemplate(dataSource);
}
}
次に、application.properties ファイルで複数のデータベース接続を設定します。以下のように:
# dataSource1
spring.datasource.primary.username=root
spring.datasource.primary.password=admin
spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/data_source_one?serverTimezone=Asia/Shanghai
# dataSource2
spring.datasource.secondary.username=root
spring.datasource.secondary.password=admin
spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/data_source_two?serverTimezone=Asia/Shanghai
異なるデータソースは異なるJdbcTemplate
に対応し、それぞれのデータソースのデータを操作できます。具体的なソースコードは文末のヒントを参照してください。