九、公共字段自动填充

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/runewbie/article/details/102759062

上一节我们学习了mybatis-plus 的自定义全局操作和全局sql注入,这一节我们来学习一下mybatis-plus 的公共字段自动填充

1、元数据处理器接口——MetaObjectHandler

要实现公共字段自动填充的填充功能,我们实现MetaObjectHandler来定义一个自定义公共字段填充器,并实现 insertFill(MetaObject metaObject)和 updateFill(MetaObject metaObject) 方法。

metaobject: 元对象,是 Mybatis 提供的一个用于更加方便,更加优雅的访问对象的属性,给对象的属性设置值 的一个对象. 还会用于包装对象. 支持对 Object 、 Map、 Collection等对象进行包装本质上 metaObject 获取对象的属性值或者是给对象的属性设置值,最终是要通过 Reflector 获取到属性的对应方法的 Invoker, 最终 invoke。

2、开发步骤

首先按照快速开始——Spring集成Mybatis-Plus一节的操作,新建一个mp08 的 Module,可以将mp02resources的内容全部复制过来。

2.1、 注解填充字段 @TableFile(fill = FieldFill.INSERT) 查看 FieldFill

com.mp.beans目录下新建一个 Employee实体类,使用 @TableField 添加字段自动填充注解:

 * mybatis-plus默认会使用实体类的小写类名作为表名
 *
 * 继承 Model 类,开启AR模式
 */
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
@TableName("tbl_employee")
public class Employee extends Model<Employee> {

    private Integer id;
    private String lastName;
    private String email;

    /**
     * 添加字段自动填充注解
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer gender;

    private Integer age;

    @Override
    protected Serializable pkVal() {
        return this.id;
    }
}

在 com.mp.mapper路径下新建一个mapper,为了方便我们一会测试:

public interface EmployeeMapper extends BaseMapper<Employee> {
}

2.2、 自定义公共字段填充处理器

在 com.mp.handler 目录下新建一个 MyMetaObjectHandler处理器类:

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    private static final Logger LOGGER = LoggerFactory.getLogger(MyMetaObjectHandler.class);

    @Override
    public void insertFill(MetaObject metaObject) {
        LOGGER.info("start insert fill ....");
        Object gender = this.getFieldValByName("gender", metaObject);
        if (gender == null) {
            //避免使用metaObject.setValue()
            this.setFieldValByName("gender", 1, metaObject);
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        Object gender = this.getFieldValByName("gender", metaObject);
        if (gender == null) {
            LOGGER.info("start update fill ....");
            this.setFieldValByName("gender", 0, metaObject);
        }
    }
}

注意:实现MetaObjectHandler来定义一个自定义公共字段填充器,并实现 insertFill(MetaObject metaObject)和 updateFill(MetaObject metaObject) 方法。getFieldValByName 和 setFieldValByName 的第一个参数是我们需要自动填充的字段。

2.3、 MP 全局注入 自定义公共字段填充处理器

修改 applicationContext.xml 文件,添加如下配置:

<!-- mp08 公共字段填充器-->
<bean id="myMetaObjectHandler" class="com.mp.handler.MyMetaObjectHandler"></bean>
<!-- 定义mybatis-plus全局策略配置-->
<bean id="globalConfiguration" class="com.baomidou.mybatisplus.core.config.GlobalConfig">
    <!-- mp08 注入公共字段填充处理 -->
    <property name="metaObjectHandler" ref="myMetaObjectHandler"></property>
</bean>

完整 applicationContext.xml 文件配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
       xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring
        http://mybatis.org/schema/mybatis-spring-1.2.xsd
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

    <!-- 数据源 -->
    <context:property-placeholder location="classpath:db.properties"/>
    <bean id="dataSource"
          class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driver}"></property>
        <property name="url" value="${jdbc.url}"></property>
        <property name="username" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>

    <!-- 事务管理器 -->
    <bean id="dataSourceTransactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!-- 基于注解的事务管理 -->
    <tx:annotation-driven
            transaction-manager="dataSourceTransactionManager"/>

    <!-- 配置 SqlSessionFactoryBean
        mybatis提供的:org.mybatis.spring.SqlSessionFactoryBean
        mybatis-plus提供的:3.2.0 com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean
                2.3 com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean
     -->
    <bean id="sqlSessionFactoryBean"
          class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
        <!-- 数据源 -->
        <property name="dataSource" ref="dataSource"></property>
        <property name="configLocation" value="classpath:mybatis-config.xml"></property>
        <!-- 别名处理 -->
        <property name="typeAliasesPackage" value="com.mp.beans"></property>
        <!-- 注入配置-->
        <!--<property name="configuration" ref="configuration"></property>-->
        <!-- 注入全局配置策略-->
        <property name="globalConfig" ref="globalConfiguration"></property>

        <property name="plugins">
            <!-- 分页查询插件 -->
            <bean id="paginationInterceptor" class="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor">
                <property name="dialectType" value="mysql" />
            </bean>
        </property>

    </bean>

    <!--这个等于Mybatis的全局配置文件,如果在MybatisSqlSessionFactoryBean里面已经配置了configLocation属性(外部加载Mybatis全局配置文件),就不能再配置configuration属性-->
    <bean id="configuration" class="com.baomidou.mybatisplus.core.MybatisConfiguration">
        <!--开启驼峰命名-->
        <property name="mapUnderscoreToCamelCase" value="true"/>
        <!--日志打印SQL语句-->
        <property name="logImpl" value="org.apache.ibatis.logging.log4j.Log4jImpl"></property>

    </bean>

    <!-- 定义mybatis-plus全局策略配置-->
    <bean id="globalConfiguration" class="com.baomidou.mybatisplus.core.config.GlobalConfig">
        <!-- 全局主键策略-->
        <property name="dbConfig" ref="dbConfig"></property>

        <!-- mp08 注入公共字段填充处理 -->
        <property name="metaObjectHandler" ref="myMetaObjectHandler"></property>
    </bean>
    <!-- 这里-->
    <bean id="dbConfig" class="com.baomidou.mybatisplus.core.config.GlobalConfig$DbConfig">
        <!-- 全局表主键生成策略 -->
        <property name="idType" value="AUTO"></property>
        <!-- 全局的表前缀策略配置 -->
        <property name="tablePrefix" value="tbl_"></property>
    </bean>

    <!-- mp08 公共字段填充器-->
    <bean id="myMetaObjectHandler" class="com.mp.handler.MyMetaObjectHandler"></bean>

    <!--
    配置 mybatis 扫描 mapper 接口的路径
    -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage"
                  value="com.mp.mapper"></property>
    </bean>
</beans>

2.4、测试

在 com.mp.test下添加测试类 TestMp

public class TestMp {
    private ApplicationContext ioc = new
            ClassPathXmlApplicationContext("applicationContext.xml");

    private EmployeeMapper employeeMapper = ioc.getBean("employeeMapper", EmployeeMapper.class);

    /**
     * 测试公共填充字段
     */
    @Test
    public void testFillMetaInfo(){
        Employee employee = new Employee();
        employeeMapper.insert(employee);
    }
}

完成上面的操作后,mp08的代码结构如下所示:

mp08-01.png

至此,基于 mybatis-plus 的公共字段自动填充演示就完成了,下面我们就可以进入到z最后一节使用Idea 快速开发插件的学习了。

源代码

相关示例完整代码:mybatis-plus-in-action

猜你喜欢

转载自blog.csdn.net/runewbie/article/details/102759062
今日推荐