mybatis

您所在的位置:网站首页 MyBatisPlus查询注解 mybatis

mybatis

2023-11-03 01:48| 来源: 网络整理| 查看: 265

本文介绍springboot整合mybatis-plus在项目中使用时,写查询方法的时候,使用lambda表示查询数据,在真正执行sql的时候where条件会拼接deleted = 0 。

原因:1、全局配置配置删除字段。默认删除值=1.未删除值=0。配置方式如下:

mybatis-plus.global-config.db-config.logic-delete-field = deleted

在使用全局配置的时候,如果实体类中有deleted字段,就会拼接deleted = 0.

2. 如果全局没有配置,在实体类中单独使用代码

@Data @Accessors(chain = true) @TableName("order") public class Order { @ApiModelProperty(value = "主键ID") @TableId(value = "id", type = IdType.AUTO) private Long id; @TableLogic(value = "0",delval = "1") @ApiModelProperty(value = "是否已删除, 1:是, 0:否") private Integer deleted; }

这也可以生效,如果,想灵活使用deleted = 0 ,自己决定是否在查询中拼接deleted = 0。那么就不能使用全局配置,自己在查询时,如果实体类中逻辑删除字段,就会拼接,没有就不会拼接,执行删除的时候,也需要自己设置deleted 的值。

源码分析:

代码1

public class TableInfoHelper { // 省略代码,下面这是私有方法,大家可以往上找,看各方法的功能 /** *

* 初始化 表主键,表字段 *

* * @param clazz 实体类 * @param globalConfig 全局配置 * @param tableInfo 数据库表反射信息 */ private static void initTableFields(Class clazz, GlobalConfig globalConfig, TableInfo tableInfo, List excludeProperty) { /* 数据库全局配置 */ GlobalConfig.DbConfig dbConfig = globalConfig.getDbConfig(); Reflector reflector = tableInfo.getReflector(); List list = getAllFields(clazz); // 标记是否读取到主键 boolean isReadPK = false; // 是否存在 @TableId 注解 boolean existTableId = isExistTableId(list); // 是否存在 @TableLogic 注解 boolean existTableLogic = isExistTableLogic(list); List fieldList = new ArrayList(list.size()); for (Field field : list) { if (excludeProperty.contains(field.getName())) { continue; } // 该字段是否是主键,默认FALSE,下面赋值 boolean isPK = false; boolean isOrderBy = field.getAnnotation(OrderBy.class) != null; /* 主键ID 初始化 */ if (existTableId) { TableId tableId = field.getAnnotation(TableId.class); if (tableId != null) { if (isReadPK) { throw ExceptionUtils.mpe("@TableId can't more than one in Class: \"%s\".", clazz.getName()); } // 有主键,设置主键生成方法,主键名字 initTableIdWithAnnotation(dbConfig, tableInfo, field, tableId); // 这只是主键为true isPK = isReadPK = true; } } else if (!isReadPK) { isPK = isReadPK = initTableIdWithoutAnnotation(dbConfig, tableInfo, field); } if (isPK) { if (isOrderBy) { tableInfo.getOrderByFields().add(new TableFieldInfo(dbConfig, tableInfo, field, reflector, existTableLogic, true)); } continue; } final TableField tableField = field.getAnnotation(TableField.class); /* 有 @TableField 注解的字段初始化 */ if (tableField != null) { // 注意看new TableFieldInfo()这个构造方法,执行的时候,会判断字段是否有@TableLogic注解,没有,看全局配置, // existTableLogic这个参数是整个实体类中是否有@TableLogic注解 fieldList.add(new TableFieldInfo(dbConfig, tableInfo, field, tableField, reflector, existTableLogic, isOrderBy)); continue; } /* 无 @TableField 注解的字段初始化 */ fieldList.add(new TableFieldInfo(dbConfig, tableInfo, field, reflector, existTableLogic, isOrderBy)); } /* 字段列表 */ tableInfo.setFieldList(fieldList); /* 未发现主键注解,提示警告信息 */ if (!isReadPK) { logger.warn(String.format("Can not find table primary key in Class: \"%s\".", clazz.getName())); } } }

看代码

new TableFieldInfo(dbConfig, tableInfo, field, reflector, existTableLogic, isOrderBy)

这个TableFieldInfo构造方法中,会调用this(...),在调用

this.initLogicDelete(dbConfig, field, existTableLogic);

代码2

private void initLogicDelete(GlobalConfig.DbConfig dbConfig, Field field, boolean existTableLogic) { /* 获取注解属性,逻辑处理字段 */ TableLogic tableLogic = field.getAnnotation(TableLogic.class); if (null != tableLogic) { if (StringUtils.isNotBlank(tableLogic.value())) { this.logicNotDeleteValue = tableLogic.value(); } else { this.logicNotDeleteValue = dbConfig.getLogicNotDeleteValue(); } if (StringUtils.isNotBlank(tableLogic.delval())) { this.logicDeleteValue = tableLogic.delval(); } else { this.logicDeleteValue = dbConfig.getLogicDeleteValue(); } this.logicDelete = true; } else if (!existTableLogic) { // 实体类中没有标记TableLogic注解,existTableLogic这个值=false,!existTableLogic=true,就会进入这个方法 String deleteField = dbConfig.getLogicDeleteField(); // 上边获取全局的删除字段名称 // 下面判断字段名称和全局定义的一样,就赋值 if (StringUtils.isNotBlank(deleteField) && this.property.equals(deleteField)) { this.logicNotDeleteValue = dbConfig.getLogicNotDeleteValue(); this.logicDeleteValue = dbConfig.getLogicDeleteValue(); this.logicDelete = true; } } }

在代码1方法中,tableInfo.setFieldList(fieldList);这行代码会调用tableInfo类的方法,

代码3

void setFieldList(List fieldList) { this.fieldList = fieldList; AtomicInteger logicDeleted = new AtomicInteger(); AtomicInteger version = new AtomicInteger(); fieldList.forEach(i -> { // 在上边代码2中删除字段的isLogicDelete会赋值true if (i.isLogicDelete()) { // 这里会设置withLogicDelete=true, this.withLogicDelete = true; // 设置删除字段 this.logicDeleteFieldInfo = i; logicDeleted.getAndAdd(1); } if (i.isWithInsertFill()) { this.withInsertFill = true; } if (i.isWithUpdateFill()) { this.withUpdateFill = true; } if (i.isOrderBy()) { if (null == this.orderByFields) { this.orderByFields = new LinkedList(); } this.orderByFields.add(i); } if (i.isVersion()) { this.withVersion = true; this.versionFieldInfo = i; version.getAndAdd(1); } }); /* 校验字段合法性 */ Assert.isTrue(logicDeleted.get()


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3