banner
jzman

jzman

Coding、思考、自觉。
github

Spring BootシリーズのJDBCデータベース操作

PS:どんな時でも変化を恐れる必要はありません。それこそがあなたをより良くする道です。

JDBC(Java Data Base Connectivity、Java データベース接続)の主な用途は、データベースの接続、SQL 文の実行、SQL 実行結果の処理などです。Spring Boot における JDBC の学習をゼロから始めると、主な内容は以下の通りです:

  1. MySQL のインストール
  2. MySQL への接続
  3. データベースの作成
  4. 依存関係と設定
  5. エンティティクラス
  6. CRUD の実装
  7. 効果のテスト
  8. 複数データソースの設定

MySQL のインストール#

公式サイトから対応するバージョンの MySQL をダウンロードします:

https://dev.mysql.com/downloads/

ここでは Windows オペレーティングシステムに対応するインストーラーパッケージを選択してダウンロードします。以下の図のように:

image

次に、次へを選択してインストールを進め、インストールが完了したら MySQL を起動できます。

MySQL への接続#

MySQL のインストールが完了したら MySQL を起動し、navicat を使用して MySQL に接続します。新しい接続を作成します:

image

ユーザー名、パスワードなどを入力し、接続テストをクリックします。設定が正しければ、接続成功のメッセージが表示されます。

データベースとテーブルの作成#

MySQL に接続した後、右クリックして接続を選択し、データベース db_student を作成します:

image

データベース作成の対応コマンドは以下の通りです:

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 ツールを利用して設定が正しいかテストできます。テストが成功した場合、以下の図のようになります:

image

エンティティクラス#

データテーブル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 テーブルをダブルクリックしてデータテーブルの内容を確認します。以下のようになります:

image

これでデータ挿入操作は成功しました。削除、更新、検索も同様です。

複数データソースの設定#

複数データソースの設定は、対応するDataSourceJdbcTemplateを設定することが主な目的です。複数データソースを定義します:

/**
 * @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に対応し、それぞれのデータソースのデータを操作できます。具体的なソースコードは文末のヒントを参照してください。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。