解决mybastis-plus加入逻辑删除SQL语句自动拼接未删除的问题

发布于:2024-07-05 ⋅ 阅读:(17) ⋅ 点赞:(0)

配置逻辑删除

bootstrap.yaml中加入逻辑删除配置

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: isDeleted  # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
      logic-delete-value: true # 逻辑已删除值(默认为 1)
      logic-not-delete-value: false # 逻辑未删除值(默认为 0)

以及在对应的实体类继承public class Entity extends MyBatisPlusBaseModel<Entity>后就实现了逻辑删除,这时候使用mybatis-plus进行CRUD会自动带上isDelete = false。如果这时候我就是要查那些被删除的记录,虽然这种情况比较少见,不过有些时候可能确实有这种需求。

使用 Wrapper 自定义 SQL

通过尝试发现使用使用 Wrapper 自定义 SQL不会带上isDelete = false

  • 版本要求:确保你的项目中使用的 mybatis-plus 版本至少为 3.0.7,以支持自定义 SQL 功能。
  • 参数命名:在自定义 SQL 时,传递 Wrapper 对象作为参数时,参数名必须为 ew,或者使用注解 @Param(Constants.WRAPPER) 明确指定参数为 Wrapper 对象。
  • 使用 ${ew.customSqlSegment}:在 SQL 语句中,使用 ${ew.customSqlSegment} 来引用 Wrapper 对象生成的 SQL 片段。
  • 不支持基于 entity 的 where 语句:自定义 SQL 时,Wrapper 对象不会基于实体类自动生成 where 子句,你需要手动编写完整的 SQL 语句。

wrapper只能进行条件查询,也就是说不能筛选select的字段,默认是select * from table

example

在Entity的Mapper中加入自定义的SQL

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.annotations.Param;

public interface UserMapper extends BaseMapper<User> {
    @Select("SELECT * FROM user ${ew.customSqlSegment}")
    List<User> selectByCustomSql(@Param(Constants.WRAPPER) Wrapper<User> wrapper);
}

特别注意的是如果Entity中有有json转化的话得加@result

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.annotations.Param;

public interface UserMapper extends BaseMapper<User> {
    @Select("SELECT * FROM user ${ew.customSqlSegment}")
    @Results({
            @Result(column = "extra_info", property = "extraInfo", typeHandler = FastjsonTypeHandler.class)
    })
    List<User> selectByCustomSql(@Param(Constants.WRAPPER) Wrapper<User> wrapper);
}

使用方法

@Resource
private UserMapper userMapper;


QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三");

List<User> userList = userMapper.selectByCustomSql(queryWrapper);

使用 Wrapper 自定义 SQL