上一节咱们学习了mybatis-plus
的自定义全局操做和全局sql注入
,这一节咱们来学习一下mybatis-plus
的公共字段自动填充
。java
要实现公共字段自动填充的填充功能,咱们实现MetaObjectHandler
来定义一个自定义公共字段填充器,并实现 insertFill(MetaObject metaObject)
和 updateFill(MetaObject metaObject)
方法。mysql
metaobject: 元对象,是 Mybatis 提供的一个用于更加方便,更加优雅的访问对象的属性,给对象的属性设置值 的一个对象. 还会用于包装对象. 支持对 Object 、 Map、 Collection等对象进行包装本质上 metaObject 获取对象的属性值或者是给对象的属性设置值,最终是要经过 Reflector 获取到属性的对应方法的 Invoker, 最终 invoke。git
首先按照快速开始——Spring集成Mybatis-Plus
一节的操做,新建一个mp08
的 Module
,能够将mp02
中resources
的内容所有复制过来。github
在com.mp.beans
目录下新建一个 Employee
实体类,使用 @TableField
添加字段自动填充注解:spring
* 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,为了方便咱们一会测试:sql
public interface EmployeeMapper extends BaseMapper<Employee> {
}
复制代码
在 com.mp.handler
目录下新建一个 MyMetaObjectHandler
处理器类:apache
@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
的第一个参数是咱们须要自动填充的字段。mybatis
修改 applicationContext.xml
文件,添加以下配置:app
<!-- 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
文件配置以下:ide
<?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>
复制代码
在 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的代码结构以下所示:
至此,基于 mybatis-plus
的公共字段自动填充
演示就完成了,下面咱们就能够进入到z最后一节使用Idea 快速开发插件
的学习了。
相关示例完整代码:mybatis-plus-in-action