Mybatis-Plus 插件學習


官方指南

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM