mybatis and,or复合查询操作

要查询的sql:

select * from user where name = ? and (age=? or city=?);

方法1:不使用Example查询

直接在usermapper.xml中修改sql

方法2:使用Example查询

sql可转换成

select * from user where (name = ? and age=?) or (name=? and city=?);

然后使用Example查询

UserExample example=new UserExample();
example.or().orAgeLike("%"+searchParam+"%").andNameEqualTo(userName);
example.or().orCityLike("%"+searchParam+"%").andNameEqualTo(userName);

补充知识:MySQL/Mybatis多个AND和OR混用注意事项

mysql中AND的优先级高于OR,所以在查询时,会优先执行AND条件,除非使用()来将一个AND和OR括起来,这样才能使得OR得以按照语句的顺序执行。

如下图所示:

java测试代码

@Test
 public void TestMutil(){
  Species species = new Species();
  ArrayList<String> arrayList = new ArrayList<String>();
  arrayList.add("长喙蚤");
  arrayList.add("尤氏");
  List<Species> querySpeciesesListByMutilCondition = this.speciesMapper.querySpeciesesListByMutilCondition(arrayList, species.getEnglishName(), species.getHost(), species.getPosition(), species.getLocation(), species.getPhylum(), species.getClassName(), species.getOrder(), species.getFamily(), species.getJenus());

  for (Species s : querySpeciesesListByMutilCondition) {
   System.out.println(s);
  }
  System.out.println(querySpeciesesListByMutilCondition.size());

 }

Mapper文件中没有使用()放在语句中执行情况

