表紙画像はMohamed HassanによってPixabayに公開されました
Service 層でのビジネスロジックの整理が完了した後、次に考慮すべき問題は、データベース操作をどのように行い、関連データのクエリ、挿入などの操作を完了するかです。
SpringBoot アプリケーションでは、Dao 層が INSERT、DELETE、UPDATE、SELECT などのデータベース操作を担当し、関連するデータテーブルの CRUD を実行します。Entity 層には、プログラムで必要なさまざまなデータを組み合わせた属性を持つエンティティクラスが含まれています。データベース操作を行う際、SQL 文内のパラメータは通常エンティティクラスの属性で置き換えられるため、エンティティクラスのオブジェクトはしばしばデータテーブルの 1 レコードに相当します。
上記の文章のシナリオを例に、この記事では Dao 層がどのようにデータベース操作を完了し、Entity 層がどのように機能するかをわかりやすく説明します。
環境準備#
本機に MySQL 8 をデプロイし、Deepin 上でしばらく試行錯誤した結果、Debian 10 の apt リポジトリを利用して、ようやくインストールが完了しました。
MySQL で新しいデータベース project を作成し、その後、プロジェクト情報を記録するためにデータテーブル project_information を新規作成します:
CREATE TABLE IF NOT EXISTS `project_information`(
`id` INT UNSIGNED UNIQUE AUTO_INCREMENT COMMENT '操作流水コード',
`operation` varchar(5) NOT NULL COMMENT '操作タイプ',
`code` VARCHAR(5) NOT NULL COMMENT 'プロジェクトコード',
`name` VARCHAR(200) NOT NULL COMMENT 'プロジェクト名',
`category` VARCHAR(2) NOT NULL COMMENT 'プロジェクト分類',
`time` DATETIME NOT NULL COMMENT '操作時間',
PRIMARY KEY ( `code`,`time` )
)ENGINE=InnoDB;
ここで AUTO_INCREMENT は自動増分、NOT NULL は非 NULL 制約、PRIMARY KEY は主キー、COMMENT はコメントです。
SpringBoot プロジェクトに依存関係と接続情報を追加#
- 依存関係のインストール:前回の記事を参考にして、https://mvnrepository.com/ で自分のパッケージマネージャーの依存関係のインストール方法を探してください。Gradle プロジェクトの場合、build.gradleの
dependencies{}
に以下の情報を追加します:
// SpringBootのMySQLコネクタfor 8.0.33バージョン
implementation 'org.springframework.boot:spring-boot-starter-jdbc:3.1.4'
implementation 'com.mysql:mysql-connector-j:8.0.33'
- データ接続設定:application.propertiesに以下の情報を追加します:
spring.datasource.url=jdbc:mysql://localhost:3306/{database name}
spring.datasource.username={user}
spring.datasource.password={password}
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
ここで {} で囲まれた内容はすべて実際の設定に応じて置き換える必要があります。私は MySQL 8.0 以上のバージョンを使用しているため、最後の行のドライバ名はcom.mysql.cj.jdbc.Driver
に変更する必要があります。
操作情報を保存するためのエンティティクラスを作成#
上記で作成したデータテーブルからわかるように、一つの操作記録には操作流水コード、操作名、プロジェクトコード、プロジェクト名、プロジェクト分類、操作時間が含まれます。操作流水コードはデータを挿入するたびに自動的に増加するため、実際の操作データは操作名、プロジェクトコード、プロジェクト名、プロジェクト分類、操作時間の 5 つの属性のみを含みます。
Entity 層に新しいプロジェクト情報のエンティティクラス ProjectInformationEntity を作成して、1 回の操作に含まれるデータを整理します。クラスの定義は以下の通りです:
import java.sql.Timestamp;
public class ProjectInformationEntity {
private String operation;
private String code;
private String name;
private String category;
private Timestamp operation_time;
//getメソッド
public String getOperation() {
return operation;
}
public String getCode() {
return this.code;
}
public String getName() {
return this.name;
}
public String getCategory() {
return this.category;
}
public Timestamp getTime() {
return operation_time;
}
//setメソッド
public void setOperation(String system_operation) {
this.operation = system_operation;
}
public void setCode(String projectCode) {
this.code = projectCode;
}
public void setName(String projectName) {
this.name = projectName;
}
public void setCategory(String projectCategory) {
this.category = projectCategory;
}
public void setTime(Timestamp operationTime) {
this.operation_time = operationTime;
}
}
このクラスの各インスタンスは操作データを保存するために使用され、データベース操作を実行する際やビジネスロジックで操作データを使用する際には、オブジェクトの get メソッドを通じて関連パラメータを渡すことができます。この方法の利点は、各データ項目間の関係を明確にし、実際の使用時に混乱を避けることができることです。
ビジネスロジックの中で、以下のような関数を使用してエンティティクラスのオブジェクトを初期化できます:
public ProjectInformationEntity storeProjectInformation(String operation, String code, String name, String category) {
ProjectInformationEntity entity = new ProjectInformationEntity();
entity.setOperation(operation);
entity.setCode(code);
entity.setName(name);
entity.setCategory(category);
entity.setTime(getCurrentTime());
return entity;
}
データベース操作を作成#
Dao 層に新しい ProjectInformationDao クラスを作成して、いくつかのデータベース操作を行います。このクラスでは主に JdbcTemplate を使用して関連操作を実装し、update メソッドを使用して INSERT の SQL 文を実行し、queryForObject メソッドを使用して単一データをクエリします。
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import studio.tsukistar.demo.Entity.ProjectInformationEntity;
@Repository
public class ProjectInformationDao {
private final JdbcTemplate jdbcTemplate;
public ProjectInformationDao(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void addOperationInformation(ProjectInformationEntity proInfo) { //新しい操作記録を追加
String sql = "insert into project_information (operation, code, name, category, operation_time) values (?,?,?,?,?)";
jdbcTemplate.update(sql, proInfo.getOperation(), proInfo.getCode(), proInfo.getName(), proInfo.getCategory(), proInfo.getTime());
}
public String selectLatestProjectCode(String category) {
String code;
String sql = "select code from project_information where operation = '新建编码' and category = ? order by id desc limit 1";
code = jdbcTemplate.queryForObject(sql, new Object[]{category},String.class);
return code;
}
}
まとめ#
今回の段階的成果は、SpringBoot アプリケーション内でデータベース操作を呼び出してデータのクエリと保存を行うことですが、JdbcTemplate の使用は確かに少し古くなっているかもしれません。次はより先進的な方法で操作を行う予定です。
開発の過程で、私は ChatGPT に多くの機能実装に関する質問をし、正確で実行可能な回答を得ました。これはある意味で私の効率を確実に向上させました。ChatGPT はほぼ私の百科事典のようになっていると感じています、ハハハハ。
参考記事#
mysql の datetime が java に対応する:https://juejin.cn/s/mysql%E4%B8%AD%E7%9A%84datetime%E5%AF%B9%E5%BA%94java
spring boot (三) 之 使用 JdbcTemplate で MySQL データベースにアクセス:https://blog.csdn.net/weixin_45755816/article/details/118762188
Spring boot (四) 之データをデータベースに保存する:https://blog.csdn.net/weixin_45755816/article/details/118770441
Java で無符号整数(unsigned int)を使用する方法:https://icejoywoo.github.io/2018/08/17/unsigned-number-in-java.html