1.邏輯刪除
在相應字段上添加注解
@TableLogic private Integer deleted;
說明:
使用mp自帶方法刪除和查找都會附帶邏輯刪除功能 (自己寫的xml不會)
example 刪除時 update user set deleted=1 where id =1 and deleted=0 查找時 select * from user where deleted=0
2.通用枚舉類
比如一些狀態屬性
① 聲明枚舉
定義枚舉
public enum AgeEnum implements IEnum<Integer> {
ONE(1, "一歲"),
TWO(2, "二歲"),
THREE(3, "三歲");
private int value;
private String desc;
@Override
public Integer getValue() {
return this.value;
}
}
使用枚舉
public class User{
/**
* 名字
* 數據庫字段: name varchar(20)
*/
private String name;
/**
* 年齡,IEnum接口的枚舉處理
* 數據庫字段:age INT(3)
*/
private AgeEnum age;
/**
* 年級,原生枚舉(帶{@link com.baomidou.mybatisplus.annotation.EnumValue}):
* 數據庫字段:grade INT(2)
*/
private GradeEnum grade;
}
②配置掃描枚舉
mybatis-plus:
# 支持統配符 * 或者 ; 分割
typeEnumsPackage: com.baomidou.springboot.entity.enums
....
3.自動填充功能
自動填充,意味着就是設置默認值,不依賴數據庫設置默認值,依賴程序實現。
定義填充方法
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(MyMetaObjectHandler.class);
@Override
public void insertFill(MetaObject metaObject) {
LOGGER.info("start insert fill ....");
this.setFieldValByName("createTime", new Date(),metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
this.setFieldValByName("deleteFlag", 0, metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
LOGGER.info("start update fill ....");
this.setFieldValByName("updateTime", new Date(),metaObject);
}
}
使用填充
public class User {
/**
* 創建時間
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 修改時間
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
/**
* 邏輯刪除
*/
@TableField(fill = FieldFill.INSERT)
@TableLogic
private Integer deleteFlag;
....
}
fill 屬性 可選值
public enum FieldFill {
/**
* 默認不處理
*/
DEFAULT,
/**
* 插入填充字段
*/
INSERT,
/**
* 更新填充字段
*/
UPDATE,
/**
* 插入和更新填充字段
*/
INSERT_UPDATE
}
4.sql 注入(攔截)功能
對 sql 進行改寫,參考
DefaultSqlInjector
5.分頁插件
//Spring boot方式
@EnableTransactionManagement
@Configuration
@MapperScan("com.baomidou.cloud.service.*.mapper*")
public class MybatisPlusConfig {
/**
* 分頁插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
使用
①調用 service 層的page 方法
/**
* 列表
*/
@GetMapping("/list")
@ApiOperation(value = "分頁", notes = "傳入tenant", position = 4)
public R<IPage<BusinessCard>> pageList(BusinessCard businessCard, Page<BusinessCard> page) {
IPage<BusinessCard> pages = businessCardService.page(page, Wrappers.query(businessCard));
return R.data(pages);
}
②手動編寫 xml
定義 xml
<select id="selectPageVo" resultType="com.baomidou.cloud.entity.UserVo">
SELECT id,name FROM user WHERE state=#{state}
</select>
定義mapper(需要傳入 page參數,與查詢參數)
public interface UserMapper{//可以繼承或者不繼承BaseMapper
/**
* <p>
* 查詢 : 根據state狀態查詢用戶列表,分頁顯示
* 注意!!: 如果入參是有多個,需要加注解指定參數名才能在xml中取值
* </p>
*
* @param page 分頁對象,xml中可以從里面進行取值,傳遞參數 Page 即自動分頁,必須放在第一位(你可以繼承Page實現自己的分頁對象)
* @param state 狀態
* @return 分頁對象
*/
IPage<User> selectPageVo(IPage<User> page, @Param("state") Integer state);
}
定義 service
public IPage<User> selectUserPage(Page<User> page, Integer state) {
// 不進行 count sql 優化,解決 MP 無法自動優化 SQL 問題,這時候你需要自己查詢 count 部分
// page.setOptimizeCountSql(false);
// 當 total 為非 0 時(默認為 0),分頁插件不會進行 count 查詢
// 要點!! 分頁返回的對象與傳入的對象是同一個
return userMapper.selectPageVo(page, state);
}
6.自定義 sql 使用 Wrapper
定義 xml
<select id="getAll" resultType="MysqlData">
SELECT * FROM mysql_data ${ew.customSqlSegment}
</select>
定義 mapper
List<MysqlData> getAll(@Param(Constants.WRAPPER) Wrapper wrapper);
service 調用
mysqlMapper.getAll(Wrappers.<MysqlData>lambdaQuery().eq(MysqlData::getGroup, 1));
7.更新/保存時根據條件判斷數據庫唯一性
@Service
public class BusinessCardServiceImpl extends BaseServiceImpl<BusinessCardMapper, BusinessCard>
implements IBusinessCardService {
@Override
public boolean submit(BusinessCard businessCard) {
LambdaQueryWrapper<BusinessCard> lqw = Wrappers.<BusinessCard>lambdaQuery().eq(BusinessCard::getTruename, businessCard.getTruename());
Integer cnt = baseMapper.selectCount(businessCard.getId() == null
? lqw : lqw.notIn(BusinessCard::getId, businessCard.getId()));
if (cnt > 0) {
throw new ApiException("當前名片已存在!");
}
return saveOrUpdate(businessCard);
}
}
8.批處理
try (SqlSession batchSqlSession = sqlSessionBatch()) {
int i = 0;
for (AppFlowStatistics entity : entityList) {
// 獲取該對象的更新id,有則更新,否則則插入
Integer updateId = hasUpdateId(entity);
if (ObjectUtil.isEmpty(updateId)) {
batchSqlSession.insert(sqlStatement(SqlMethod.INSERT_ONE), entity);
} else {
entity.setId(updateId);
MapperMethod.ParamMap<AppFlowStatistics> param = new MapperMethod.ParamMap<>();
param.put(Constants.ENTITY, entity);
batchSqlSession.update(sqlStatement(SqlMethod.UPDATE_BY_ID), param);
}
if (i >= 1 && i % batchSize == 0) {
batchSqlSession.flushStatements();
}
i++;
}
batchSqlSession.flushStatements();
}
233
