1. 程式人生 > >mybatis 樂觀鎖和邏輯刪除

mybatis 樂觀鎖和邏輯刪除

全局 conf lan 查詢 con upd print erl location

本篇介紹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參數和全局配置,會優先讀取註解中的配置。

mybatis 樂觀鎖和邏輯刪除