• mybatis 乐观锁和逻辑删除


    本篇介绍easymybatis如配置乐观锁和逻辑删除。

    乐观锁

    easymybatis提供的乐观锁使用方式跟JPA一样,使用@Version注解来实现。即:数据库增加一个int或long类型字段version,然后实体类version字段上加上@Version注解即可。实现原理是根据mysql的行锁机制(InnoDB下),同一条记录只能被一条SQL执行,后面的SQL排队等待。这样version改变后,等待中的SQL还是老的version号,因此更新失败。

    @Version  
    private Long version;  
    • 注:更新不成功不会抛出异常,而是update返回值为0

    逻辑删除

    从1.7版本开始支持逻辑删除功能,即更新一个字段标记为已删除。查询的时候会自动过滤掉已删除的数据。

    假设数据库表中有一个字段is_deleted类型为tinyint,0表示未删除,1表示已删除。

    实体类对应代码如下:

    public class User {
        @LogicDelete
        private Byte isDeleted;
    }
    

    在执行dao.del(user);时会触发UPDATE语句,将is_deleted字段更新为1。

    如果is_deleted类型为char(1),f表示未删除,t表示已删除。

    @LogicDelete(notDeleteValue = "f", deleteValue = "t")
    private String isDeleted;

    @LogicDelete提供两个属性

    • notDeleteValue:指定未删除时的值,不指定默认为0
    • deleteValue:指定删除后保存的值,不指定默认为1

    假设1表示未删除,2表示已删除,@LogicDelete的设置方法如下:@LogicDelete(notDeleteValue = “1”, deleteValue = “2”)。如果每个实体类都要这样设置的话会很麻烦,easymybatis提供了全局配置

    • springboot下,application.properties添加
    # 未删除数据库保存的值,默认为0
    mybatis.logic-not-delete-value=1
    # 删除后数据库保存的值,默认为1
    mybatis.logic-delete-value=2
    • springmvc设置方式如下:
    <!-- 替换org.mybatis.spring.SqlSessionFactoryBean -->
        <bean id="sqlSessionFactory"
            class="net.oschina.durcframework.easymybatis.ext.SqlSessionFactoryBeanExt">
            <property name="dataSource" ref="dataSource" />
            <property name="configLocation">
                <value>classpath:mybatis/mybatisConfig.xml</value>
            </property>
            <property name="mapperLocations">
                <list>
                    <value>classpath:mybatis/mapper/*.xml</value>
                </list>
            </property>
    
            <!-- 以下是附加属性 -->
    
            <!-- dao所在的包名,跟MapperScannerConfigurer的basePackage一致 
                多个用;隔开
            -->
            <property name="basePackage" value="com.myapp.dao" />
            <property name="config">
                <bean class="net.oschina.durcframework.easymybatis.EasymybatisConfig">      
                    <property name="logicNotDeleteValue" value="1"/>
                                    <property name="logicDeleteValue" value="2"/>
                </bean>
            </property>
        </bean>
    • 注:如果同时设置了@LogicDelete参数和全局配置,会优先读取注解中的配置。
  • 相关阅读:
    剑指OFFER----面试题17- 打印从1到最大的n位数
    剑指OFFER----面试题16. 数值的整数次方
    剑指OFFER----面试题15. 二进制中1的个数
    剑指OFFER----面试题14- II. 剪绳子II
    07 多层if判断
    08 while循环
    06 if 流程控制
    03 身份运算符、逻辑运算符
    04 位运算符、运算符优先级
    02 赋值运算符、成员运算符
  • 原文地址:https://www.cnblogs.com/weiguoaa/p/9089625.html
Copyright © 2020-2023  润新知