mapper中mysql复合语句_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得以按照语句的顺序执行。

如下图所示:

e7c0804a5b94387afdcd34154da28a4b.png

java测试代码

557cc8159c319c8da190d40d3769f75e.png

@test

public void testmutil(){

species species = new species();

arraylist arraylist = new arraylist();

arraylist.add("长喙蚤");

arraylist.add("尤氏");

list 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文件中没有使用()放在语句中执行情况

12c0cebcff2ca0832416625b701a1fad.png

select * from t_json_species

and englishname like concat('%',#{englishname},'%') or samename like concat('%',#{englishname},'%')

and host like concat('%',#{host},'%')

and position like concat('%',#{position},'%')

and location like concat('%',#{location},'%')

and phylumname = #{phylumname}

and classname = #{classname}

and ordername = #{ordername}

and familyname = #{familyname}

and jenusname = #{jenusname}

and name like concat('%',#{name},'%') or samename like concat('%',#{name},'%')

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

013a2b5cb13890e4463c172e2f163fd6.png

select * from t_json_species

and englishname like concat('%',#{englishname},'%') or samename like concat('%',#{englishname},'%')

and host like concat('%',#{host},'%')

and position like concat('%',#{position},'%')

and location like concat('%',#{location},'%')

and phylumname = #{phylumname}

and classname = #{classname}

and ordername = #{ordername}

and familyname = #{familyname}

and jenusname = #{jenusname}

and (name like concat('%',#{name},'%') or samename like concat('%',#{name},'%'))

补充:

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

f8f072a6399f11903f8a847b0e47aaba.png

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

希望与广大网友互动??

点此进行留言吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用MyBatis的递归查询实现树形结构的查询。具体步骤如下: 1. 定义实体类 定义一个实体类,表示树的节点,包含节点id、父节点id、节点名称等属性。 2. 定义Mapper接口 定义一个Mapper接口,包含一个方法,用于查询树形结构的节点。方法的返回值为List集合,表示查询到的树形结构的节点。 3. 编写Mapper.xml配置文件 在Mapper.xml配置文件,编写递归查询语句,通过查询语句实现树形结构的查询。具体实现方式如下: - 定义一个select语句,用于查询指定节点的所有子节点。 - 在select语句,使用union all关键字连接多个子查询语句,实现递归查询。 - 在子查询语句,使用with recursive关键字定义递归查询语句。 4. 调用Mapper接口 在Java代码,调用Mapper接口的方法,获取查询到的树形结构的节点。可以通过递归遍历节点,实现树形结构的展示。 下面是一个示例代码,供参考: ``` // 定义实体类 public class TreeNode { private Integer id; private Integer parentId; private String name; // getter和setter方法 } // 定义Mapper接口 public interface TreeNodeMapper { List<TreeNode> selectTreeNodes(Integer parentId); } // 编写Mapper.xml配置文件 <select id="selectTreeNodes" parameterType="java.lang.Integer" resultType="TreeNode"> with recursive cte(id, parent_id, name) as ( select id, parent_id, name from tree_node where parent_id = #{parentId} union all select tn.id, tn.parent_id, tn.name from tree_node tn inner join cte on tn.parent_id = cte.id ) select * from cte; </select> // 调用Mapper接口 @Autowired private TreeNodeMapper treeNodeMapper; public List<TreeNode> getTreeNodes(Integer parentId) { return treeNodeMapper.selectTreeNodes(parentId); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值