网站建设 提供源码,产品ui设计公司,唐山企业网络推广培训,如何免费建立自己的网页前言 Mybatis Plus入门进阶#xff1a;特殊符号、动态条件、公共语句、关联查询、多租户插件 隐藏问题#xff1a;批量插入saveBatch 文章目录 前言注意点动态条件xml公共语句关联查询动态表名使用自定义函数主键生成策略saveBatch插件#xff1a;多租户TenantLineInnerInte…前言 Mybatis Plus入门进阶特殊符号、动态条件、公共语句、关联查询、多租户插件 隐藏问题批量插入saveBatch 文章目录 前言注意点动态条件xml公共语句关联查询动态表名使用自定义函数主键生成策略saveBatch插件多租户TenantLineInnerInterceptor 注意点 mapper.xml中大于、小于需要使用特殊符号 lt; 小于号
gt; 大于号
amp; 和
apos; 单引号
quot; 双引号
lt; 小于等于
gt; 大于等于如果需要拼接 br/ 字符串可以使用 CDATA 包裹起来让解析器将其视为文本而非标签 sql idexampleSql![CDATA[SELECT column1,column2,CONCAT(column3, br/, column4) AS combinedColumnFROM your_table]]
/sql动态条件 使用if对参数值进行判断非空才查询 if testroleName ! null and roleName ! AND r.role_name like concat(%, #{roleName}, %)
/if参考 多个条件判断 使用多个if if test /if
if test /if使用when/otherwise choosewhen teststatus 2create_time DESC/whenotherwisecreate_time/otherwise
/choosexml公共语句 定义 sql idxxxselect a from b
/sql使用 select id yyyinclude refIdxxx/includewhere name mango
/select关联查询 一对一 正常的查询sql定义返回的结果类型resultMap select idselectRoleAll resultMapSysRoleResultselect * from A left join B ...
/selectresultMap typeSysRole idSysRoleResultid propertyroleId columnrole_id /result propertyroleName columnrole_name /
/resultMap一对多 A表与B表关联查询其中A表与B表为一对多的关系则查询结果使用collection resultMap id xxx typecom.xxxxid columnid propertyid /collection propertyyyy ofTypezzzresult propertyno columnno//collection
/resultMap列名重复问题 使用别名 分页存在问题不建议分页时使用 使用select
相关参考文章 Mybatis Plus内置的分页查询 collection分页问题总结 collection查询一对多分页数据的Bug collection分页问题
动态表名
当我们想要传的参数是表格的名称或是列名的时候#{}这种方式就不生效了需要使用${}
使用自定义函数
在xml中使用了数据库自定义的函数则需要带上模式名或者在当前的模式下创建函数
自定义的函数达梦数据库默认是在sysdba下
主键生成策略
TableId注解定义了主键生成的类型具体查看枚举类IdType.java AUTO 数据库 ID自增这种情况下将表中主键设置为自增否则没有设置主动设置id值进行插入时会报错 NONE 无状态该类型为未设置主键类型注解里等于跟随全局全局里默认 ASSIGN_ID注意这里官网文档有误 INPUT insert 前自行 set 主键值在采用IKeyGenerator类型的ID生成器时必须为INPUT ASSIGN_ID 分配ID (主键类型为number或string默认实现为雪花算法 ASSIGN_UUID 分配 UUID
详细参考
saveBatch 特性及问题 拼接sql如果集合中的某个实体和它的上/下一个不一样就不会拼接到insert中而是会单独执行插入语句所以多个实体不一样某个字段为null会拼出多个插入语句 事务事务回滚如果在某一个拼接语句中存在一条数据报错那么整批会报错如果上一批语句已经执行过了则事务不会回滚已经成功的仍旧是成功 解决方案 使用其他的批量插入this.baseMapper.insertBatchSomeColumn(list); 存在问题数据库字段默认值不生效需要手动对对象设值或者对实体字段设值默认如果为雪花算法可使用IdWorker 自定义批量插入 设置插入字段策略 局部字段忽略控制TableField(fill FieldFill.INSERT,insertStrategy FieldStrategy.IGNORED) 全局 mybatis-plus:global-config:db-config:insert-strategy: ignored参考
插件多租户TenantLineInnerInterceptor
处理逻辑类BaseMultiTableInnerInterceptor
忽略某个方法需要重写TenantLineInnerInterceptor中的beforeQuery
相关文章参考
引入及使用租户
忽略多租户隔离自定义注解(未验证) 新增租户配置信息 # 租户配置信息
tenant:# 是否开启租户模式enable: true# 需要排除的多租户的表exclusionTable: sys_config,sys_dict_data# 租户字段名称column: tenant_id对应增加配置类TenantProperties Configuration
Getter
public class TenantProperties {/*** 是否开启租户模式*/Value(${tenant.enable})private Boolean enable;/*** 多租户字段名称*/Value(${tenant.column})private String column;/*** 需要排除的多租户的表*/Value(${tenant.exclusionTable})private ListString exclusionTable;
}注入重载的租户配置 Configuration
RequiredArgsConstructor(onConstructor_ Autowired)
AutoConfigureBefore(MyBatisPlusConfig.class)
public class TenantConfig {private final TenantProperties tenantProperties;Beanpublic TenantLineInnerInterceptor tenantLineInnerInterceptor() {return new TenantLineInnerInterceptor(new TenantLineHandler() {Overridepublic Expression getTenantId() {try {String tenantId SecurityUtils.getLoginUser().getTenantId();if (tenantId ! null) {return new StringValue(tenantId);}} catch (ServiceException e) {e.printStackTrace();}return new NullValue();}Overridepublic String getTenantIdColumn() {return tenantProperties.getColumn();}Overridepublic boolean ignoreTable(String tableName) {return tenantProperties.getExclusionTable().stream().anyMatch((t) - t.equalsIgnoreCase(tableName));}Overridepublic boolean ignoreInsert(ListColumn columns, String tenantIdColumn) {return TenantLineHandler.super.ignoreInsert(columns, tenantIdColumn);}});}
}Mybatis Plus配置增加租户配置 Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor new MybatisPlusInterceptor();// 多租户插件if (tenantProperties.getEnable()) {interceptor.addInnerInterceptor(tenantLineInnerInterceptor);}return interceptor;}