09_公共字段自动填充
元数据处理器接口
com.baomidou.mybatisplus.mapper.MetaObjectHandler
两个方法:
- insertFill(MetaObject metaObject)
- updateFill(MetaObject metaObject)
metaObject:元对象,是Mybatis提供的一个用于更加方便、优雅访问对象的属性,给对象的属性设置值的一个对象,还会用于包装对象。支持对Object、Map、Collection等对象进行包装。
本质上metaObject获取对象的属性值或者是给对象的属性设置值,最终是要通过Reflector获取到属性的对应方法的invoker,最终invoke()。
开发步骤
-
注解填充字段@TableField(fill=FieldFill.INSERT_UPDATE) 查看FieldFill
@TableField(fill=FieldFill.INSERT_UPDATE) private String deptName;
-
自定义公共字段填充处理器(继承MetaObjectHandler类,实现两个方法)
/** * 自定义的公共字段填充处理器 * @author Administrator * */ public class MyMetaObjectHandler extends MetaObjectHandler { /** * 插入操作 自动填充 */ @Override public void insertFill(MetaObject metaObject) { // 获取到需要被填充的字段的值 Object fieldValue = getFieldValByName("name", metaObject); if(fieldValue == null) { System.err.println("**********插入操作 满足填充条件**********"); setFieldValByName("deptName", "defaultI", metaObject); } } /** * 修改操作 自动填充 */ @Override public void updateFill(MetaObject metaObject) { // 获取到需要被填充的字段的值 Object fieldValue = getFieldValByName("name", metaObject); if(fieldValue == null) { System.err.println("**********更新操作 满足填充条件**********"); setFieldValByName("deptName", "defaultU", metaObject); } } }
-
MP全局注入自定义公共字段填充处理器
<!-- 定义Mybatis-Plus的全局策略配置 --> <bean id="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration"> ... <!-- 注入公共字段填充处理器 --> <property name="metaObjectHandler" ref="myMetaObjectHandler"></property> </bean> <!-- 公共字段填充处理器 --> <bean id="myMetaObjectHandler" class="top.tomxwd.mp.metaObjectHandler.MyMetaObjectHandler"></bean>
-
测试结果:
-
进行插入:
代码
/** * 测试公共字段填充 * @throws Exception */ @Test public void testMetaObjectHandler() throws Exception { Dept2 d = new Dept2(); Integer result = deptMapper.insert(d); System.out.println("result:"+result); }
日志以及控制台输出
**********插入操作 满足填充条件********** DEBUG 06-15 22:30:59,084 Fetching JDBC Connection from DataSource (DataSourceUtils.java:110) DEBUG 06-15 22:30:59,084 JDBC Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@a8ef162 [wrapping: com.mysql.jdbc.JDBC4Connection@2eea88a1]] will not be managed by Spring (SpringManagedTransaction.java:87) DEBUG 06-15 22:30:59,088 ==> Preparing: INSERT INTO tbl_dept ( dept_name ) VALUES ( ? ) (BaseJdbcLogger.java:159) DEBUG 06-15 22:30:59,114 ==> Parameters: defaultI(String) (BaseJdbcLogger.java:159) DEBUG 06-15 22:30:59,117 <== Updates: 1 (BaseJdbcLogger.java:159) DEBUG 06-15 22:30:59,122 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5a7fe64f] (SqlSessionUtils.java:191) DEBUG 06-15 22:30:59,122 Returning JDBC Connection to DataSource (DataSourceUtils.java:327) result:1
可以看到,虽然dept_name没有设置值,但是调用了填充方法,所以填充了插入默认值。
-
进行更新:
代码
/** * 测试公共字段填充 * @throws Exception */ @Test public void testMetaObjectHandler() throws Exception { Dept2 d = new Dept2(); d.setId(3); d.setValid(0); Integer result = deptMapper.updateById(d); System.out.println("result:"+result); }
日志以及控制台输出
**********更新操作 满足填充条件********** DEBUG 06-15 22:38:32,905 Fetching JDBC Connection from DataSource (DataSourceUtils.java:110) DEBUG 06-15 22:38:32,905 JDBC Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@376a0d86 [wrapping: com.mysql.jdbc.JDBC4Connection@62656be4]] will not be managed by Spring (SpringManagedTransaction.java:87) DEBUG 06-15 22:38:32,912 ==> Preparing: UPDATE tbl_dept SET dept_name=?, `valid`=? WHERE id=? AND `valid`=1 (BaseJdbcLogger.java:159) DEBUG 06-15 22:38:32,938 ==> Parameters: defaultU(String), 0(Integer), 3(Integer) (BaseJdbcLogger.java:159) DEBUG 06-15 22:38:32,940 <== Updates: 1 (BaseJdbcLogger.java:159) DEBUG 06-15 22:38:32,941 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@41330d4f] (SqlSessionUtils.java:191) DEBUG 06-15 22:38:32,941 Returning JDBC Connection to DataSource (DataSourceUtils.java:327) result:1
需要注意:如果说你只是想更新几个字段,但是只要你没有set值,他就会帮你自动填充。例如:你只想修改valid的值为1,不想改变原来的dept_name的值,但是如果没有set dept_name的值,他就会用默认的defaultU来覆盖原来的dept_name!!!
-