mybatisPlus:简介及学习总结及应用

it2024-11-20  5

Table of Contents

一、全局配置文件:applicationContext.xml

二、常用注解:

三、通用的CRUD:继承baseMapper

四、条件构造器:EntityWrapper 和 Condition

五、ActiveRecord(活动记录)

六、代码生成器

七、插件

1 分页插件:com.baomidou.mybatisplus.plugins.PaginationInterceptor

2 执行分析插件:com.baomidou.mybatisplus.plugins.SqlExplainInterceptor

3性能分析插件:com.baomidou.mybatisplus.plugins.PerformanceInterceptor 

4 乐观锁插件:com.baomidou.mybatisplus.plugins.OptimisticLockerInterceptor 

 八、自定义全局操作

九、公共字段自动填充

十、Oracle 主键 Sequence


代码地址: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

只需要创建 EmployeeMapper 接口 , 并继承 BaseMapper 接口 . 这就是使用 MP 需要完成的所有操作,甚至不需要创建 SQL 映射文件。  

// 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)简单的说就是直接用实体操作数据库

 

Active Record( 活动记录 ) ,是一种领域模型模式,特点是一个模型类对应关系型数据库中的 一个表,而模型类的一个实例对应表中的一行记录。 ActiveRecord 一直广受动态语言( PHP Ruby 等)的喜爱,而 Java 作为准静态语言, 对于 ActiveRecord 往往只能感叹其优雅,所以 MP 也在 AR 道路上进行了一定的探索  

仅仅需要让实体类继承 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>

 

 

最新回复(0)