欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MybatisPlus学习之(五)逻辑删除/ 自动填充/ 性能分析/ 乐观锁

程序员文章站 2022-07-13 09:20:29
...

一.配置文件

1.逻辑删除的全局配置logicDeleteValue在dbconfig配置里面
2.分页,性能分析,乐观锁都在sqlSessionFactoryBean的plugins里面配置
3.逻辑删除,自动填充,自定义SQL注入在MP全局配置里面

    <!-- 配置 SqlSessionFactoryBean (Mybatis_PLUS)-->
    <bean id="sqlSessionFactoryBean" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
        <!-- 数据源 -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 别名处理 -->
        <property name="typeAliasesPackage" value="com.it.mp.bean"/>
        <!--加载配置-->
        <property name="configLocation" value="mybatis-config.xml"/>
        <!--全局MybatisPlus策略配置-->
        <property name="globalConfig" ref="globalConfig"/>

        <!-- 插件注册-拦截器 -->
        <property name="plugins">
            <list>
                <!-- 1.注册分页插件 -->
                <bean class="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor"></bean>

               
                <!-- 3.注册性能分析插件 -->
                <bean class="com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor">
                    <property name="format" value="true"></property>
                     <property name="maxTime" value="100"></property>
                </bean>

                <!-- 4.注册乐观锁插件 -->
                <bean class="com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor">
                </bean>

            </list>
        </property>
    </bean>

    <!--定义MP的全局策略配置-->
    <bean id="globalConfig" class="com.baomidou.mybatisplus.core.config.GlobalConfig">
        <!--全局配置注入-->
        <property name="dbConfig" ref="dbConfig"/>

        <!-- 1.定义自定义注入器 -->
        <property name="sqlInjector" ref="mySqlInjector"></property>

        <!-- 2.注入逻辑删除 -->
        <!--<property name="sqlInjector" ref="logicSqlInjector"></property>-->

        <!-- 3.字段填充-->
        <property name="metaObjectHandler" ref="myMetaObjectHandler"></property>

    </bean>
    <!--dbConfig是globalConfig的一个内置类-->
    <bean id="dbConfig" class="com.baomidou.mybatisplus.core.config.GlobalConfig.DbConfig">
        <!--配置主键策略(这里选择的是主键自增)-->
        <property name="idType" value="AUTO"/>
        <!--配置表名前缀-->
        <!--<property name="tablePrefix" value="tbl_"></property>-->

        <!-- 注入逻辑删除全局值 -->
        <property name="logicDeleteValue" value = "-1"></property>
        <property name="logicNotDeleteValue" value="1"></property>
    </bean>
    
    <!-- 公共字段填充 处理器 -->
    <bean id="myMetaObjectHandler" class="com.Alice.mp.metaObjectHandler.MyMetaObjectHandler"> </bean>

二.逻辑删除

1.在实体类中确定字段
MybatisPlus学习之(五)逻辑删除/ 自动填充/ 性能分析/ 乐观锁
2.dbConfig配置里面加入

        <!-- 注入逻辑删除全局值 -->
        <property name="logicDeleteValue" value = "-1"></property>
        <property name="logicNotDeleteValue" value="1"></property>

3.在applicationContexy.xml中注入插件

	<!--定义MP的全局策略配置-->
    <bean id="globalConfig" class="com.baomidou.mybatisplus.core.config.GlobalConfig">
        <!--全局配置注入-->
        <property name="dbConfig" ref="dbConfig"/>

        <!-- 1.定义自定义注入器 -->
        <property name="sqlInjector" ref="mySqlInjector"></property>

        <!-- 2.注入逻辑删除 -->
        <!--<property name="sqlInjector" ref="logicSqlInjector"></property>-->

        <!-- 3.字段填充-->
        <property name="metaObjectHandler" ref="myMetaObjectHandler"></property>
    </bean>
    
	<!-- 逻辑删除 -->
    <bean id="logicSqlInjector" class="com.baomidou.mybatisplus.extension.injector.LogicSqlInjector"></bean>

4.测试

    /**
     * 测试逻辑删除
     *
     */
    @Test
    public void testLogicDelete(){

        TblEmployee ee = new TblEmployee();
        ee.setId(31);
        tblEmployeeMapper.deleteById(ee);

    }

结果:

MybatisPlus学习之(五)逻辑删除/ 自动填充/ 性能分析/ 乐观锁

三.字段填充

1.在entity实体类中指定要填充的字段,例子是lastName字段填充,insert和update操作都需要填充
MybatisPlus学习之(五)逻辑删除/ 自动填充/ 性能分析/ 乐观锁
2.自定义填充内容设置

//自定义的填充内容
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {

		//当插入时,该字段为空的话,就填充
        Object fieldValue = getFieldValByName("lastName",metaObject);
        if(null == fieldValue) {
            System.out.println("*******插入操作 满足填充条件*********");
            setFieldValByName("lastName", "weiyunhui", metaObject);
        }
    }
    @Override
    public void updateFill(MetaObject metaObject) {
		//当修改时,该字段为空的话,就填充
        Object fieldValue = getFieldValByName("lastName",metaObject);
        if(null == fieldValue) {
            System.out.println("*******修改操作 满足填充条件*********");
            setFieldValByName("lastName", "xqw", metaObject);
        }
    }
}

3.测试

    /**
     * 测试字段填充
     */
    @Test
    public void testMetaObjectHandler(){
        TblEmployee ee = new TblEmployee();
        TblEmployee ee1 = new TblEmployee();
        //插入时字段填充
        ee.setAge(28);
        ee.setGender("0");
        ee.setEmail("aaa@qq.com");
        tblEmployeeMapper.insert(ee);

        //修改时字段填充
        ee1.setEmail("aaa@qq.com");
        ee1.setGender("1");
        Integer result = tblEmployeeMapper.update(ee1, null);

        System.out.println(ee + "; result =  "+ result);

    }

四.性能分析

参数:maxTime SQL 执行最大时长,超过自动停止运行,有助于发现问题。
参数:format SQL SQL是否格式化,默认false。

五.乐观锁

乐观锁实现方式:

取出记录时,获取当前version
更新时,带上这个version
执行更新时, set version = newVersion where version = oldVersion
如果version不对,就更新失败

1.在entity实体类中指定字段为锁控制字段
MybatisPlus学习之(五)逻辑删除/ 自动填充/ 性能分析/ 乐观锁
2.测试

    /**
     * 测试乐观锁
     * 版本低于数据库的版本的话就不能执行
     */
    @Test
    public void testLock(){
        TblEmployee ee = new TblEmployee();
        ee.setId(27);
        //必须要加上.setVersion(原来版本)之后才能更新version的数值
        ee.setVersion(1);
        ee.setEmail("@atguigu.com");
        tblEmployeeMapper.updateById(ee);
        System.out.println(ee);

    }

参考:https://blog.csdn.net/xiaozhegaa/article/details/85042299