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

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
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值