アノテーション設定
本文では MyBatisPlus のアノテーションの使用方法と属性について詳しく説明し、ソースコードへのリンクを提供して理解を深めます。以下のリンクからアノテーションクラスのソースコードを確認できます。
@TableName
このアノテーションは、エンティティクラスが対応するデータベーステーブル名を指定するために使用されます。エンティティクラス名がデータベーステーブル名と一致しない場合、またはエンティティクラス名がデータベーステーブル名のキャメルケース表記でない場合、このアノテーションを使用してテーブル名を明示的に指定する必要があります。
@TableName("sys_user")public class User { private Long id; private String name; private Integer age; private String email;}
value
型: String
デフォルト値: ""
エンティティクラスが対応するデータベーステーブル名を指定します。エンティティクラス名とテーブル名が一致しない場合、この属性を使用して正しいテーブル名を指定します。
schema
型: String
デフォルト値: ""
データベースの Schema 名を指定します。通常、データベースが Schema を使用してテーブルを整理していない場合、この属性は記入する必要はありません。
keepGlobalPrefix
型: boolean
デフォルト値: false
グローバル設定で tablePrefix が設定されている場合、この属性はグローバルのテーブルプレフィックスを使用し続けるかどうかを決定します。true に設定すると、アノテーションでテーブル名を指定した場合でも、グローバルのテーブルプレフィックスが自動的に追加されます。
resultMap
型: String
デフォルト値: ""
XML で定義された ResultMap の ID を指定し、クエリ結果を特定の型のエンティティクラスオブジェクトにマッピングするために使用されます。
autoResultMap
型: boolean
デフォルト値: false
resultMap を自動的に構築するかどうかを指定します。resultMap が既に設定されている場合、この属性は有効になりません。
excludeProperty
型: String[]
デフォルト値: {}
追加時期: @since 3.3.1
マッピング時に除外するプロパティ名を指定します。これらのプロパティは生成される SQL 文に含まれません。
@TableId
このアノテーションは、エンティティクラス内のプライマリキーフィールドをマークするために使用されます。プライマリキーフィールド名が id である場合、このアノテーションは省略できます。
@TableName("sys_user")public class User { @TableId private Long id; private String name; private Integer age; private String email;}
value
型: String
デフォルト値: ""
データベーステーブルのプライマリキーフィールド名を指定します。設定しない場合、MyBatis-Plus はエンティティクラス内のフィールド名をデータベーステーブルのプライマリキーフィールド名として使用します。
type
型: Enum
デフォルト値: IdType.NONE
プライマリキーの生成戦略を指定します。
IdType 列挙型の定義
IdType.AUTO
:データベースの自動インクリメント ID をプライマリキーとして使用します。IdType.NONE
:特定の生成戦略がなく、グローバル設定に IdType 関連の設定がある場合、グローバル設定に従います。IdType.INPUT
:データ挿入前に、ユーザーが自らプライマリキーの値を設定します。IdType.ASSIGN_ID
:ID を自動割り当てします。Long
、Integer
、String
型のプライマリキーに適用されます。デフォルトではIdentifierGenerator
のnextId
を通じて Snowflake アルゴリズムを使用して実装されます。 @since 3.3.0IdType.ASSIGN_UUID
:UUID を自動割り当てします。String
型のプライマリキーに適用されます。デフォルトの実装はIdentifierGenerator
のnextUUID
メソッドです。 @since 3.3.0
@TableField
このアノテーションは、エンティティクラス内の非プライマリキーフィールドをマークするために使用され、MyBatis-Plus にエンティティクラスのフィールドをデータベーステーブルのフィールドにマッピングする方法を指示します。エンティティクラスのフィールド名がキャメルケース命名規則に従い、データベーステーブルのフィールド名と一致する場合、このアノテーションは省略できます。
@TableName("sys_user")public class User { @TableId private Long id; @TableField("nickname") // データベースフィールド "nickname" へのマッピング private String name; private Integer age; private String email;}
value
型: String
デフォルト値: ""
データベース内のフィールド名を指定します。エンティティクラスのフィールド名とデータベースのフィールド名が異なる場合、この属性を使用して正しいデータベースフィールド名を指定します。
exist
型: boolean
デフォルト値: true
このフィールドがデータベーステーブルに存在するかどうかを示します。false に設定すると、MyBatis-Plus は SQL 生成時にこのフィールドを無視します。
condition
型: String
デフォルト値: ""
エンティティクエリ(EntityQuery)実行時に、フィールドの条件式を指定します。これにより、WHERE 句でのフィールドの比較方法をカスタマイズできます。この項目に値がある場合はその値が優先され、値がない場合はグローバルの %s=#{%s}
が使用されます。
書き方の詳細については SqlCondition を参照してください。
使用例の説明
User エンティティクラスがあり、id、name、age の 3 つのフィールドがあるとします。年齢が 18 歳以上のユーザーを検索したい場合、QueryWrapper を使用してこのクエリを構築し、User エンティティクラスのインスタンスを直接渡すことができます:
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.baomidou.mybatisplus.annotation.TableField;import com.baomidou.mybatisplus.annotation.SqlCondition;
// エンティティクラスの定義@TableName("sys_user")public class User { @TableId private Long id;
private String name;
@TableField(condition = "%s > #{%s}") // age フィールドのカスタム条件式 private Integer age;
private String email;}
// EntityQuery を使用してクエリを構築public List<User> findUserAgeOver18() { // クエリ条件を設定するための User インスタンスを作成 User queryEntity = new User(); queryEntity.setAge(18); // age フィールドの値を設定
// User インスタンスを渡して QueryWrapper インスタンスを作成 QueryWrapper<User> queryWrapper = new QueryWrapper<>(queryEntity);
// クエリを実行 List<User> userList = userMapper.selectList(queryWrapper);
return userList;}
この例では、@TableField(condition = "%s > #{%s}")
アノテーションを使用して age フィールドにカスタム条件式を設定しています。クエリを構築する際、User インスタンスを作成し、age フィールドの値を 18 に設定します。その後、このインスタンスを使用して QueryWrapper を作成し、MyBatis-Plus はエンティティクラス上のアノテーションに基づいて自動的に対応する SQL クエリ条件を生成します。
findUserAgeOver18 メソッドを実行すると、MyBatis-Plus は以下のような SQL 文を生成します:
SELECT * FROM sys_user WHERE age > 18;
このように、condition 属性を使用することで、クエリ時のフィールドの動作をカスタマイズし、クエリをより柔軟かつ特定の要件に合わせることができ、同時に SQL フラグメントを手動で記述する煩雑さを避けることができます。
update
型: String
デフォルト値: ""
更新操作実行時の、SET 句におけるフィールドの式を指定します。この属性は el 属性よりも優先順位が高く、フィールドの更新ロジックをカスタマイズすることができます。
使用例の説明
User エンティティクラスがあり、その中に version フィールドがあるとします。ユーザー情報を更新するたびに、version フィールドの値を自動的に 1 増加させたい場合、@TableField アノテーションの update 属性を使用してこの機能を実装できます:
import com.baomidou.mybatisplus.annotation.TableField;
@TableName("sys_user")public class User { @TableId private Long id;
private String name;
private Integer age;
private String email;
@TableField(update="%s+1") // 更新時の式をカスタマイズ private Integer version;}
この例では、@TableField(update="%s+1")
アノテーションは、更新操作時に version フィールドに対して version = version + 1
という式を使用するよう MyBatis-Plus に指示します。これにより、ユーザー情報を更新するたびに、version フィールドの値が自動的に 1 増加します。
以下のような更新操作を実行すると:
User user = new User();user.setId(1L);user.setName("Updated Name");user.setAge(30);user.setEmail("updated@example.com");
userMapper.updateById(user);
MyBatis-Plus は以下のような SQL 文を自動的に生成します:
UPDATE sys_userSET name = 'Updated Name', age = 30, email = 'updated@example.com', version = version + 1WHERE id = 1;
このように、update 属性を使用することで、フィールドの更新時の動作をカスタマイズし、更新操作をより柔軟かつ特定の要件に合わせることができ、同時に SQL フラグメントを手動で記述する煩雑さを避けることができます。
insertStrategy
型: Enum
デフォルト値: FieldStrategy.DEFAULT
新しいレコードを挿入する際に、フィールドの値をどのように処理するかを定義します。この属性により、フィールドを INSERT 文に含めるかどうか、およびどのような条件で含めるかを制御できます。
FieldStrategy 列挙型の定義
- FieldStrategy.DEFAULT:グローバル設定の戦略に従います。グローバル設定が指定されていない場合、デフォルトの動作はフィールド値が NULL でない場合にのみ、そのフィールドを挿入します。
- FieldStrategy.ALWAYS:フィールド値が NULL であるかどうかに関係なく、常にそのフィールドを挿入します。
- FieldStrategy.NOT_NULL:フィールド値が NULL でない場合にのみ、そのフィールドを挿入します。
- FieldStrategy.NOT_EMPTY:フィールド値が空でない(文字列型の場合)または NULL でない(その他の型の場合)場合にのみ、そのフィールドを挿入します。
- FieldStrategy.NEVER:フィールド値が NULL でない場合でも、そのフィールドを挿入しません。
- FieldStrategy.IGNORED:判定を無視します。効果は”ALWAYS” と同じです。 @Deprecated
使用例の説明
User エンティティクラスがあり、その中に nickname フィールドがあるとします。新しいユーザーを挿入する際に、nickname が空でない場合にのみそのフィールドを挿入したい場合、@TableField アノテーションの insertStrategy 属性を使用してこの機能を実装できます:
import com.baomidou.mybatisplus.annotation.TableField;import com.baomidou.mybatisplus.annotation.FieldStrategy;
@TableName("sys_user")public class User { @TableId private Long id;
@TableField(insertStrategy = FieldStrategy.NOT_EMPTY) // nickname が空でない場合のみ挿入 private String nickname;
private Integer age;
private String email;}
この例では、@TableField(insertStrategy = FieldStrategy.NOT_EMPTY)
アノテーションは、新しいユーザーを挿入する際に、nickname フィールドが空でない場合にのみ、そのフィールドを INSERT 文に含めるよう MyBatis-Plus に指示します。
以下のような挿入操作を実行すると:
User user = new User();user.setNickname("John Doe");user.setAge(25);user.setEmail("john.doe@example.com");
userMapper.insert(user);
MyBatis-Plus は以下のような SQL 文を自動的に生成します:
INSERT INTO sys_user (nickname, age, email)VALUES ('John Doe', 25, 'john.doe@example.com');
nickname フィールドが空の場合、生成される SQL には nickname フィールドが含まれません:
INSERT INTO sys_user (age, email)VALUES (25, 'john.doe@example.com');
これは以下の MyBatis のカスタム XML 設定と同等の効果があります:
<mapper namespace="com.example.mapper.UserMapper">
<!-- ユーザーの挿入 --> <insert id="insertUser" parameterType="com.example.entity.User"> INSERT INTO sys_user ( <if test="nickname != null and nickname != ''"> nickname, </if> age, email ) VALUES ( <if test="nickname != null and nickname != ''"> #{nickname}, </if> #{age}, #{email} ) </insert>
</mapper>
このように、insertStrategy 属性を使用することで、フィールドの挿入時の動作をカスタマイズし、挿入操作をより柔軟かつ特定の要件に合わせることができ、同時に SQL フラグメントを手動で記述する煩雑さを避けることができます。
updateStrategy
型: Enum
デフォルト値: FieldStrategy.DEFAULT
レコードの更新時に、フィールドの値をどのように処理するかを定義します。この属性により、フィールドを UPDATE 文の SET 句に含めるかどうか、およびどのような条件で含めるかを制御できます。
insertStrategy 属性を参照して、FieldStrategy 列挙型の詳細情報を確認してください。
使用例の説明
User エンティティクラスがあり、その中に nickname フィールドがあるとします。ユーザー情報を更新する際に、nickname フィールドの値が NULL であるかどうかに関係なく常に更新したい場合、@TableField アノテーションの updateStrategy 属性を使用してこの機能を実装できます:
import com.baomidou.mybatisplus.annotation.TableField;import com.baomidou.mybatisplus.annotation.FieldStrategy;
@TableName("sys_user")public class User { @TableId private Long id;
@TableField(updateStrategy = FieldStrategy.ALWAYS) // nickname を常に更新、値のチェックを無視 private String nickname;
private Integer age;
private String email;}
この例では、@TableField(updateStrategy = FieldStrategy.ALWAYS)
アノテーションは、ユーザー情報を更新する際に、nickname フィールドを常に UPDATE 文の SET 句に含め、値のチェックを無視するよう MyBatis-Plus に指示します。
以下のような更新操作を実行すると:
User user = new User();user.setId(1L);user.setNickname("Updated Nickname");user.setAge(30);user.setEmail("updated@example.com");
userMapper.updateById(user);
MyBatis-Plus は以下のような SQL 文を自動的に生成します:
UPDATE sys_userSET nickname = 'Updated Nickname', age = 30, email = 'updated@example.com'WHERE id = 1;
nickname フィールドの値に関係なく、生成される SQL には常に nickname フィールドが含まれます。つまり、nickname フィールドの値が空の場合でも、nickname フィールドを NULL に更新します。
このように、updateStrategy 属性を使用することで、フィールドの更新時の動作をカスタマイズし、更新操作をより柔軟かつ特定の要件に合わせることができ、SQL フラグメントを手動で記述する煩雑さを避けることができます。
whereStrategy
型: Enum
デフォルト値: FieldStrategy.DEFAULT
更新文の WHERE 句を生成する際に、フィールドの値をどのように処理するかを定義します。この属性により、フィールドを WHERE 句に含めるかどうか、およびどのような条件で含めるかを制御できます。
insertStrategy と updateStrategy 属性を参照して、FieldStrategy 列挙型の詳細情報を確認してください。
使用例の説明
User エンティティクラスがあり、その中に nickname フィールドがあるとします。ユーザー情報を更新する際に、nickname フィールドが空でない場合にのみ、それを WHERE 句の条件として使用できます。@TableField アノテーションの whereStrategy 属性を使用してこの機能を実装できます:
import com.baomidou.mybatisplus.annotation.TableField;import com.baomidou.mybatisplus.annotation.FieldStrategy;
@TableName("sys_user")public class User { @TableId private Long id;
@TableField(whereStrategy = FieldStrategy.NOT_EMPTY) // nickname が空でない場合のみ WHERE 条件として使用 private String nickname;
private Integer age;
private String email;}
この例では、@TableField(whereStrategy = FieldStrategy.NOT_EMPTY)
アノテーションは、whereEntity を使用して更新文の WHERE 句を生成する際に、nickname フィールドが空でない場合にのみ、それを WHERE 句に含めるよう MyBatis-Plus に指示します。
以下のような更新操作を実行すると:
User user = new User();user.setEmail("john.doe@example.com");
User whereEntity = new User();whereEntity.setNickname("John Doe");whereEntity.setAge(30);
// whereEntity メソッドを使用UpdateWrapper<User> updateWrapper = new UpdateWrapper<>(whereEntity);userMapper.update(user, updateWrapper);
MyBatis-Plus は以下のような SQL 文を自動的に生成します:
UPDATE sys_userSET email = 'john.doe@example.com'WHERE nickname = 'John Doe' AND age = 30;
nickname フィールドが空の場合、生成される SQL には nickname フィールドが含まれません:
UPDATE sys_userSET email = 'john.doe@example.com'WHERE age = 30;
これは以下の MyBatis のカスタム XML 設定と同等の効果があります:
<mapper namespace="com.example.mapper.UserMapper">
<!-- ユーザー情報の更新 --> <update id="updateUser" parameterType="com.example.entity.User"> UPDATE sys_user SET email = #{email} <where> <if test="nickname != null and nickname != ''"> AND nickname = #{nickname} </if> AND age = #{age} </where> </update>
</mapper>
このように、whereStrategy 属性を使用することで、フィールドの WHERE 句での動作をカスタマイズし、更新操作をより柔軟かつ特定の要件に合わせることができ、SQL フラグメントを手動で記述する煩雑さを避けることができます。insertStrategy と updateStrategy 属性を参照して、FieldStrategy 列挙型の詳細情報を確認してください。
fill
型: Enum
デフォルト値: FieldFill.DEFAULT
フィールドの自動補完戦略です。この属性は、データベース操作(挿入、更新など)を実行する際に、フィールドの値をどのように自動補完するかを指定するために使用されます。FieldFill 列挙型を使用することで、フィールドの補完動作を柔軟に制御できます。
FieldFill 列挙型の定義
-
FieldFill.DEFAULT
:デフォルトでは補完を行わず、データベースのデフォルト値または手動設定に依存します。 -
FieldFill.INSERT
:挿入操作時にフィールド値を自動的に補完します。 -
FieldFill.UPDATE
:更新操作時にフィールド値を自動的に補完します。 -
FieldFill.INSERT_UPDATE
:挿入と更新の両方の操作時にフィールド値を自動的に補完します。
使用例の説明
User エンティティクラスがあり、その中に createTime と updateTime フィールドがあるとします。ユーザーの作成時に自動的に作成時間を補完、ユーザー情報の更新時に自動的に更新時間を補完したい場合:
import com.baomidou.mybatisplus.annotation.FieldFill;import com.baomidou.mybatisplus.annotation.TableField;import com.baomidou.mybatisplus.annotation.TableName;import java.time.LocalDateTime;
@TableName("user")public class User { // その他のフィールド...
@TableField(fill = FieldFill.INSERT) private LocalDateTime createTime;
@TableField(fill = FieldFill.UPDATE) private LocalDateTime updateTime;
// コンストラクタ、getter、setter...}
この例では、createTime フィールドは挿入操作時に現在時刻が自動的に補完され、updateTime フィールドは更新操作時に現在時刻が自動的に補完されます。これにより、これらの時間フィールドの値をデータベース操作のたびに手動で設定する必要がなくなります。
注意点:自動補完機能を正常に動作させるためには、MyBatis-Plus の設定で適切な自動補完ハンドラーを設定し、エンティティクラスに対応する Mapper インターフェースで適切な挿入および更新メソッドを定義する必要があります。
select
型: boolean
デフォルト値: true
クエリ操作実行時に、そのフィールドを SELECT 文に含めるべきかどうかを指示します。この属性により、クエリ結果に含めるフィールドをより細かく制御でき、データアクセスの制御をより詳細に行うことができます。
詳細説明
-
select 属性が true(デフォルト値)に設定されている場合、そのフィールドはクエリ結果に含まれます。
-
select 属性が false に設定されている場合、そのフィールドはデータベーステーブルに存在していても、クエリ結果には含まれません。これは、機密データの保護やクエリパフォーマンスの最適化に役立ちます。
使用例の説明
User エンティティクラスがあり、その中に password フィールドがあるとします。ユーザー情報をクエリする際に、ユーザーのプライバシーを保護するために password フィールドを除外したい場合:
import com.baomidou.mybatisplus.annotation.TableField;import com.baomidou.mybatisplus.annotation.TableName;
@TableName("user")public class User { // その他のフィールド...
@TableField(select = false) private String password;
// コンストラクタ、getter、setter...}
この例では、クエリ操作を実行する際に、password フィールドは SELECT 文に含まれないため、クエリ結果にも表示されません。これにより、データベースにパスワード情報が保存されていても、通常のクエリでは漏洩することはありません。
@TableField アノテーションの select 属性は、MyBatis-Plus が生成するクエリ文にのみ影響を与え、他のフレームワークや手動で記述された SQL 文には影響しないという点に注意してください。また、select = false と設定されたフィールドを使用する場合、カスタムクエリや他の方法でそのフィールドにアクセスする際には、データの安全性および整合性に特に注意する必要があります。
keepGlobalFormat
型: boolean
デフォルト値: false
フィールドを処理する際に、グローバルな DbConfig に定義された columnFormat 規則を適用するかどうかを示します。この属性は、データベース操作時にフィールドの値に対してグローバルなカラムフォーマット規則を適用するかどうかを制御するために使用されます。
jdbcType
型: JdbcType
デフォルト値: JdbcType.UNDEFINED
JDBC タイプで、フィールドのデータベースでのデータ型を指定するために使用されます。この属性により、フィールドのデータ型をデータベースと互換性のある形で明示的に設定でき、特に特殊な型やカスタム型を処理する際に役立ちます。
詳細説明
-
jdbcType 属性が JdbcType.UNDEFINED(デフォルト値)に設定されている場合、MyBatis-Plus はフィールドの Java 型に基づいて自動的に JDBC 型を推論します。
-
jdbcType 属性が特定の JdbcType 列挙値に設定されている場合、そのフィールドは指定された JDBC 型を使用してデータベース操作を行います。これは型マッピングの問題を解決したり、データベースの型を正確に制御する必要がある場合に使用できます。
使用例の説明
CustomType エンティティクラスがあり、その中にカスタム型 MyCustomType のフィールドがあり、データベースで特定の JDBC 型として保存したい場合:
import com.baomidou.mybatisplus.annotation.TableField;import com.baomidou.mybatisplus.annotation.TableName;import org.apache.ibatis.type.JdbcType;
@TableName("custom_type")public class CustomType { // その他のフィールド...
@TableField(value = "my_custom_field", jdbcType = JdbcType.VARCHAR) private MyCustomType myCustomField;
// コンストラクタ、getter、setter...}
この例では、myCustomField フィールドは VARCHAR JDBC 型を使用してデータベース操作を行います。これにより、MyCustomType がカスタム型であっても、VARCHAR 型としてデータベースに保存されます。
注意点:jdbcType 属性は特定の状況でのみ設定する必要があります。例えば、Java 型とデータベース型の間のマッピング関係が不明確な場合などです。ほとんどの場合、MyBatis-Plus は型マッピングを自動的に処理できるため、jdbcType を明示的に設定する必要はありません。また、jdbcType 属性は MyBatis-Plus が生成する SQL 文にのみ影響を与え、他のフレームワークや手動で記述した SQL 文には影響を与えません。
typeHandler
型: Class<? extends TypeHandler>
デフォルト値: UnknownTypeHandler.class
型ハンドラーで、データベース操作時に特定のフィールドの値をどのように処理するかを指定します。この属性により、フィールド値の変換ロジックをカスタマイズして、特定のデータ型やビジネス要件に対応できます。
詳細説明
-
typeHandler 属性が設定されていない(つまり、デフォルト値の UnknownTypeHandler.class を使用した)場合、MyBatis-Plus はデフォルトの型ハンドラーを使用してフィールド値を処理します。
-
typeHandler 属性が特定の TypeHandler のサブクラスに設定されている場合、そのフィールドは指定された型ハンドラーを使用してデータベース操作を行います。これはカスタム型、特殊なデータフォーマット、または非標準のデータベース型を処理するために使用できます。
使用例の説明
User エンティティクラスがあり、その中に birthDate フィールドがあり、カスタムの型ハンドラーを使用して日付を特定のフォーマットでデータベースに保存したい場合:
import com.baomidou.mybatisplus.annotation.TableField;import com.baomidou.mybatisplus.annotation.TableName;import com.example.myproject.typehandler.CustomDateTypeHandler;import java.time.LocalDate;
@TableName("user")public class User { // その他のフィールド...
@TableField(value = "birth_date", typeHandler = CustomDateTypeHandler.class) private LocalDate birthDate;
// コンストラクタ、getter、setter...}
この例では、birthDate フィールドは CustomDateTypeHandler 型ハンドラーを使用してデータベース操作を行います。これにより、クエリ時にデータベースの日付値を LocalDate オブジェクトに変換する場合も、更新時に LocalDate オブジェクトの日付値をデータベースの特定の日付フォーマットに変換する場合も、CustomDateTypeHandler を使用して処理されます。
CustomDateTypeHandler は以下のように実装できます:
import org.apache.ibatis.type.BaseTypeHandler;import org.apache.ibatis.type.JdbcType;import java.sql.CallableStatement;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.time.LocalDate;import java.time.format.DateTimeFormatter;
public class CustomDateTypeHandler extends BaseTypeHandler<LocalDate> { private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@Override public void setNonNullParameter(PreparedStatement ps, int i, LocalDate parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, parameter.format(FORMATTER)); }
@Override public LocalDate getNullableResult(ResultSet rs, String columnName) throws SQLException { String dateString = rs.getString(columnName); return (dateString != null) ? LocalDate.parse(dateString, FORMATTER) : null; }
// その他の必要なメソッドを実装...}
このカスタム型ハンドラーでは、DateTimeFormatter を定義して日付のフォーマットを指定し、setNonNullParameter と getNullableResult メソッドで日付値の変換ロジックを実装しています。
注意点:カスタム型ハンドラーを有効にするためには、それが MyBatis-Plus の設定で正しく登録され、実行時にロードできることを確認する必要があります。また、カスタム型ハンドラーの使用は慎重に行い、その正確性とパフォーマンスを確保する必要があります。詳細については、タイプハンドラーの内容を参照してください。
numericScale
型: String
デフォルト値: ""
小数点以下の桁数を指定します。この属性は update 操作時のみ有効です。数値型フィールドの更新時の小数精度を制御するために使用されます。
詳細説明
- numericScale 属性が空文字列(デフォルト値)に設定されている場合、フィールドの小数精度はデータベースのデフォルト設定またはフィールド定義時の設定に従います。
- numericScale 属性が特定の数値(例えば “2”)に設定されている場合、そのフィールドは update 操作時に指定された小数桁数で処理されます。
使用例の説明 Product エンティティクラスがあり、その中に price フィールドがあり、更新時に小数点以下 2 桁を保持したい場合:
import com.baomidou.mybatisplus.annotation.TableField;import com.baomidou.mybatisplus.annotation.TableName;
@TableName("product")public class Product { // その他のフィールド...
@TableField(value = "price", numericScale = "2") private BigDecimal price;
// コンストラクタ、getter、setter...}
この例では、price フィールドは update 操作時に小数点以下 2 桁を保持することが保証されます。これは、価格を更新する際、その価格の小数桁数に関係なく、2 桁にフォーマットされることを意味します。
注意点:numericScale 属性を有効にするためには、データベースが指定された小数桁数をサポートしていることを確認し、update 操作時に数値型フィールドの値が正しく処理されることを確認する必要があります。また、numericScale 属性は MyBatis-Plus が生成する SQL 文にのみ影響を与え、他のフレームワークや手動で記述した SQL 文には影響を与えません。
@Version
このアノテーションは、エンティティクラス内のフィールドを楽観ロックのバージョン番号フィールドとしてマークするために使用されます。楽観ロックは並行制御メカニズムの一つで、複数のトランザクションが互いに干渉することなく同時に進行できると仮定し、トランザクションのコミット時にのみ競合をチェックします。エンティティクラスで @Version
アノテーションを使用することで、MyBatis-Plus は更新操作時に自動的にバージョン番号をチェックし、更新プロセス中にデータが他のトランザクションによって変更されていないことを確認します。
@TableName("sys_user")public class User { @TableId private Long id; @TableField("nickname") // データベースフィールド "nickname" へのマッピング private String name; private Integer age; private String email; @Version // 楽観ロックのバージョン番号フィールドとしてマーク private Integer version;}
上記の例では、version フィールドが楽観ロックのバージョン番号としてマークされています。更新操作を実行する際、MyBatis-Plus はこのフィールドの値がデータベース内の値と一致するかどうかをチェックします。一致しない場合、データが読み取られた後に他のトランザクションによって変更されたことを意味し、この場合は楽観ロックの例外がスローされ、開発者に適切な処理を促します。
@Version アノテーションを使用することで、並行更新時のデータの不整合問題を効果的に防ぎ、システムの並行性能とデータの整合性を向上させることができます。開発者はバージョン番号チェックのコードを手動で記述する必要がなく、MyBatis-Plus が自動的にこのプロセスを処理します。
@EnumValue
このアノテーションは、列挙型クラス内のフィールドをマークし、データベースに保存される列挙値を指定するために使用されます。エンティティクラスの特定のフィールドが列挙型である場合、@EnumValue アノテーションを使用することで、MyBatis-Plus にデータベースに保存する列挙値のどの属性を使用するかを指示することができます。
@TableName("sys_user")public class User { @TableId private Long id; @TableField("nickname") // データベースフィールド "nickname" へのマッピング private String name; private Integer age; private String email; private Gender gender; // Gender は列挙型}
public enum Gender { MALE("M", "男性"), FEMALE("F", "女性");
private String code; private String description;
Gender(String code, String description) { this.code = code; this.description = description; }
@EnumValue // データベースに保存される列挙値として code を指定 public String getCode() { return code; }}
上記の例では、Gender 列挙型の code フィールドが @EnumValue としてマークされており、これはデータベースに User エンティティクラスの gender フィールドを保存する際に、Gender 列挙型の code 値が保存され、列挙定数自体は保存されないことを意味します。
@EnumValue アノテーションを使用することで、列挙型のデータベースでの保存方法を柔軟に制御でき、データベース内のデータをよりコンパクトで扱いやすいものにすることができます。同時に、データベースからの列挙値の読み取り時の変換プロセスも簡素化されます。これは、MyBatis-Plus が @EnumValue アノテーションの設定に基づいて、データベース内の値を対応する列挙インスタンスに自動的に変換するためです。
@TableLogic
このアノテーションは、エンティティクラス内のフィールドを論理削除フィールドとしてマークするために使用されます。論理削除はデータ管理戦略の一つで、実際にはレコードをデータベースから物理的に削除せず、代わりにレコードに削除済みのマークを付けます。@TableLogic アノテーションを使用することで、MyBatis-Plus は検索、更新、削除操作時に論理削除フィールドの値を自動的に処理します。
@TableName("sys_user")public class User { @TableId private Long id; @TableField("nickname") // データベースフィールド "nickname" へのマッピング private String name; private Integer age; private String email; @TableLogic(value = "0", delval = "1") // 論理削除フィールド private Integer deleted;}
上記の例では、deleted フィールドが論理削除フィールドとしてマークされています。@TableLogic アノテーションの value 属性は論理未削除の値(この例では 0)を指定し、delval 属性は論理削除済みの値(この例では 1)を指定します。
クエリ操作を実行する際、MyBatis-Plus は論理的に削除されたレコードを自動的にフィルタリングし、未削除のレコードのみを返します。更新操作を実行する際、更新操作が論理削除フィールドの値を論理的な削除値に変更する場合、MyBatis-Plus はそのレコードを論理的に削除済みとしてマークします。削除操作を実行する際、MyBatis-Plus は論理削除フィールドの値を論理的な削除値に更新し、レコードを物理的に削除することはありません。
@TableLogic アノテーションを使用することで、データの論理削除を実装でき、データの完全性とトレーサビリティの維持に役立ちます。同時に、物理削除操作によって引き起こされる可能性のあるデータ損失のリスクを回避します。開発者は論理削除のコードを手動で記述する必要がなく、MyBatis-Plus がこのプロセスを自動的に処理します。
@KeySequence
このアノテーションは、Oracle データベースにおけるシーケンス(Sequence)の名前を指定するために使用され、エンティティクラスでプライマリキーの値を生成できるようにします。Oracle データベースでは、プライマリキーは通常、他のデータベースのような自動インクリメントフィールドではなく、シーケンスを使用して生成されます。@KeySequence アノテーションは MyBatis-Plus に対して、特定のシーケンスを使用してプライマリキーを生成するよう指示します。
@TableName("sys_user")@KeySequence("SEQ_USER_ID") // シーケンス名を "SEQ_USER_ID" として指定public class User { @TableId(type = IdType.INPUT) // シーケンスを使用してプライマリキーを生成 private Long id; @TableField("nickname") // データベースフィールド "nickname" へのマッピング private String name; private Integer age; private String email;}
上記の例では、@KeySequence アノテーションがエンティティクラス User に適用され、シーケンス名として “SEQ_USER_ID” が指定されています。これは、新しいレコードを挿入する際に、MyBatis-Plus がこのシーケンスを使用して id フィールドの値を生成することを意味します。
@KeySequence アノテーションの value 属性はシーケンスの名前を指定するために使用され、dbType 属性はデータベースの種類を指定するために使用されます。dbType が指定されていない場合、MyBatis-Plus は注入された IKeyGenerator の実装を使用します。複数の IKeyGenerator 実装がある場合は、dbType を指定する必要があります。
@KeySequence アノテーションを使用することで、Oracle データベースでプライマリキーの値が正しく生成されることを保証し、同時にプライマリキー生成の設定プロセスを簡素化できます。開発者はシーケンス値を取得するコードを手動で記述する必要がなく、MyBatis-Plus がこのプロセスを自動的に処理します。
@InterceptorIgnore
このアノテーションは、Mapper
の特定の method
(メソッドにアノテーションを付ける場合)または全ての method
(Mapper にアノテーションを付ける場合)の実行時に、特定のプラグイン(マルチテナントなど)を無視するかどうかを指定するために使用されます。
// @InterceptorIgnore(tenantLine = "1") // マルチテナントインターセプターを無視public interface UserMapper extends BaseMapper<User> {
@InterceptorIgnore(tenantLine = "1") // マルチテナントインターセプターを無視 List<User> selectUsers();}
上記の例では、selectUsers
メソッドの実行時にマルチテナントインターセプターが無視されます。
MyBatis-Plus が提供するプラグインは、アノテーション内にそれぞれ対応する属性があります。例えば、マルチテナントプラグインの場合は tenantLine
属性があり、属性の値が “1”、“yes”、“on” の場合、対応するプラグインが無視され、属性の値が “0”、“false”、“off” または空の場合、プラグインは通常通り実行されます。
プラグインの使用方法の詳細についてはプラグインを参照してください。
@OrderBy
このアノテーションは、エンティティクラス中のフィールドを実行クエリ操作時のデフォルトソート方式を指定するために使用されます。エンティティのフィールドに @OrderBy アノテーションを付与することで、明示的にソート条件を指定していない場合でも、MyBatis-Plus はアノテーションで定義された順序に従って結果を返します。
@TableName("sys_user")public class User { @TableId private Long id; @TableField("nickname") // データベースフィールド "nickname" にマッピング private String name; @OrderBy(asc = false, sort = 10) // デフォルトソートを降順に指定し、優先度を 10 に設定 private Integer age; private String email;}
上記の例では、age フィールドが @OrderBy としてマークされ、asc 属性が false に設定され、降順をデフォルトソートとし、sort 属性が 10 に設定され、このソートルールの優先度を表します。
@OrderBy アノテーションの asc 属性は、ソートが昇順か降順かを指定します。true に設定すると、昇順ソートを意味します。false に設定すると、降順ソートを意味します。sort 属性は、ソートルールの優先度を指定し、数字が小さいほど優先度が高く、最初に適用されます。
注意:@OrderBy アノテーションのソートルール優先度は、Wrapper 条件クエリオブジェクトで明示的に指定されたソート条件によって上書きされます。Wrapper 条件クエリオブジェクトでソート条件が指定されている場合、@OrderBy アノテーションで定義されたデフォルトソートは上書きされます。
@OrderBy アノテーションを使用すると、コードを簡素化し、毎回ソート条件を明示的に指定する必要を回避してデフォルトのソート方式を提供し、コードの読みやすさとメンテナンス性を向上させることができます。