この記事では、SpringBoot Mybatis Plus のパブリック フィールドの自動入力機能に関する関連情報を主に紹介します。必要な方は参考にしてください。
1. アプリケーション シナリオ
最終変更時刻 これらの 2 つのフィールドは、ほとんどのテーブルで一般的ですが、追加または変更するたびにこれらのフィールドが渡されたかどうかを考慮するのは非常に面倒です。 mybatisPlus には素晴らしいソリューションがあります。それがパブリックフィールドの自動入力機能です。一般に、この関数は次の条件を満たすフィールドに使用できます:
このフィールドはほとんどのテーブルにあります。
このフィールドの値は固定されているか、フィールド値はバックグラウンドで動的に取得できます。
一般的に使用されるフィールドは、last_update_time と last_update_name です。
2. MybatisPlus を設定する
ガイド パッケージ: 注意すべき点は、mybatisPlus がバージョン 2.0.6 でのみサポートされていることです更新されました 以前は、サポートされていた新しいデータのみが自動的に入力されます。いつでも使用されます。
以前に MybatisPlus を設定したことがある場合は、次の手順を追加するだけで済みます:
IMetaObjectHandler抽象クラスを継承し、insertFill() でデータを追加し、更新時に updateFill() するときに入力する必要があるフィールド設定を実装します。 data 入力する必要があるフィールドに次の 2 つのメソッドを設定します:
package io.z77z.util; import java.util.Date; import org.apache.ibatis.reflection.MetaObject; import org.apache.shiro.SecurityUtils; import org.springframework.stereotype.Component; import com.baomidou.mybatisplus.mapper.MetaObjectHandler; import io.z77z.entity.SysUser; /** mybatisplus自定义填充公共字段 ,即没有传的字段自动填充*/ @Component public class MyMetaObjectHandler extends MetaObjectHandler { //新增填充 @Override public void insertFill(MetaObject metaObject) { Object lastUpdateNameId = metaObject.getValue("lastUpdateNameId"); Object lastUpdateTime = metaObject.getValue("lastUpdateTime"); //获取当前登录用户 SysUser user = (SysUser)SecurityUtils.getSubject().getPrincipal(); if (null == lastUpdateNameId) { metaObject.setValue("lastUpdateNameId", user.getId()); } if (null == lastUpdateTime) { metaObject.setValue("lastUpdateTime", new Date()); } } //更新填充 @Override public void updateFill(MetaObject metaObject) { insertFill(metaObject); } }
注: getValue() メソッドのパラメーターは、pojo クラスの variables (キャメルケース命名メソッド) です。
mybatisplus の 設定ファイル で、パブリック フィールド生成クラスの Bean:
// MP 全局配置,更多内容进入类看注释 GlobalConfiguration globalConfig = new GlobalConfiguration(); //配置公共字段自动填写 globalConfig.setMetaObjectHandler(new MyMetaObjectHandler());
つまり、MP グローバル設定オブジェクトに書き込まれたばかりのパブリック フィールド充填設定を設定します。
Filled フィールドは検証のために無視する必要があります。テーブル オブジェクト pojo クラスの対応する attribute に次のアノテーションを追加します。
/** * 最后修改人Id */ @TableField(value="last_update_id",validate=FieldStrategy.NOT_EMPTY) private String lastUpdateNameId; /** * 最后修改时间 */ @TableField(value="last_update_time",validate=FieldStrategy.NOT_EMPTY) private Date lastUpdateTime;
理由: update メソッドと insert メソッドが呼び出されるときに、属性が正しいかどうかが検証されるためです。渡した属性は空です。これはパブリック フィールドの自動入力と競合するため、この属性が検証を必要としないことを示すために必要です。そうしないと、挿入中に充填が失敗します。
3. テストクラスを書く
4. テストログ
2017/04/23-19:35:26 [main] DEBUG io.z77z.dao.SysUserMapper.insert-= => 準備: INSERT INTO sys_user ( id, Nickname, email, pswd, `status`, last_update_name_id, last_update_time ) VALUES ( ?, ?, ?, ?, ?,?, ? )2017/04/23-19: 35:26 [メイン] デバッグ io.z77z.dao.SysUserMapper.insert- ==> パラメータ: 6634923de4a14b6ca3bac5fdf31563a8(文字列)、z77z(文字列)、1093615728@qq.com(文字列)、123123(文字列)、 1(文字列)、123(文字列)、2017-04-23 19:35:26.58(タイムスタンプ)
2017/04/23-19:35:26 [メイン] DEBUG io.z77z.dao.SysUserMapper.insert- adfabeb603f3900e67665a020b6620e8 準備中: SELECT id,nickname,email,pswd,last_login_time AS lastLoginTime,`status `,last_update_name_id AS lastUpdateNameId、create_name_id AS createNameId、last_update_time AS lastUpdateTime、create_time AS createTime FROM sys_user WHERE id=?
2017/04/23-19:35:26 [main] デバッグ io.z77z.dao.SysUserMapper.selectById- = =>パラメータ:6634923DE4A14B6CA3BAC5FDF31563A8(STRING) :35:26 [main] DEBUG io.z77z.dao.SysUserMapper.updateById- ==> 準備中: UPDATE sys_user SET pswd=?、last_update_name_id=?、last_update_time=? WHERE id=? :35:26 [メイン] DEBUG io.z77z.dao.SysUserMapper.updateById- ==> パラメーター: 123(文字列)、123(文字列)、2017-04-23 19:35:26.637(タイムスタンプ)、6634923de4a14b6ca3bac5fdf3156 3a8 (文字列)
2017/04/23-19:35:26 [メイン] DEBUG io.z77z.dao.SysUserMapper.updateById- <== 更新: 1
2017/04/23-19:35:26 [メイン] ] デバッグ io.z77z.dao.SysUserMapper.selectById- ==> sys_user WHERE id=?
2017/04/23-19:35:26 [メイン] デバッグ io.z77z.dao.SysUserMapper.selectById- ==>パラメータ: 6634923de4a14b6ca3bac5fdf31563a8(String)
2017/04/2 3-19: 35:26 [main] DEBUG io.z77z.dao.SysUserMapper.selectById- <== 合計: 1
5。まとめ
当初、このメソッドを使用して作成者と作成時刻を処理する予定でしたが、最終的に、これら 2 つのフィールドも空として無視される場合、つまり validate=FieldStrategy.NOT_EMPTY が追加された場合、データが更新されることがわかりました。データは作成者と作成時刻も一緒に更新されます。渡されない場合は空に更新されます。したがって、mybatisPlus のパブリックフィールドの自動入力機能は優れていると思いますが、実際のニーズに使用すると完璧ではありません。 【関連する推奨事項】
以上がMybatis Plusのパブリックフィールド自動入力の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。