Mybatis的or逻辑

Mybatis代码生成器生成的Example中的 Criteria可以用来组装sql语句。其中or逻辑的组装有点不好理解。

Criteria
Criteria包含一个Cretiron的集合,每一个Criteria对象内包含的Cretiron之间是由AND连接的,是逻辑与的关系。

oredCriteria
Example内有一个成员叫oredCriteria,是Criteria的集合,就想其名字所预示的一样,这个集合中的Criteria是由OR连接的,是逻辑或关系。oredCriteria就是ORed Criteria。

使用or逻辑的两个例子:
1.
TestTableExample example = new TestTableExample();
  example.or()
    .andField1EqualTo(5)
    .andField2IsNull();
  example.or()
    .andField3NotEqualTo(9)
    .andField4IsNotNull();
  List<Integer> field5Values = new ArrayList<Integer>();
  field5Values.add(8);
  field5Values.add(11);
  field5Values.add(14);
  field5Values.add(22);
  example.or()
    .andField5In(field5Values);
  example.or()
    .andField6Between(3, 7);

or()方法会产生一个新的Criteria对象,添加到oredCriteria中,并返回这个Criteria对象,从而可以链式表达,为其添加Criterion。产生的动态SQL是这样的:
where (field1 = 5 and field2 is null)
     or (field3 <> 9 and field4 is not null)
     or (field5 in (8, 11, 14, 22))
     or (field6 between 3 and 7)

===
2.
ViewPsmsgconsultExample example=new ViewPsmsgconsultExample(); 
ViewPsmsgconsultExample.Criteria criteria=example.createCriteria(); 
criteria.andToidEqualTo(mctid); 
criteria.andStatusEqualTo("0"); 
         
ViewPsmsgconsultExample.Criteria criteria2=example.createCriteria(); 
criteria2.andToidEqualTo(mctid); 
criteria2.andLaststatusEqualTo("0"); 
example.or(criteria2); 
psmsgconsultDao.countByExample(example); 

select count(*) from VIEW_PSMSGCONSULT WHERE ( TOID = ? and STATUS = ? ) or( TOID = ? and LASTSTATUS = ? )

这两种方式得到的结果一样的,写法上有些不同。要运行时查看生成的详细sql语句,使用下面log4j的配置


log4j.rootLogger=debug,...

...

###显示SQL语句部分
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG

log4j.logger.java.sql.PreparedStatement=DEBUG

 

http://ljhzzyx.blog.163.com/blog/static/38380312201412043525595/

