目次
3.3.1 IService を継承してサービス インターフェイスを定義する
3.3.2 ServiceImpl を継承してサービス インターフェイスを実装する
1.mybatis-plusとは何ですか?
Mybatis-plus はMybatis をベースにした拡張ツールで、多くの便利な CRUD 操作やその他の実用的な機能を提供し、データベース アクセスの開発を簡素化します。これは Mybatis のオープンソース コンポーネントであり、Apache 2.0 プロトコルに従っています。
Mybatis-plus の主な機能は次のとおりです。
- 自動コードジェネレーター: 簡単な構成で、Mapper インターフェースとエンティティークラスのコードを迅速に生成できます。
- 便利な CRUD 操作: クエリおよび更新操作用のさまざまな API を提供し、データベースの操作を容易にします。
- 一般的なページング プラグイン: さまざまなデータベースのページング クエリをサポートし、豊富なページング パラメータ設定と結果処理メソッドを提供します。
- 条件ビルダー: 複雑なクエリ条件に従って SQL を動的に生成できるため、クエリ操作が簡素化されます。
- 論理削除: 論理削除をサポートし、論理削除が実行されるときにフィールドを自動的に埋める機能を提供します。
- オプティミスティック ロック: バージョン番号に基づいたオプティミスティック ロックをサポートします。
- シーケンス ジェネレーター: さまざまなデータベースのシーケンス生成戦略をサポートします。
Mybatis-plus は、開発者がその機能をより迅速に開始して使用できるようにする豊富なドキュメントと例を提供します。また、コミュニティからの広範なサポートと貢献も受けており、国内の開発者によって広く使用されているデータベース アクセス フレームワークの 1 つとなっています。
公式ドキュメントを参照できます:公式リファレンスドキュメントhttp://baomidou.com/
2. 環境の準備
2.1 依存関係が追加されました:
Maven プロジェクトでは、次の依存関係を pom.xml ファイルに追加できます。
依存関係のバージョンに移動し、依存関係ライブラリを確認できます: Maven 依存関係ウェアハウスhttps://mvnrepository.com/
mybatis-plus 依存関係を導入します。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
或者
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>{latest-version}</version>
</dependency>
Mybatis-plus のコード生成モジュールを紹介します。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.2.0</version>
</dependency>
mysl または oracle をインポートします。
1: MySQLデータベースのJDBCドライバーを導入する
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
2. OracleデータベースのJDBCドライバーを導入する
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.4</version>
</dependency>
現時点では、ほとんどのプロジェクトには複数のデータ ソースの要件、またはマスター/スレーブ デプロイメントの要件があるため、mybatis-plus の複数のデータ ソースへの依存性も導入する必要があります。
複数のデータソースに対する mybatis-plus の依存関係を導入する
<!-- mybatis-plus 多数据源 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
2.2 Mybatis-plus の構成:
Spring Boot プロジェクトでは、次の構成を application.yml ファイルに追加できます。
mybatis-plus:
type-enums-package: com.zt.plant.traed.api.domain.*
type-aliases-package: com.zt.plant.traed.*.domain
mapper-locations: classpath:/mapper/**/*.xml
通常の使用の場合、列挙型クラス パッケージ、エンティティ クラス テーブル (ストレージおよび表示関連の DTO)、マッピング ファイルの場所 (一般) を構成します。
2.2.1 設定フィールドの説明
Mybatis-plus は、多くの便利な機能を提供し、いくつかの新しい設定項目を導入する Mybatis 拡張ツールです。以下は、Mybatis-plus で一般的に使用されるいくつかの構成項目の説明です。
mapper-locations
: Mybatis XML マッピング ファイルの場所を指定します。ワイルドカードを使用できます。type-aliases-package
: エンティティ クラスのパッケージ名を指定すると、Mybatis-plus はこれらのエンティティ クラスを XML マッピング ファイルで簡単に使用できるエイリアスとして自動的に登録します。type-enums-package:
これは Mybatis-plus の構成項目であり、列挙型のパッケージ名を指定するために使用され、Mybatis-plus が型処理を実行するときにこれらの列挙型を型プロセッサーとして自動的に登録できるようにします。type-handlers-package
: タイプ プロセッサのパッケージ名を指定すると、Mybatis-plus がパッケージ配下のタイプ プロセッサを自動的にスキャンし、Mybatis に登録します。configuration.cache-enabled
: Mybatis が 2 次キャッシュを有効にするかどうかを制御します。デフォルトは true です。configuration.lazy-loading-enabled
: Mybatis が遅延ロードを有効にするかどうかを制御します。デフォルトは false です。configuration.map-underscore-to-camel-case
: Mybatis がキャメルケース名の自動マッピングを有効にするかどうかを制御します。デフォルトは false です。configuration.default-fetch-size
: デフォルトの JDBC fetchSize を設定します。デフォルトは設定されていません。configuration.default-statement-timeout
: デフォルトの JDBC クエリ タイムアウトを設定します。デフォルトは設定されていません。configuration.default-executor-type
: デフォルトのアクチュエータ タイプを設定します。オプションの値は SIMPLE、REUSE、BATCH で、デフォルトは SIMPLE です。configuration.call-setters-on-nulls
: Mybatis が null 値を設定するために setter メソッドを呼び出すかどうかを制御します。デフォルトは false です。configuration.jdbc-type-for-null
: Mybatis が null 値を処理する方法を制御します。オプションの値は NULL、VARCHAR、OTHER (デフォルトは NULL) です。configuration.log-impl
: Mybatis が使用するログ フレームワークを指定します。デフォルトは Log4j2 です。configuration.wrap-result-maps
: Mybatis が結果セットをラップするかどうかを制御します。デフォルトは false です。configuration.default-statement-type
: デフォルトのステートメント タイプを設定します。オプションの値は STATEMENT、PREPARED、または CALLABLE です。デフォルトは PREPARED です。global-config.db-config.id-type
: グローバル ID 生成戦略を設定します。オプションの値は AUTO、NONE、INPUT、ID_WORKER、UUID、ID_WORKER_STR で、デフォルトは AUTO です。global-config.db-config.logic-delete-field
: トゥームストーン フィールドの名前を設定します。デフォルトは null で、トゥームストーンが使用されないことを意味します。global-config.db-config.logic-delete-value
: 廃棄フラグの値を設定します。デフォルトは 1 です。global-config.db-config.logic-not-delete-value
: 削除されていないフラグの値を設定します。デフォルトは 0 です。
これらの設定項目mybatis-plus-config.xml
は、 またはapplication.yml
(または) ファイルでapplication.properties
設定できます。特定の要件に従って構成する構成項目を選択します。
2.3 スプリングブート スタートアップ クラス。
マッパー ファイルの場所をスキャンするように @MapperScan アノテーションを構成します。
@EnableScheduling
@SpringBootApplication
@EnableSwaggerBootstrapUI //开启swagger 增强, 排序等
@EnableDiscoveryClient //开启服务发现客户端
@MapperScan("com.zt.plant.traed.api.repository")//mybatis-plus扫描接口
@ComponentScan(basePackages = {"com.zt.plant.*"})
public class recentlyApplication {
public static void main(String[] args) {
SpringApplication.run(recentlyApplication.class, args);
}
}
3.4 データソースの構成
# 数据库配置
datasource:
type: com.zaxxer.hikari.HikariDataSource
driverClassName: oracle.jdbc.OracleDriver
url: jdbc:oracle:thin:@//110.111.10.10:1521/orcl
username: system
password: oracledba
# Hikari 连接池配置
hikari:
# 最小空闲连接数量
minimum-idle: 5
# 空闲连接存活最大时间,默认600000(10分钟)
idle-timeout: 900000
# 连接池最大连接数,默认是10
maximum-pool-size: 50
# 此属性控制从池返回的连接的默认自动提交行为,默认值:true
auto-commit: true
# 连接池名称 pool-name: MyHikariCP
# 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
max-lifetime: 1800000
# 数据库连接超时时间,默认30秒,即30000
connection-timeout: 30000
connection-test-query: SELECT 1 FROM DUAL
schema-username: Recently
HikariCP は高性能の JDBC 接続プールであり、広く使用されている接続プールの 1 つです。これは、優れたパフォーマンスと低リソース消費を備えた軽量の接続プールであり、データベース アクセスのパフォーマンスとアプリケーションの同時処理能力を大幅に向上させることができます。
3. Mybatis-plusの簡単な使い方
3.1 エンティティ クラスを定義します。
Mybatis-plus を使用するにはエンティティ クラスの定義が必要であり、テーブル名やフィールド名などの情報を記述するために通常はアノテーションが使用されます。例えば:
@TableName テーブル名の注釈。エンティティ クラスに対応するテーブルを識別するために使用されます。
@Data
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
@TableField(value = "diseasename")
private String name;
@TableField(value = "numberWin")
private Integer win;
@TableField(exist = false)
private Integer age;
/**
* 创建时间
*/
@TableField(value = "create_date", jdbcType = JdbcType.TIMESTAMP, fill = FieldFill.INSERT)
@ApiModelProperty(value = "创建时间<新增/修改忽略>", position = 95)
protected Date createDate;
/**
* 修改人
*/
@TableField(value = "update_by", jdbcType = JdbcType.BIGINT, fill = FieldFill.UPDATE)
@ApiModelProperty(value = "修改人<新增/修改忽略>", position = 96)
protected Long updateBy;
/**
* 删除标记(0:正常;1:删除)
*/
@TableLogic
@TableField(value = "del_flag", jdbcType = JdbcType.VARCHAR, fill = FieldFill.INSERT)
@ApiModelProperty(value = "删除标记(0:正常;1:删除)<新增/修改忽略>", position = 99)
protected String delFlag;
}
3.3.1 一部のアノテーションの説明
1.IDタイプ
com.baomidou.mybatisplus.annotation.IdType
これは Mybatis-Plus によって提供される列挙型で、主キーの生成戦略を定義するために使用されます。
IdType
列挙型には次の型が含まれます。
- AUTO: 自動拡張。MySQL、SQL Server、および自動拡張をサポートするその他のデータベースに適しています。
- NONE: 主キーなし。主キーがない状況に適しています。
- INPUT: 手動入力。主キー値の手動入力に適しています。
- ID_WORKER: グローバルに一意の ID。分散システムでの一意の ID 生成に適しています。
- UUID: グローバルに一意の UUID。主キーとして UUID が必要な状況に適しています。
- ID_WORKER_STR: 文字列型のグローバルに一意な ID。分散システムでの一意の ID 生成に適しており、文字列型で保存されます。
元のコード:
import lombok.Getter;
/**
* 生成ID类型枚举类
*/
@Getter
public enum IdType {
/**
* 数据库ID自增
*/
AUTO(0),
/**
* 该类型为未设置主键类型(将跟随全局)
*/
NONE(1),
/**
* 用户输入ID
* <p>该类型可以通过自己注册自动填充插件进行填充</p>
*/
INPUT(2),
/* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */
/**
* 全局唯一ID (idWorker)
*/
ID_WORKER(3),
/**
* 全局唯一ID (UUID)
*/
UUID(4),
/**
* 字符串全局唯一ID (idWorker 的字符串表示)
*/
ID_WORKER_STR(5);
private final int key;
IdType(int key) {
this.key = key;
}
}
2. @TableFiled
@TableField
これは Mybatis-Plus によって提供されるアノテーションで、エンティティ クラスのフィールドとデータ テーブルの列の間のマッピング関係をマークするために使用されます。
@TableField
注釈には次の属性が含まれます。
- value: データテーブルの対応する列名エンティティクラスのフィールド名がデータテーブルの列名と同じ場合、この属性は省略可能です。
- 存在する: データベース テーブル フィールドであるかどうかに関係なく、デフォルトは true です。false に設定されている場合、そのフィールドはデータベース テーブル内のフィールドではなく、追加、削除、変更、またはチェックが行われないことを意味します。
- select: クエリ操作を実行するかどうか。デフォルトは true です。false に設定すると、クエリ操作でフィールドがクエリされないことを意味します。
- insert: 挿入操作を実行するかどうか。デフォルトは true です。false に設定すると、挿入操作ではフィールドが挿入されません。
- update: 更新操作を実行するかどうか。デフォルトは true です。false に設定すると、更新操作でフィールドが更新されないことを示します。
3. @TableLogic
@TableLogic
これは、Mybatis-Plus が提供するアノテーションの 1 つで、論理的な削除を実装するために使用されます。論理削除とは、データベースからデータを直接削除するのではなく、データベース内のデータを削除済みとしてマークすることを指します。論理削除によりデータの完全性をある程度保つことができ、データの復旧や監査などの運用にも便利です。
3.2 マッパーインターフェイスを定義します。
Mybatis-plus を使用するには、Mapper インターフェースを定義する必要があり、Mybatis-plus が提供する BaseMapper インターフェースを継承することも、独自のメソッドを定義することもできます。例えば:
メインのインポート パッケージのみがコードに表示され、その他は追加されません。自分で追加できます。
mybatis-plus は、一般的に使用される CRUD インターフェイスをBaseMapper
インターフェイスにカプセル化します。必要なのは、それをマッパーで継承することだけであり、独自の他のインターフェイスを追加することもできます。
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@Repository
public interface UserMapper extends BaseMapper<User> {
List<User> selectByName(String name);
}
3.3 サービスインターフェースの定義
3.3.1 継承IService定义服务接口
独自に定義したサービス インターフェイスでインターフェイスを継承する必要がありますIService
。
Mybatis-Plus では、通常、ビジネス ロジックとデータ アクセス操作をカプセル化するサービス インターフェイスを定義する必要があります。通常、Service インターフェイスはIService
インターフェイス 。
import com.baomidou.mybatisplus.extension.service.IService;
public interface UserService extends IService<User> {
/**
* 根据 ID 查询用户
*
* @param id 用户 ID
* @return 用户信息
*/
User getUserById(Long id);
/**
* 添加用户
*
* @param user 用户信息
* @return 是否添加成功
*/
boolean addUser(User user);
/**
* 更新用户信息
*
* @param user 用户信息
* @return 是否更新成功
*/
boolean updateUser(User user);
/**
* 删除用户
*
* @param id 用户 ID
* @return 是否删除成功
*/
boolean deleteUser(Long id);
}
IService
これは、Mybatis-Plus フレームワークのインターフェイスであり、サービス層の基本インターフェイスです。IService
挿入、削除、変更、クエリ、ページングなどの一般的に使用されるデータ操作方法を含む、一連の CRUD (追加、削除、変更、クエリ) 操作が定義されています。同時に、IService
バッチ挿入、バッチ更新など、一般的に使用されるデータ操作補助メソッドも提供します。
IService
主な機能は、サービス層の実装に統一されたデータ操作インターフェイスを提供し、サービス層のコーディングを簡素化し、コードの可読性と保守性を向上させることです。これを利用することで、ビジネスニーズに合ったデータ操作メソッドを迅速に開発IService
できるほか、Mybatis-Plus が提供する一連の補助メソッドを通じて複雑なデータ操作機能を迅速に実現できます。
3.3.2ServiceImpl
サービスインターフェースの継承実装
同時に、インターフェイス実装 impl を継承しServiceImpl
、独自のインターフェイスを実装する必要があります。
特定のビジネス ロジックを実装する場合、IService
インターフェイス。たとえば、getUserById
メソッド、IService
インターフェイスによって提供されるgetById
メソッドを 呼び出すことでユーザー情報をクエリできます。
import com.lz.platform.trauma.common.service.UserService ;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Override
public User getUserById(Long id) {
return getById(id);
}
@Override
public boolean addUser(User user) {
return save(user);
}
@Override
public boolean updateUser(User user) {
return updateById(user);
}
@Override
public boolean deleteUser(Long id) {
return removeById(id);
}
}
ServiceImpl
これは、Mybatis-Plus によって提供される Service インターフェイスのデフォルトの実装であり、IService
インターフェイス。を使用すると、多くの繰り返しコードの作成をServiceImpl
回避し、コードの可読性と保守性を向上させることができます 。
ServiceImpl
実装されるのは、IService
インターフェイス ことに注意してください。より複雑なビジネス ロジックを実装する必要がある場合は、サービス インターフェイスで対応するメソッドを定義し、ServiceImpl
対応するビジネス ロジックを で実装する必要があります。
3.4 Mybatis-plus の使用:
Mybatis-plus が提供するメソッドをビジネス コードで直接使用できます。次に例を示します。
@Autowired
private UserMapper userMapper;
public void test() {
User user = new User();
user.setName("test");
user.setAge(18);
userMapper.insert(user);
List<User> userList = userMapper.selectList(null);
for (User u : userList) {
System.out.println(u);
}
List<User> userList2 = userMapper.selectByName("test");
for (User u : userList2) {
System.out.println(u);
}
}
4. 自動入力
4.1 フィールドフィルの説明:
エンティティクラスには @TableFeild というアノテーションがあり、その属性の 1 つである fill を設定することでFieldFill
自動入力に使用されます。
FieldFill
これは Mybatis-Plus によって提供される列挙型で、自動入力のフィールド タイプを定義するために使用されます。Mybatis-Plus をデータ操作に使用する場合、通常、作成時間、更新時間など、自動的に入力する必要があるフィールドがいくつか表示されます。Mybatis-Plus は、これらの自動入力操作を実装するためのFieldFill
列挙。
FieldFill
列挙型には次の型が含まれます。
- INSERT: データを挿入するときにフィールドが自動的に入力されることを示します。
- UPDATE: データが更新されるとフィールドに自動的にデータが入力されることを示します。
- INSERT_UPDATE: データの挿入または更新時にフィールドに自動的にデータが入力されることを示します。
4.2 フィールドフィルの実装
FeildFill は使用できません。MyBatis-Plus が提供するインターフェイスを実装するFieldFill
必要があります。
具体的な手順は次のとおりです。
1: 列挙型を定義するFieldFill
public enum FieldFill {
/**
* 默认不处理
*/
DEFAULT,
/**
* 插入时填充字段
*/
INSERT,
/**
* 更新时填充字段
*/
UPDATE,
/**
* 插入和更新时填充字段
*/
INSERT_UPDATE
}
2. エンティティ クラスで入力する必要があるフィールドに@TableField
アノテーションを、fill
属性を追加して、入力方法を指定します。1 つ以上のパディング メソッドを指定でき、複数のパディング メソッドはカンマで区切られます。
@Data
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
この例では、User
クラス内のupdateTime
フィールド@TableField(fill = FieldFill.INSERT_UPDATE)
にはupdateTime
、そのフィールドが います。
3. エンティティ クラスのフィールドへの入力を処理するMetaObjectHandler
インターフェイス。MetaObjectHandler
インターフェイスには、insertFill
との 2 つのデフォルト メソッドが含まれておりupdateFill
、それぞれ挿入時のパディングと更新時のパディングを処理します。どちらのメソッドも、エンティティ クラスに設定されたフィールドを取得するために使用されるMetaObject
パラメータを。
package com.lz.platform.trauma.common.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.lz.platform.constant.Constant;
import com.lz.platform.trauma.common.domain.DataEntity;
import com.lz.platform.trauma.common.vo.LoginUserVO;
import com.lz.platform.utils.RedisUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
/**
* 填充器
*/
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Autowired
private HttpServletRequest request;
@Autowired
private RedisUtils redisUtils;
@Override
public void insertFill(MetaObject metaObject) {
try {
if (metaObject.hasSetter("createDate")) {
this.setFieldValByName("createDate", new Date(), metaObject);
}
if (metaObject.hasSetter("delFlag")) {
this.setFieldValByName("delFlag", DataEntity.DEL_FLAG_NORMAL, metaObject);
}
String token = request.getHeader("token");
LoginUserVO loginUserVO = (LoginUserVO) redisUtils.get(Constant.LOGININFO_KEY + "_" + token);
if (loginUserVO != null) {
if (metaObject.hasSetter("createBy")) {
this.setFieldValByName("createBy", loginUserVO.getUserId(), metaObject);
}
}
}catch (Exception e){
//log.error("获取用户信息失败,失败原因为:" + e.getMessage());
}
}
@Override
public void updateFill(MetaObject metaObject) {
try {
if (metaObject.hasSetter("updateDate")) {
this.setFieldValByName("updateDate", new Date(), metaObject);
}
String token = request.getHeader("token");
LoginUserVO loginUserVO = (LoginUserVO) redisUtils.get(Constant.LOGININFO_KEY + "_" + token);
if (loginUserVO != null) {
if (metaObject.hasSetter("updateBy")) {
this.setFieldValByName("updateBy", loginUserVO.getUserId(), metaObject);
}
}
}catch (Exception e){
//log.error("获取用户信息失败,失败原因为:" + e.getMessage());
}
}
}
4. スタートアップ クラスの@MapperScan
アノテーションMapper
インターフェイスおよびMetaObjectHandler
インターフェイス実装クラスを含むパッケージをスキャンします。
2.3節の設定項目で説明します。
山が見えなければ山は見えない、私は一人で緑の山になる