目 录CONTENT

文章目录

09_公共字段自动填充

ByteNews
2021-06-15 / 0 评论 / 0 点赞 / 7,823 阅读 / 3,885 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-01-20,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

09_公共字段自动填充

元数据处理器接口

com.baomidou.mybatisplus.mapper.MetaObjectHandler

两个方法:

  • insertFill(MetaObject metaObject)
  • updateFill(MetaObject metaObject)

metaObject:元对象,是Mybatis提供的一个用于更加方便、优雅访问对象的属性,给对象的属性设置值的一个对象,还会用于包装对象。支持对Object、Map、Collection等对象进行包装。

​ 本质上metaObject获取对象的属性值或者是给对象的属性设置值,最终是要通过Reflector获取到属性的对应方法的invoker,最终invoke()。


开发步骤

  1. 注解填充字段@TableField(fill=FieldFill.INSERT_UPDATE) 查看FieldFill
    @TableField(fill=FieldFill.INSERT_UPDATE)
    private String deptName;
  1. 自定义公共字段填充处理器(继承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);
    		}
    	}
    
    }
    
  2. 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>
    
  3. 测试结果:

    • 进行插入:

      代码

      /**
      * 测试公共字段填充
      * @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!!!

0

评论区