<think>我们正在使用MyBatis-Plus,并且希望排除逻辑删除的字段或条件。在MyBatis-Plus中,逻辑删除通常是通过在实体类的字段上添加`@TableLogic`注解来实现的。当我们使用MyBatis-Plus提供的方法(如selectList、update等)时,框架会自动添加逻辑删除的条件(例如,只查询未删除的数据,更新时自动忽略已删除的数据等)。 但是,有时候我们可能需要排除逻辑删除的条件,例如: 1. 我们需要查询包括已删除数据在内的所有数据。 2. 我们需要更新已删除的数据。 根据MyBatis-Plus的文档和设计,我们可以通过以下几种方式来实现: ### 1. 使用条件构造器手动排除逻辑删除条件 当我们使用条件构造器(如`QueryWrapper`或`LambdaQueryWrapper`)时,可以手动覆盖逻辑删除的条件。例如,我们可以在条件构造器中使用`eq`或`ne`来明确指定逻辑删除字段的值,从而覆盖全局的逻辑删除条件。 示例代码: ```java // 假设我们的实体类中有一个逻辑删除字段,名为deleted,0表示未删除,1表示已删除 // 通常,MyBatis-Plus会自动添加条件:deleted=0 // 如果我们想查询包括已删除的数据,可以这样: List<Entity> list = entityMapper.selectList(new QueryWrapper<Entity>().eq("deleted", 0).or().eq("deleted", 1)); // 或者,我们也可以忽略deleted条件,直接查询所有(注意:这样不会添加任何关于deleted的条件,所以会查询所有状态的数据) List<Entity> list = entityMapper.selectList(new QueryWrapper<Entity>().isNull("deleted").or().isNotNull("deleted")); // 但更简单的方式是,我们直接不使用条件构造器关于逻辑删除的条件,但是MyBatis-Plus会自动添加,所以我们需要禁用自动添加。 然而,在MyBatis-Plus中,我们无法直接通过条件构造器来禁用逻辑删除的自动条件。因此,我们需要使用其他方法。 ### 2. 使用自定义SQL语句 另一种方法是使用自定义的SQL语句,在XML文件中编写SQL,这样就不会受到MyBatis-Plus逻辑删除拦截器的影响。 例如,在Mapper接口中定义方法: ```java @Select("select * from entity") List<Entity> selectAllIncludingDeleted(); ``` ### 3. 使用SqlParser注解(旧版方式,新版已弃用) 在MyBatis-Plus的旧版本中,可以使用`@SqlParser`注解来忽略逻辑删除等全局拦截器。但是在新版本中,`@SqlParser`已被弃用,替换为`@InterceptorIgnore`。 从MyBatis-Plus 3.4.0开始,可以使用`@InterceptorIgnore`注解来忽略特定的拦截器。 示例: ```java @InterceptorIgnore(tenantLine = "true", blockAttack = "true", illegalSql = "true", logicDelete = "true") public List<Entity> selectAllIncludingDeleted() { return entityMapper.selectList(null); } ``` 注意:`@InterceptorIgnore`需要在Mapper方法上使用,并且需要指定`logicDelete = "true"`来忽略逻辑删除拦截器。 但是,根据官方文档,`@InterceptorIgnore`目前支持的属性有: - tenantLine: 忽略租户拦截器 - blockAttack: 忽略攻击SQL拦截器 - illegalSql: 忽略非法SQL拦截器 - logicDelete: 是否忽略逻辑删除拦截器(3.4.0开始支持) 因此,我们可以这样写: ```java public interface EntityMapper extends BaseMapper<Entity> { @InterceptorIgnore(logicDelete = "true") List<Entity> selectAllIncludingDeleted(); } ``` 然后在service中调用这个方法,就可以忽略逻辑删除条件,查询所有数据(包括已删除的)。 ### 4. 全局配置(不推荐) 我们也可以临时修改全局配置,但是这样会影响整个应用,不推荐。 ### 总结 根据需求,如果我们只是偶尔需要排除逻辑删除条件,建议使用`@InterceptorIgnore`注解在Mapper方法上忽略逻辑删除拦截器。如果我们需要在条件构造器中灵活控制,可以尝试在条件构造器中手动覆盖逻辑删除条件(但要注意,MyBatis-Plus的自动条件可能会与我们手动的条件冲突,所以最好使用自定义SQL或`@InterceptorIgnore`)。 另外,对于更新操作,如果我们想要更新已经被逻辑删除的记录,同样可以使用`@InterceptorIgnore`注解来忽略逻辑删除拦截器,或者使用自定义SQL。 注意:忽略逻辑删除条件可能会带来数据安全的问题,请确保在业务中明确知道这样做的后果。 引用[1]中提到了`@TableField`注解,其中有一个属性`condition`用于预处理WHERE实体条件自定义运算规则,但这里我们关注的是逻辑删除的全局条件,所以不适用。 引用[2]是关于主键生成器的自定义,与逻辑删除无关。 引用[3]是MyBatis-Plus的官网,我们可以查阅更多关于逻辑删除和拦截器忽略的文档。 因此,针对问题“如何排除逻辑删除的字段或条件”,我们推荐使用`@InterceptorIgnore(logicDelete = "true")`注解。 §§相关问题§§ 1. 如何在MyBatis-Plus中配置逻辑删除? 2. `@InterceptorIgnore`注解还可以用来忽略哪些拦截器? 3. 在MyBatis-Plus中,除了逻辑删除,还有哪些常用的拦截器?</think>### MyBatis-Plus 排除逻辑删除字段或条件的方法 在 MyBatis-Plus 中排除逻辑删除字段或条件,可通过以下方式实现: #### 方法一:使用 `@InterceptorIgnore` 注解(推荐) 在 Mapper 方法上添加注解,直接忽略逻辑删除拦截器: ```java @InterceptorIgnore(logicDelete = "true") // 忽略逻辑删除条件 @Select("SELECT * FROM user") List<User> selectAllWithDeleted(); ``` 此方法会跳过自动添加的逻辑删除条件(如 `WHERE deleted=0`),查询包含已删除数据[^1]。 #### 方法二:自定义 SQL 语句 在 XML 或注解中编写完整 SQL,手动控制条件: ```xml <!-- XML 示例 --> <select id="selectRawList" resultType="User"> SELECT id, name, deleted FROM user WHERE name LIKE '%test%' <!-- 不自动添加逻辑删除条件 --> </select> ``` #### 方法三:条件构造器忽略字段 通过 `QueryWrapper` 的 `select()` 方法排除逻辑删除字段: ```java QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.select("id", "name") // 显式指定字段,排除逻辑删除字段 .like("name", "test"); List<User> list = userMapper.selectList(wrapper); ``` #### 方法四:实体注解配置 在实体类中,通过 `@TableField` 标记逻辑删除字段为非数据库字段: ```java public class User { @TableField(exist = false) // 声明此字段非数据库字段 private Integer deleted; } ``` 此时 MyBatis-Plus 会完全忽略该字段,不参与任何 SQL 生成[^1]。 --- ### 逻辑删除配置说明 1. **全局配置**(在 `application.yml` 中): ```yaml mybatis-plus: global-config: db-config: logic-delete-field: deleted # 逻辑删除字段名(默认 deleted) logic-not-delete-value: 0 # 未删除值 logic-delete-value: 1 # 已删除值 ``` 2. **局部配置**(实体类注解): ```java @TableLogic(value = "0", delval = "1") // 定义逻辑删除值 private Integer deleted; ``` > ⚠️ **注意事项** > - 方法一(`@InterceptorIgnore`)需 MyBatis-Plus 3.4+ 版本支持 > - 忽略逻辑删除后,请注意数据安全性,避免误操作已删除数据 > - 更新操作时需手动过滤逻辑删除字段,防止字段被更新 [^1]: MyBatis-Plus 官方字段注解配置 [^3]: MyBatis-Plus 核心功能文档
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值