mybatis 樂觀鎖和邏輯刪除
阿新 • • 發佈:2018-05-25
全局 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 樂觀鎖和邏輯刪除