<select id="querySpeciesesListByMutilCondition" resultType="Species">
 SELECT * FROM t_json_species
 <where>
 <if test="englisName != null and englisName != ''">AND englishName like CONCAT('%',#{englishName},'%') OR sameName like CONCAT('%',#{englishName},'%')</if>
 <if test="host != null and host != ''">AND host like CONCAT('%',#{host},'%')</if>
 <if test="position != null and position != ''">AND position like CONCAT('%',#{position},'%')</if>
 <if test="location != null and location != ''">AND location like CONCAT('%',#{location},'%')</if>
 <if test="phylumName != null and phylumName != ''">AND phylumName = #{phylumName}</if>
 <if test="className != null and className != ''">AND className = #{className}</if>
 <if test="orderName != null and orderName != ''">AND orderName = #{orderName}</if>
 <if test="familyName != null and familyName != ''">AND familyName = #{familyName}</if>
 <if test="jenusName != null and jenusName != ''">AND jenusName = #{jenusName}</if>
 <if test="nameList != null and nameList != ''">
 <foreach collection="nameList" item="name" >AND name like CONCAT('%',#{name},'%') OR sameName like CONCAT('%',#{name},'%')</foreach>
 </if>
 </where>

 </select>

Mapper文件中使用()放在语句中执行情况

<select id="querySpeciesesListByMutilCondition" resultType="Species">
 SELECT * FROM t_json_species
 <where>
 <if test="englisName != null and englisName != ''">AND englishName like CONCAT('%',#{englishName},'%') OR sameName like CONCAT('%',#{englishName},'%')</if>
 <if test="host != null and host != ''">AND host like CONCAT('%',#{host},'%')</if>
 <if test="position != null and position != ''">AND position like CONCAT('%',#{position},'%')</if>
 <if test="location != null and location != ''">AND location like CONCAT('%',#{location},'%')</if>
 <if test="phylumName != null and phylumName != ''">AND phylumName = #{phylumName}</if>
 <if test="className != null and className != ''">AND className = #{className}</if>
 <if test="orderName != null and orderName != ''">AND orderName = #{orderName}</if>
 <if test="familyName != null and familyName != ''">AND familyName = #{familyName}</if>
 <if test="jenusName != null and jenusName != ''">AND jenusName = #{jenusName}</if>
 <if test="nameList != null and nameList != ''">
 <foreach collection="nameList" item="name" >AND (name like CONCAT('%',#{name},'%') OR sameName like CONCAT('%',#{name},'%'))</foreach>
 </if>
 </where>

 </select>

补充:

如果这里使用多个%来解决上述的含有多个OR和AND情况,那么所实现功能会有问题,因为多个关键词有%来连接,会有一个次序问题。具体效果见下图

以上这篇mybatis and,or复合查询操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 结合mybatis-plus实现简单不需要写sql的多表查询

    项目地址: GITHUB (本地下载) java mybatis 多表查询 简介 实现简单的实体类操作多表,  首先你的项目是使用了mybatis-plus 才可以使用 设计说明 如何关联表? 找第一张表注解为 TableId (mybatis-plus 注解)的属性名, 到每二张表找同样的属性名, 如果没找到,反过来找,如果还没找到,挨个属性找.以此类推,实现关联的前提条件是 主从表的关联例名必须一样 // user 表 @TableId private Integer userId // a

  • 解决mysql 组合AND和OR带来的问题

    如下所示: SELECT prod_name,prod_price FROM products WHERE vend_id = 1002 OR vend_id= 1003 AND prod_price >= 10; 上面这条语句 返回的结果不是我们想要的. 分析: 原因在于计算的次序.SQL 在处理OR操作符前 优先处理AND操作符.当SQK看到上述WHERE子句时,由于AND在计算次序中优先级更高,操作符被错误的组合了. 此问题的解决方法是使用圆括号明确地分组相应的操作符. 请看下面的SELE

  • MyBatisPlus中使用or()和and()遇到的问题

    在项目中使用MyBatisPlus中的or()查询时由于误用,导致查询数据不对,仅作记录. 写法一: LambdaQueryWrapper<Task> queryWrapper = new QueryWrapper<Task>().lambda(); queryWrapper .eq(Task::getUserId, "15") .eq(Task::getStatus, 2) .or() .eq(Task::getFileSize, 3251544304L);

  • mybatis and,or复合查询操作

    要查询的sql: select * from user where name = ? and (age=? or city=?): 方法1:不使用Example查询 直接在usermapper.xml中修改sql 方法2:使用Example查询 sql可转换成 select * from user where (name = ? and age=?) or (name=? and city=?): 然后使用Example查询 UserExample example=new UserExample

  • Mybatis中的resultType和resultMap查询操作实例详解

    resultType和resultMap只能有一个成立,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,resultMap解决复杂查询是的映射问题.比如:列名和对象属性名不一致时可以使用resultMap来配置:还有查询的对象中包含其他的对象等. MyBatisConfig.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configura

  • mybatis实现查询操作及获得添加的ID

    接口 /** * 获得所有用户 * @return */ List<User> findAll(); /** * 根据id查询用户 * @param id * @return */ User findById(Integer id); /** *根据名字模糊查询 * @param username * @return */ List<User> findByName(String username); /** *查询总记录条数 * @param * @return */ int f

  • MySQL复合查询和内外连接的操作代码

    目录 一.复合查询 1.1 多表查询 1.2 自连接 1.3 子查询 1.3.1 单行子查询 1.3.2 多行子查询 1.3.3 多列子查询 1.3.4 在from子句中使用子查询 1.4 合并查询 1.4.1 union 1.4.2 union all 二.内外连接 2.1 内连接 2.2 外连接 2.2.1 左外连接 2.2.1 右外连接 一.复合查询 1.1 多表查询 实际开发中往往数据来自不同的表,所以需要多表查询,但是可以将多张表做笛卡尔积后的表当做是一张表,也就是单表查询.我们用一个

  • 数据库表的查询操作实践演练(实验三)

    继前两次的实验,本次实验以熟练掌握利用select语句进行各种查询操作:单表查询.多表连接及查询.嵌套查询.集合查询等,巩固数据库查询操作. 下面就跟着小编一起练习吧! 在实验一创建并插入数据的表(Student, Course,SC,Teacher,TC)的基础上,完成以下操作. (1)将教师'罗莉'的名字改为'罗莉莉'. 复制代码 代码如下: update Teacher set tname='罗莉莉' where tname='罗莉' (2)将两个同学(数据自己临时设置,用后即删除)的两门

  • Elasticsearch实现复合查询高亮结果功能

    一.Es的配置 实现es的全文检索功能的第一步,首先从与es进行连接开始,这里我使用的是es的5.x java api语法. public TransportClient esClient() throws UnknownHostException{ Settings settings = Settings.builder() .put("cluster.name", "my-application") //节点的名字 .put("client.trans

  • Spring Data JPA分页复合查询原理解析

    Spring Data JPA是Spring Data家族的一部分,可以轻松实现基于JPA的存储库. 此模块处理对基于JPA的数据访问层的增强支持. 它使构建使用数据访问技术的Spring驱动应用程序变得更加容易. 在相当长的一段时间内,实现应用程序的数据访问层一直很麻烦. 必须编写太多样板代码来执行简单查询以及执行分页和审计. Spring Data JPA旨在通过减少实际需要的工作量来显著改善数据访问层的实现. 作为开发人员,您编写repository接口,包括自定义查找器方法,Spring

  • MySQL入门(三) 数据库表的查询操作【重要】

    序言 1.MySQL表操作(创建表,查询表结构,更改表字段等), 2.MySQL的数据类型(CHAR.VARCHAR.BLOB,等), 本节比较重要,对数据表数据进行查询操作,其中可能大家不熟悉的就对于INNER JOIN(内连接).LEFT JOIN(左连接).RIGHT JOIN(右连接)等一些复杂查询. 通过本节的学习,可以让你知道这些基本的复杂查询是怎么实现的,但是建议还是需要多动手去敲,虽然理解了什么是内连接等,但是从理解到学会,是完全不一样的感觉. --WH 一.单表查询 1.1.查

  • Spring Boot环境下Mybatis Plus的快速应用操作

    一.简介 Mybatis-Plus(简称MP)是一个 Mybatis 的一个增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发.提高效率而生.其愿景是成为Mybatis最好的搭档,将开发效率翻倍,由于受到学习研究深入限制,本例只进行Mybatis Plus在Spring Boot环境下的基本应用(如Select.Insert.Update.Delete等基本操作,其中还包括动态生成组合查询与更新的动态SQL语句). 特性: 无侵入:Mybatis-Plus 在 Mybatis 的

  • Mybatis CURD及模糊查询功能的实现

    命名空间namespace: 配置文件中namespace中的名称为对应Mapper接口或者Dao接口的完整包名,必须一致! 1.查询(select) select: 接口中的方法名与映射文件中的SQL语句ID 一一对应 id parameterType resultType 案例:根据id查询用户 1.写接口(在UserMapper中添加对应的方法) public interface UserMapper { //根据ID查询用户 User getuserByID(int id); } 2.U

随机推荐