Table of Contents
一、全局配置文件:applicationContext.xml
四、条件构造器:EntityWrapper 和 Condition
1 分页插件:com.baomidou.mybatisplus.plugins.PaginationInterceptor
2 执行分析插件:com.baomidou.mybatisplus.plugins.SqlExplainInterceptor
3性能分析插件:com.baomidou.mybatisplus.plugins.PerformanceInterceptor
4 乐观锁插件:com.baomidou.mybatisplus.plugins.OptimisticLockerInterceptor
代码地址:git@github.com:kathrinacathy/mybatisAndmybatisPlus.git
MyBatis-Plus(简称 MP),是一个 MyBatis 的增强工具包,只做增强不做改变. 为简化开 发工作、提高生产率而生 我们的愿景是成为 Mybatis 最好的搭档;
官方地址:
http://mp.baomidou.com
代码发布地址:
Github: https://github.com/baomidou/mybatis-plus
Gitee: https://gitee.com/baomidou/mybatis-plus
文档发布地址:
http://mp.baomidou.com/#/?id=%E7%AE%80%E4%BB%8B
一、全局配置文件: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:dbconfig.properties"/>
<!--mysql数据源配置-->
<!--<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>-->
<!--oracle数据源配置-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${orcl.driver}"></property>
<property name="jdbcUrl" value="${orcl.url}"></property>
<property name="user" value="${orcl.username}"></property>
<property name="password" value="${orcl.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
MP提供的:com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean
-->
<bean id="sqlSessionFactoryBean" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<!-- 别名处理 -->
<property name="typeAliasesPackage" value="com.mybatisPlus.entity"></property>
<property name="typeHandlers" >
<array>
<bean id="myTypeHandler" class="com.mybatisPlus.MyTypeHandler"></bean>
</array>
</property>
<!-- 注入全局MP策略配置 -->
<property name="globalConfig" ref="globalConfiguration"></property>
<property name="plugins">
<list>
<!-- 注册分页插件 -->
<bean class="com.baomidou.mybatisplus.plugins.PaginationInterceptor"></bean>
<!-- 注册执行分析插件 -->
<bean class="com.baomidou.mybatisplus.plugins.SqlExplainInterceptor">
<property name="stopProceed" value="true"></property>
</bean>
<!-- 注册性能分析插件 -->
<bean class="com.baomidou.mybatisplus.plugins.PerformanceInterceptor">
<property name="format" value="true"></property>
<!-- <property name="maxTime" value="5"></property> -->
</bean>
<!-- 注册乐观锁插件 -->
<bean class="com.baomidou.mybatisplus.plugins.OptimisticLockerInterceptor"></bean>
</list>
</property>
</bean>
<!-- 定义MybatisPlus的全局策略配置-->
<bean id ="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
<!-- 在2.3版本以后,dbColumnUnderline 默认值就是true -->
<property name="dbColumnUnderline" value="true"></property>
<!-- mysql:全局的主键策略 -->
<!-- <property name="idType" value="0"></property>-->
<!--oracle:全局主键配置-->
<property name="idType" value="1"></property>
<!-- 全局的表前缀策略配置 -->
<property name="tablePrefix" value="tb_"></property>
<!--<property name="sqlInjector" ref="mySqlInjector"></property>-->
<property name="sqlInjector" ref="logicSqlInjector"></property>
<property name="logicDeleteValue" value="1"></property>
<property name="logicNotDeleteValue" value="0"></property>
<property name="metaObjectHandler" ref="myMetaObjectHandler"></property>
<property name="keyGenerator" ref="oracleKeyGenerator"></property>
</bean>
<!--定义自定义注册器-->
<bean id="mySqlInjector" class="com.mybatisPlus.injector.MySqlInjector"></bean>
<bean class="com.baomidou.mybatisplus.mapper.LogicSqlInjector" id="logicSqlInjector"></bean>
<!--公共字段填充处理器-->
<bean id="myMetaObjectHandler" class="com.mybatisPlus.metaObjectHandler.MyMetaObjectHandler"></bean>
<!--oracle全局 MP 中配置 Oracle 主键 Sequence-->
<bean class="com.baomidou.mybatisplus.incrementer.OracleKeyGenerator" id="oracleKeyGenerator"></bean>
<!--
配置mybatis 扫描mapper接口的路径
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.mybatisPlus.mapper"></property>
</bean>
</beans>
集成mp就是将之前mabatis改为用:com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean 这个就可以
<!-- 配置SqlSessionFactoryBean
Mybatis提供的: org.mybatis.spring.SqlSessionFactoryBean
MP提供的:com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean
-->
<bean id="sqlSessionFactoryBean" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<!-- 别名处理 -->
<property name="typeAliasesPackage" value="com.mybatisPlus.entity"></property>
<property name="typeHandlers" >
<array>
<bean id="myTypeHandler" class="com.mybatisPlus.MyTypeHandler"></bean>
</array>
</property>
<!-- 注入全局MP策略配置 -->
<property name="globalConfig" ref="globalConfiguration"></property>
<property name="plugins">
<list>
<!-- 注册分页插件 -->
<bean class="com.baomidou.mybatisplus.plugins.PaginationInterceptor"></bean>
<!-- 注册执行分析插件 -->
<bean class="com.baomidou.mybatisplus.plugins.SqlExplainInterceptor">
<property name="stopProceed" value="true"></property>
</bean>
<!-- 注册性能分析插件 -->
<bean class="com.baomidou.mybatisplus.plugins.PerformanceInterceptor">
<property name="format" value="true"></property>
<!-- <property name="maxTime" value="5"></property> -->
</bean>
<!-- 注册乐观锁插件 -->
<bean class="com.baomidou.mybatisplus.plugins.OptimisticLockerInterceptor"></bean>
</list>
</property>
</bean>
二、常用注解:
@TableName 映射表名
@TableField 映射字段名,也可以添加指定是否属于表中字段
@TableId 可以指定主键策略
@KeySequence(value = "seq_user",clazz=Integer.class) 指定oracle的序列
@Version 用于注解实体字段,必须要有 乐观锁插件
@Mapper :在接口类上添加了@Mapper,在编译之后会生成相应的接口实现类
如果想要每个接口都要变成实现类,那么需要在每个接口类上加上@Mapper注解,比较麻烦,解决这个问题用@MapperScan
@MapperScan
作用:指定要变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类
逻辑删除@TableLogic
字段+注解@TableLogic +注入bean
1 自动填充: @TableField(fill = FieldFill.INSERT) 实体上添加注解+字段+实现元对象处理器接口
2 乐观锁:version字段+@version注解+注入bean
特别说明:
•支持的数据类型只有 int,Integer,long,Long,Date,Timestamp,LocalDateTime
•整数类型下 newVersion = oldVersion + 1
•newVersion 会回写到 entity 中
•仅支持 updateById(id) 与 update(entity, wrapper) 方法
•在 update(entity, wrapper) 方法下, wrapper 不能复用!!!
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
3 分页:注入bean
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
Page<User> page = new Page<>(1,5);
4 逻辑删除 :字段+注解@TableLogic +注入bean
@Bean
public ISqlInjector sqlInjector(){
return new LogicSqlInjector();
}
5 性能分析:注入插件bean+配置文件指定环境dev
/**
* SQL执行效率插件
*/
@Bean
@Profile({"dev","test"})// 设置 dev test 环境开启
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor interceptor = new PerformanceInterceptor();
interceptor.setMaxTime(500);// 500 毫秒
interceptor.setFormat(true);
return interceptor;
}
6 条件查询 entityWrapper及子类QueryWrapper
三、通用的CRUD:继承baseMapper
// insert方法在插入时, 会根据实体类的每个属性进行非空判断,只有非空的属性对应的字段才会出现到SQL语句中
//Integer result = employeeMapper.insert(employee);
//insertAllColumn方法在插入时, 不管属性是否非空, 属性所对应的字段都会出现到SQL语句中.
更新
Integer updateById(@Param("et") T entity);
Integer updateAllColumnById(@Param("et") T entity)
查询
1)T selectById(Serializable id);
2) T selectOne(@Param("ew") T entity);
3) List<T> selectBatchIds(List<? extends Serializable> idList);
4) List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);
5) List<T> selectPage(RowBounds rowBounds, @Param("ew") Wrapper<T> wrapper);
删除
1) Integer deleteById(Serializable id);
2) Integer deleteByMap(@Param("cm") Map<String, Object> columnMap);
3) Integer deleteBatchIds(List<? extends Serializable> idList);
四、条件构造器:EntityWrapper 和 Condition
1) Mybatis-Plus 通过 EntityWrapper(简称 EW,MP 封装的一个查询条件构造器)或者
Condition(与 EW 类似) 来让用户自由的构建查询条件,简单便捷,没有额外的负担,
能够有效提高开发效率
2) 实体包装器,主要用于处理 sql 拼接,排序,实体参数查询等
3) 注意: 使用的是数据库字段,不是 Java 属性!
MP: EntityWrapper Condition 条件构造器
new EntityWrapper<Employee>().eq("last_name", "0")
Condition.create() .eq("email", "sinosoft001@cpic.cn")
@Test
public void testPaginationInterceptor() {
Page page = new Page(2, 5);
List resultList = mapper.selectPage(page, Condition.create().eq("email", "sinosoft001@cpic.cn"));
System.out.println(resultList);
System.out.println(page.getRecords());
System.out.println("当前页"+page.getCurrent());
System.out.println("总页数"+page.getPages());
System.out.println("每页多少条"+page.getSize());
System.out.println("总共多少条"+page.getTotal());
System.out.println("是否有上一页"+page.hasPrevious());
//添加分页插件后com.baomidou.mybatisplus.plugins.PaginationInterceptor
// SELECT id,last_name AS lastName,gender,email,emp_status AS empStatus FROM tb_employee WHERE (email = ?) LIMIT 5,5 代表第二页
}
五、ActiveRecord(活动记录)
AR模式(ActiveRecord)简单的说就是直接用实体操作数据库。
仅仅需要让实体类继承 Model 类且实现主键指定方法,即可开启 AR 之旅.需要写mapper接口,不然会报错
@TableName("tbl_employee")
public class Employee extends Model<Employee>{
// .. fields
// .. getter and setter
@Override
protected Serializable pkVal() {
return this.id; }
AR基本的CRUD
1) 插入操作
public boolean insert()
2) 修改操作
public boolean updateById()
3) 查询操作
public T selectById()
public T selectById(Serializable id)
public List<T> selectAll()
public List<T> selectList(Wrapper wrapper)
public int selectCount(Wrapper wrapper)
4) 删除操作
public boolean deleteById()
public boolean deleteById(Serializable id)
public boolean delete(Wrapper wrapper)
5) 分页复杂操作
public Page<T> selectPage(Page<T> page, Wrapper<T> wrapper)
示例:
/**
* AR 查询
*/
@Test
public void testSelect () {
Employee employee = new Employee();
// employee.setId(1017);
// Employee employee1 = employee.selectById();
// System.out.println(employee1);
//
//
// Employee employee2 = employee.selectById(166);
// System.out.println(employee2);
// List<Employee> employees = employee.selectAll();
// System.out.println(employees);
List<Employee> email = employee.selectList(new EntityWrapper<Employee>().eq("email", "@"));
System.out.println(email);
int i = employee.selectCount(new EntityWrapper<Employee>().like("last_name", "a"));
System.out.println(i);
}
六、代码生成器
模板引擎
MP 的代码生成器默认使用的是 Apache 的 Velocity 模板,当然也可以更换为别的模板
技术,例如 freemarker。此处不做过多的介绍。
需要加入 Apache Velocity 的依赖
加入 slf4j ,查看日志输出信息
<!-- https://mvnrepository.com/artifact/org.apache.velocity/velocity-engine-core -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
<!--代码生成器
MP 的代码生成器默认使用的是 Apache 的 Velocity 模板,当然也可以更换为别的模板
技术,例如 freemarker。此处不做过多的介绍。
-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
编写执行代码生成的代码:
//1 全局配置
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setActiveRecord(true)
.setAuthor("kathrina")
.setOutputDir("G:\\ideaIU-2018.1.4.win\\IdeaProjects\\mybatisPlus\\src\\main\\java")
.setFileOverride(true)
.setIdType(IdType.AUTO)
.setServiceName("%sService") //设置生成的service接口的名字的首字母是否为I
.setBaseResultMap(true)
.setBaseColumnList(true);//生成sql片段
//2 数据库配置
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setDbType(DbType.MYSQL)
.setDriverName("com.mysql.cj.jdbc.Driver")
.setUrl("jdbc:mysql://192.168.163.131:3307/mybatis?allowMultiQueries=true")
.setUsername("root")
.setPassword("root");
//3 策略配置
StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig.setCapitalMode(true) //全局大写命名
.setDbColumnUnderline(true) // 指定表名 字段名是否使用下划线
.setNaming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略
.setTablePrefix("tb_")
.setInclude("tb_dept"); // 生成的表
//4 包名策略
PackageConfig pkConfig = new PackageConfig();
pkConfig.setParent("com.mybatisPlus")
.setMapper("mapper")
.setService("service")
.setController("controller")
.setEntity("entity")
.setXml("mapper");
//整合配置
AutoGenerator ag = new AutoGenerator();
ag.setGlobalConfig(globalConfig)
.setDataSource(dataSourceConfig)
.setStrategy(strategyConfig)
.setPackageInfo(pkConfig);
//6. 执行
ag.execute();
七、插件
插件机制: Mybatis 通过插件(Interceptor) 可以做到拦截四大对象相关方法的执行,根据需求,完
成相关数据的动态改变。
Executor
StatementHandler
ParameterHandler
ResultSetHandler
2) 插件原理
四大对象的每个对象在创建时,都会执行 interceptorChain.pluginAll(),会经过每个插
件对象的 plugin()方法,目的是为当前的四大对象创建代理。代理对象就可以拦截到四
大对象相关方法的执行,因为要执行四大对象的方法需要经过代理.
1 分页插件:com.baomidou.mybatisplus.plugins.PaginationInterceptor
2 执行分析插件:com.baomidou.mybatisplus.plugins.SqlExplainInterceptor
该插件的作用是分析 DELETE UPDATE 语句,防止小白或者恶意进行 DELETE UPDATE 全表操作
3性能分析插件:com.baomidou.mybatisplus.plugins.PerformanceInterceptor
1 性能分析拦截器,用于输出每条 SQL 语句及其执行时间
2 SQL 性能执行分析,开发环境使用,超过指定时间,停止运行。有助于发现问题
4 乐观锁插件:com.baomidou.mybatisplus.plugins.OptimisticLockerInterceptor
@Version 用于注解实体字段,必须要有
private ApplicationContext ioc
= new ClassPathXmlApplicationContext("applicationContext.xml");
private EmployeeMapper mapper = ioc.getBean("employeeMapper",EmployeeMapper.class);
private DeptMapper deptMapper = ioc.getBean("deptMapper",DeptMapper.class);
@Test
public void testPaginationInterceptor() {
Page page = new Page(2, 5);
List resultList = mapper.selectPage(page, Condition.create().eq("email", "sinosoft001@cpic.cn"));
System.out.println(resultList);
System.out.println(page.getRecords());
System.out.println("当前页"+page.getCurrent());
System.out.println("总页数"+page.getPages());
System.out.println("每页多少条"+page.getSize());
System.out.println("总共多少条"+page.getTotal());
System.out.println("是否有上一页"+page.hasPrevious());
//添加分页插件后com.baomidou.mybatisplus.plugins.PaginationInterceptor
// SELECT id,last_name AS lastName,gender,email,emp_status AS empStatus FROM tb_employee WHERE (email = ?) LIMIT 5,5 代表第二页
}
@Test
public void testSqlExplainInterceptor() {
mapper.delete(null); // 全表删除
}
@Test
public void testPerformanceInterceptor() {
// Time:1199 ms - ID:com.mybatisPlus.mapper.EmployeeMapper.selectList
// Execute SQL:
// SELECT
// id,
// last_name AS lastName,
// gender,
// email,
// emp_status AS empStatus
// FROM
// tb_employee]
List<Employee> employees = mapper.selectList(null);
System.out.println(employees);
}
@Test
public void testOptimisticLockerInterceptor() {
Dept dept = new Dept();
dept.setId(1);
dept.setDetpName("开发部");
dept.setVersion(1);
Integer integer = deptMapper.updateById(dept);
System.out.println(integer);
}
八、自定义全局操作
根据 MybatisPlus 的 AutoSqlInjector 可以自定义各种你想要的 sql ,注入到全局中,相当于自定义 Mybatisplus 自动注入的方法。
步骤:
1) 在 Mapper 接口中定义相关的 CRUD 方法
2) 扩展 AutoSqlInjector inject 方法,实现 Mapper 接口中方法要注入的 SQL
3) 在 MP 全局策略中,配置 自定义注入器
public interface DeptMapper extends BaseMapper<Dept> {
int deleteAll();
}
public class MySqlInjector extends AutoSqlInjector {
@Override
public void inject(Configuration configuration, MapperBuilderAssistant builderAssistant, Class<?> mapperClass, Class<?> modelClass, TableInfo table) {
// super.inject(configuration, builderAssistant, mapperClass, modelClass, table);
System.out.println("开始注册自定义sql");
//将EmployeeMapper中定义的deleteAll, 处理成对应的MappedStatement对象,加入到configuration对象中。
//注入的SQL语句
String sql = "delete from "+table.getTableName();
//注入的方法名 一定要与EmployeeMapper接口中的方法名一致
String method = "deleteAll";
//构造SqlSource对象
SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
//构造一个删除的MappedStatement
this.addDeleteMappedStatement(mapperClass, method, sqlSource);
}
}
全局配置文件中:
<!--定义自定义注册器-->
<bean id="mySqlInjector" class="com.mybatisPlus.injector.MySqlInjector"></bean>
globalConfiguration中全局策略中配置注册器sqlInjector
<!-- 定义MybatisPlus的全局策略配置-->
<bean id ="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
<!-- 在2.3版本以后,dbColumnUnderline 默认值就是true -->
<property name="dbColumnUnderline" value="true"></property>
<!-- mysql:全局的主键策略 -->
<!-- <property name="idType" value="0"></property>-->
<!--oracle:全局主键配置-->
<property name="idType" value="1"></property>
<!-- 全局的表前缀策略配置 -->
<property name="tablePrefix" value="tb_"></property>
<!--<property name="sqlInjector" ref="mySqlInjector"></property>-->
<property name="sqlInjector" ref="logicSqlInjector"></property>
<property name="logicDeleteValue" value="1"></property>
<property name="logicNotDeleteValue" value="0"></property>
<property name="metaObjectHandler" ref="myMetaObjectHandler"></property>
<property name="keyGenerator" ref="oracleKeyGenerator"></property>
</bean>
自定义注入器的应用之 逻辑删除:如果要用逻辑删除那之前的自定义注册起就需要注释掉,把这个逻辑删除的注入器注册进去
1) com.baomidou.mybatisplus.mapper.LogicSqlInjector
2) logicDeleteValue 逻辑删除全局值
3) logicNotDeleteValue 逻辑未删除全局值
4) 在 POJO 的逻辑删除字段 添加 @TableLogic 注解
5) 会在 mp 自带查询和更新方法的 sql 后面,追加『逻辑删除字段』=『LogicNotDeleteValue
默认值』 删除方法: deleteById()和其他 delete 方法, 底层 SQL 调用的是 update tbl_xxx
set 『逻辑删除字段』=『logicDeleteValue 默认值』
九、公共字段自动填充
com.baomidou.mybatisplus.mapper.MetaObjectHandler
insertFill(MetaObject metaObject)
updateFill(MetaObject metaObject)
metaobject: 元对象. 是 Mybatis 提供的一个用于更加方便,更加优雅的访问对象的属性,
给对象的属性设置值 的一个对象. 还会用于包装对象. 支持对 Object 、Map、Collection
等对象进行包装
本质上 metaObject 获取对象的属性值或者是给对象的属性设置值,最终是要
通过 Reflector 获取到属性的对应方法的 Invoker, 最终 invoke.
步骤:
1) 注解填充字段 @TableFile(fill = FieldFill.INSERT) 查看 FieldFill
2) 自定义公共字段填充处理器
3) MP 全局注入 自定义公共字段填充处理器
@TableField(fill = FieldFill.INSERT_UPDATE)
private String userName;
public class MyMetaObjectHandler extends MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
Object userName = getFieldValByName("userName", metaObject);
if(userName == null) {
System.out.println("MyMetaObjectHandler insertFill() 满足条件");
MetaObjectHandler metaObjectHandler = setFieldValByName("userName", "aaa", metaObject);
}
}
@Override
public void updateFill(MetaObject metaObject) {
Object userName = getFieldValByName("userName", metaObject);
if(userName == null) {
System.out.println("MyMetaObjectHandler updateFill() 满足条件");
MetaObjectHandler metaObjectHandler = setFieldValByName("userName", "bbb", metaObject);
}
}
}
配置文件中定义好自定义的填充处理器bean,然后加入到全局策略中
<!--公共字段填充处理器-->
<bean id="myMetaObjectHandler" class="com.mybatisPlus.metaObjectHandler.MyMetaObjectHandler"></bean>
<!-- 定义MybatisPlus的全局策略配置-->
<bean id ="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
<!-- 在2.3版本以后,dbColumnUnderline 默认值就是true -->
<property name="dbColumnUnderline" value="true"></property>
<!-- mysql:全局的主键策略 -->
<!-- <property name="idType" value="0"></property>-->
<!--oracle:全局主键配置-->
<property name="idType" value="1"></property>
<!-- 全局的表前缀策略配置 -->
<property name="tablePrefix" value="tb_"></property>
<!--<property name="sqlInjector" ref="mySqlInjector"></property>-->
<property name="sqlInjector" ref="logicSqlInjector"></property>
<property name="logicDeleteValue" value="1"></property>
<property name="logicNotDeleteValue" value="0"></property>
<property name="metaObjectHandler" ref="myMetaObjectHandler"></property>
<property name="keyGenerator" ref="oracleKeyGenerator"></property>
</bean>
十、Oracle 主键 Sequence
MySQL: 支持主键自增。 IdType.Auto
Oracle: 序列(Sequence)
1) 实体类配置主键 Sequence @KeySequence(value=”序列名”,clazz=xxx.class 主键属性类
型)
2) 全局 MP 主键生成策略为 IdType.INPUT
3) 全局 MP 中配置 Oracle 主键 Sequence
com.baomidou.mybatisplus.incrementer.OracleKeyGenerator
4) 可以将@keySequence 定义在父类中,可实现多个子类对应的多个表公用一个 Sequence
@KeySequence(value = "seq_user",clazz=Integer.class)
public class User extends Model<User> {
// @TableId(type=IdType.INPUT)
private Integer id;
@TableField(fill = FieldFill.INSERT_UPDATE)
private String userName;
@TableLogic
private String deleteFlag;
配置文件配置oracle主键生成策略,然后注册主键序列
<!--oracle全局 MP 中配置 Oracle 主键 Sequence-->
<bean class="com.baomidou.mybatisplus.incrementer.OracleKeyGenerator" id="oracleKeyGenerator"></bean>
<!-- 定义MybatisPlus的全局策略配置-->
<bean id ="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
<!-- 在2.3版本以后,dbColumnUnderline 默认值就是true -->
<property name="dbColumnUnderline" value="true"></property>
<!-- mysql:全局的主键策略 -->
<!-- <property name="idType" value="0"></property>-->
<!--oracle:全局主键配置-->
<property name="idType" value="1"></property>
<!-- 全局的表前缀策略配置 -->
<property name="tablePrefix" value="tb_"></property>
<!--<property name="sqlInjector" ref="mySqlInjector"></property>-->
<property name="sqlInjector" ref="logicSqlInjector"></property>
<property name="logicDeleteValue" value="1"></property>
<property name="logicNotDeleteValue" value="0"></property>
<property name="metaObjectHandler" ref="myMetaObjectHandler"></property>
<property name="keyGenerator" ref="oracleKeyGenerator"></property>
</bean>