日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

枚举类型用法_Mybatis-plus常见用法总结三

發(fā)布時(shí)間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 枚举类型用法_Mybatis-plus常见用法总结三 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前面已經(jīng)介紹了Mybatis-plus基本用法,今天為大家分享一些Mybatis-plus高級(jí)應(yīng)用

  • 邏輯刪除
  • 自動(dòng)注入
  • 枚舉類型處理
  • Sql注入器
  • 多租戶
  • 表結(jié)構(gòu)

    CREATE TABLE `sys_role` ( `id` varchar(64) NOT NULL COMMENT '主鍵', `code` varchar(64) NOT NULL DEFAULT '' COMMENT '角色編碼', `name` varchar(64) NOT NULL DEFAULT '' COMMENT '角色名', `type` char(2) NOT NULL COMMENT '角色類型,1:管理員,2:普通', `tenant_code` varchar(64) NOT NULL DEFAULT '' COMMENT '租戶編碼', `create_user` varchar(64) NOT NULL DEFAULT '' COMMENT '創(chuàng)建用戶', `create_time` datetime NOT NULL COMMENT '創(chuàng)建時(shí)間', `update_user` varchar(64) NOT NULL DEFAULT '' COMMENT '更新用戶', `update_time` datetime NOT NULL COMMENT '更新時(shí)間', `is_del` char(1) NOT NULL DEFAULT '0' COMMENT '是否刪除,0:未刪除,1:刪除', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色';

    邏輯刪除

    全局配置

    在配置文件中增加如下配置

    mybatis-plus: global-config: ? db-config: ? ? logic-delete-field: isDel#全局邏輯刪除字段值 3.3.0開(kāi)始支持,詳情看下面。 ? ? logic-delete-value: 1 # 邏輯已刪除值(默認(rèn)為 1) ? ? logic-not-delete-value: 0 # 邏輯未刪除值(默認(rèn)為 0)

    局部配置

    在實(shí)體類刪除字段上增加@TableLogic注解

    /** 是否刪除,0:未刪除,1:刪除 */@TableLogicprivate String isDel;

    全局配置和局部配置實(shí)現(xiàn)的結(jié)果是一樣的,下面針對(duì)局部配置做一下測(cè)試

    @Autowiredprivate RoleMapper roleMapper;@Testpublic void logicDel() { ? ?roleMapper.deleteById("1");}

    從結(jié)果可以看出角色id為1數(shù)據(jù)的is_del被設(shè)置為1

    使用Mybatis-plus自帶方法刪除、更新和查找都會(huì)where條件后面加上刪除字段

    以查詢?yōu)槔匆幌滦Ч?/p>@Test void loginDel2() { ? ?roleMapper.selectList(null);}

    從打印的sql中可以看出,在where后面添加了is_del='0'限定,所以要查詢所有數(shù)據(jù)可以采用自定義sql實(shí)現(xiàn)

    自動(dòng)填充

    在項(xiàng)目開(kāi)發(fā)中,表中經(jīng)常會(huì)定義一些公共的字段,例如:修改人,創(chuàng)建人。這時(shí)候我們可以采用 MyBatis-Plus 中

    的字段自動(dòng)填充功能去實(shí)現(xiàn)。

  • 在實(shí)體類屬性上增加@TableField(fill = FieldFill.INSERT_UPDATE)注解,如下所示
  • @Data@TableName("sys_role")public class Role { ? ?/** 創(chuàng)建人 */ ? ?@TableField(fill = FieldFill.INSERT) ? ?private String createUser; ? ?/** 創(chuàng)建時(shí)間 */ ? ?@TableField(fill = FieldFill.INSERT) ? ?private Date createTime; ? ?/** 更新人 */ ? ?@TableField(fill = FieldFill.INSERT_UPDATE) ? ?private String updateUser; ? ?/** 更新時(shí)間 */ ? ?@TableField(fill = FieldFill.INSERT_UPDATE) ? ?private Date updateTime; ? ?/** 是否刪除,0:未刪除,1:刪除 */ ? ?@TableLogic ? ?private String isDel;}

    TableField默認(rèn)有四個(gè)

    • DEFAULT:默認(rèn)不處理
    • INSERT:插入時(shí)填充字段
    • UPDATE:更新時(shí)填充字段
    • INSERT_UPDATE:插入和更新時(shí)填充字段
  • 定義處理器
  • @Componentpublic class MyMetaObjectHandler implements MetaObjectHandler {? ? public static String CREATEUSER_NAMEINBEAN = "createUser"; ? ?public static String CREATETIME_NAMEINBEAN = "createTime"; ? ?public static String UPDATEUSER_NAMEINBEAN = "updateUser"; ? ?public static String UPDATETIME_NAMEINBEAN = "updateTime"; ? ?@Override ? ?public void insertFill(MetaObject metaObject) { ? ? ? ?boolean createUser = metaObject.hasSetter(CREATEUSER_NAMEINBEAN); ? ? ? ?if (createUser) { ? ? ? ? ? ?this.strictInsertFill(metaObject, CREATEUSER_NAMEINBEAN, String.class, "admin"); ? ? ? } ? ? ? ?boolean createTime = metaObject.hasSetter(CREATETIME_NAMEINBEAN); ? ? ? ?if (createTime) { ? ? ? ? ? ?this.strictInsertFill(metaObject, CREATETIME_NAMEINBEAN, LocalDateTime.class, LocalDateTime.now()); ? ? ? } ? ? ? ?boolean updateUser = metaObject.hasSetter(UPDATEUSER_NAMEINBEAN); ? ? ? ?if (updateUser) { ? ? ? ? ? ?this.strictInsertFill(metaObject, UPDATEUSER_NAMEINBEAN, String.class, "admin"); ? ? ? } ? ? ? ?boolean updateTime = metaObject.hasSetter(UPDATETIME_NAMEINBEAN); ? ? ? ?if (updateTime) { ? ? ? ? ? ?this.strictInsertFill(metaObject, UPDATETIME_NAMEINBEAN, LocalDateTime.class, LocalDateTime.now()); ? ? ? } ? }? ? ?@Override ? ?public void updateFill(MetaObject metaObject) { ? ? ? ?boolean updateUser = metaObject.hasSetter(UPDATEUSER_NAMEINBEAN); ? ? ? ?if (updateUser) { ? ? ? ? ? ?this.strictInsertFill(metaObject, UPDATEUSER_NAMEINBEAN, String.class, "amdin"); ? ? ? } ? ? ? ?boolean updateTime = metaObject.hasSetter(UPDATETIME_NAMEINBEAN); ? ? ? ?if (updateTime) { ? ? ? ? ? ?this.strictInsertFill(metaObject, UPDATETIME_NAMEINBEAN, LocalDateTime.class, LocalDateTime.now()); ? ? ? } ? }}?
  • 測(cè)試
  • @Testvoid update() { // 更新id為2角色的名字為測(cè)試2 Role role = new Role(); role.setName("測(cè)試2"); role.setId("2"); roleMapper.updateById(role);}

    在執(zhí)行更新操作時(shí)自動(dòng)加上更新人和更新時(shí)間

    枚舉類型處理器

    自mybatis3.1.0開(kāi)始,如果你無(wú)需使用原生枚舉,可配置默認(rèn)枚舉來(lái)省略掃描通用枚舉配置 默認(rèn)枚舉配置

  • 定義枚舉類,主要有兩種方式
  • 方法一:采用繼承IEnum實(shí)現(xiàn)

    @Getter@AllArgsConstructorpublic enum RoleType implements IEnum { ADMIN("1"), COMMON("2"); private String type; @Override public Serializable getValue() { return type; }}

    方法二:注解方式,在枚舉類需要解析的屬性上增加@EnumValue注解

    @Getter@AllArgsConstructorpublic enum RoleType { ADMIN("1"), COMMON("2"); @EnumValue//標(biāo)記數(shù)據(jù)庫(kù)存的值是type private String type;}
  • 定義實(shí)體類
  • @Data@TableName("sys_role")public class Role { /** 角色類型 */ private RoleType type;}
  • 配置掃描的枚舉包路徑
  • mybatis-plus: typeEnumsPackage: com.yanyu.spring.mybatisplus.enums

    從結(jié)果可以看出查詢出的角色類型自動(dòng)轉(zhuǎn)換成了枚舉ADMIN

    Sql注入

    當(dāng)Mybatis-plus自帶的原生方法不能滿足我們的需求,我們可以利用sql注入器自定義sql

    實(shí)現(xiàn)步驟:

  • 創(chuàng)建自定義的類
  • public class DeleteByCodeMethod extends AbstractMethod { @Override public MappedStatement injectMappedStatement(Class> mapperClass, Class> modelClass, TableInfo tableInfo) { // 執(zhí)行的slq String sql = "delete from "+ tableInfo.getTableName() +" where code = #{code}"; // Mapper接口方法名 String method = "deleteByCode"; SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); return addDeleteMappedStatement(mapperClass, method, sqlSource); }}
  • 創(chuàng)建注入器
  • @Componentpublic class MySqlInject extends DefaultSqlInjector { @Override public List getMethodList(Class> mapperClass) { List methodList = super.getMethodList(mapperClass); methodList.add(new DeleteByCodeMethod()); return methodList; }}
  • 在Mapper中加入自定義方法
  • public interface RoleMapper extends BaseMapper { int deleteByCode(@Param("code") String code);}
  • 測(cè)試
  • @Testvoid deleteByCode() { // 刪除編碼為code的角色 roleMapper.deleteByCode("test");}

    從結(jié)果看,我們自定義的根據(jù)編碼刪除數(shù)據(jù)執(zhí)行成功

    Mybatis-plus官方為我們提供了三種自定義類

    • InsertBatchSomeColumn:批量新增數(shù)據(jù),自選字段insert
    • AlwaysUpdateSomeColumnById:根據(jù)id更新固定字段
    • LogicDeleteByIdWithFill:根據(jù)id邏輯刪除,并帶字段填充功能

    以InsertBatchSomeColumn為例,簡(jiǎn)單的演示一下怎么使用

  • 在注入器中加入InsertBatchSomeColumn自定義類
  • @Componentpublic class MySqlInject extends DefaultSqlInjector { @Override public List getMethodList(Class> mapperClass) { List methodList = super.getMethodList(mapperClass); methodList.add(new DeleteByCodeMethod()); /** * 不是邏輯刪除的字段包括在內(nèi) */ methodList.add(new InsertBatchSomeColumn(t -> !t.isLogicDelete())); return methodList; }}
  • 在Mapper中加入自定義方法
  • public interface RoleMapper extends BaseMapper { int insertBatchSomeColumn(List list);}
  • 測(cè)試
  • @Testvoid insertBatchSomeColumn() { // 測(cè)試批量插入角色1和角色2 Role role1 = new Role(); role1.setCode("ROLE_1"); role1.setName("角色1"); role1.setType(RoleType.ADMIN); Role role2 = new Role(); role2.setCode("ROLE_2"); role2.setName("角色2"); role2.setType(RoleType.ADMIN); List roles = new ArrayList<>(Arrays.asList(role1,role2)); roleMapper.insertBatchSomeColumn(roles);}

    多租戶

    租戶實(shí)現(xiàn)

    Mybatis-plus多租戶依賴于分頁(yè)插件,下面我們將簡(jiǎn)單介紹如何實(shí)現(xiàn)租戶解析

  • 定義租戶解析器
  • @Beanpublic PaginationInterceptor paginationInterceptor() throws IOException { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); TenantSqlParser tenantSqlParser = new TenantSqlParser(); tenantSqlParser.setTenantHandler(new TenantHandler() { @Override public Expression getTenantId(boolean select) { return new StringValue("00000"); } @Override public String getTenantIdColumn() { return "tenant_code"; } @Override public boolean doTableFilter(String tableName) { /** * 是否加租戶信息,false->加,true->不加 */ return false; } }); paginationInterceptor.setSqlParserList(Arrays.asList(tenantSqlParser)); return paginationInterceptor;}
  • 測(cè)試
  • @Testpublic void tenant() { // 查詢id為1的角色 roleMapper.selectById("1");}

    從結(jié)果看,sql執(zhí)行時(shí)在查詢條件中自動(dòng)為我們加上了租戶判斷

    特定sql過(guò)濾

    在開(kāi)發(fā)中有的方法不需要限定租戶標(biāo)識(shí),實(shí)現(xiàn)方式有兩種

  • 方式一:通過(guò)在分頁(yè)插件中自定義過(guò)濾器,具體實(shí)現(xiàn)如下所示
  • @Beanpublic PaginationInterceptor paginationInterceptor() throws IOException { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); TenantSqlParser tenantSqlParser = new TenantSqlParser(); tenantSqlParser.setTenantHandler(new TenantHandler() { @Override public Expression getTenantId(boolean select) { return new StringValue("00000"); } @Override public String getTenantIdColumn() { return "tenant_code"; } @Override public boolean doTableFilter(String tableName) { /** * 是否加租戶信息,false->加,true->不加 */ return false; } }); paginationInterceptor.setSqlParserList(Arrays.asList(tenantSqlParser)); paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() { /** * true 不增加,false 增加 * @param metaObject * @return */ @Override public boolean doFilter(MetaObject metaObject) { MappedStatement ms = SqlParserHelper.getMappedStatement(metaObject); if("具體方法".equals(ms.getId())) { return true; } return false; } }); return paginationInterceptor;}
  • 方式二:在不需要限定租戶的方法上加入
  • public interface RoleMapper extends BaseMapper { @SqlParser(filter = true) int getByCode(String code);}

    如果有哪里寫得不對(duì)的,還請(qǐng)各位小友指正,只有不斷試錯(cuò),才能慢慢提高。如果你覺(jué)得對(duì)你有幫助,請(qǐng)點(diǎn)贊+關(guān)注,謝謝!!!!!!

    總結(jié)

    以上是生活随笔為你收集整理的枚举类型用法_Mybatis-plus常见用法总结三的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。