MyBatis多条件查询看这一篇就够了

MyBatis多条件查询看这一篇就够了,第1张

a:使用if+where实现多条件查询

首先场景需求,有 个年级和班级表,第一个要求是根据模糊查询姓名,和年龄大小进行条件查询,接口层方法

其次是映射文件的配置

测试

b:choose when 分类

这种方式和java中choose循环结构原理是一样的,判断多种情况,只要修改一下映射文件即可

接口 类

映射文件

结果

c:使用foreach完成复杂 查询,有三种方式,

第一种:传入的参数为数组类型

测试类

第二种:传入list集合

测试:

第三种:根据Map集合

打印结果可以执行以下。

d一对多的两种实现方式

接口方法

映射文件配置

两种方式都能实现,打印效果

方案一打印效果

==>Preparing: select * from grade,student where grade.gradeId = student.stuGrade and gradeId = ? ============一条sql

==>Parameters: 1(Integer)

<== Columns: gradeId, gradeName, stuId, stuName, stuAge, stuGrade

<== Row: 1, S1297, 2, zhangyu, 19, 1

<== Row: 1, S1297, 3, zy, 20, 1

<== Row: 1, S1297, 4, zy, 21, 1

<== Total: 3

zhangyu

zy

zy

Process finished with exit code 0

方案二打印效果

==>Preparing: select * from grade where gradeId=? ==========第一条sql

==>Parameters: 1(Integer)

<== Columns: gradeId, gradeName

<== Row: 1, S1297

====>Preparing: select * from student where stuGrade = ? ==========第二条sql

====>Parameters: 1(Long)

<==== Columns: stuId, stuName, stuAge, stuGrade

<==== Row: 2, zhangyu, 19, 1

<==== Row: 3, zy, 20, 1

<==== Row: 4, zy, 21, 1

<==== Total: 3

<== Total: 1

zhangyu

zy

zy

Process finished with exit code 0

先看不加判断的sql语句怎么写?

.

我们看到where和and。也就是说,当username和sex都有值的时候 使用where和and

那如果只有sex怎么办?或者只有username怎么办?这种情况下,上面语句就会出问题了。

所以,可以使用where标签和if标签。

小二,先上截图,给大爷们看看,然后咱们在讲解。

在Mapper-User.xml文件中:

.

接下来讲解where、if标签含义:

<where>:声明where标签开始

</where>:表示where标签结束

<if>:if标签开始

test:是判断的表达式。

注意,在表达式中并且是用字母and而非使用&符号

字符串判断双引号套单引号使用

</if>:if标签结束

.

where标签会自动判断前面是否有字段,如果有字段会使用and sex=${sex}这个语句。

如果没有字段,and会被忽略直接跟在where后面。

也就是说,如果username为空但是sex不为空的话。输入的sql又是什么?

username和sex都存在的测试类:

.

执行后控制台输入的sql语句为:

.

如果username为空只有sex有值,会报错吗?

请看测试类:

.

再看,执行后输出的sql语句:

[html] view plain copy

<sql id="query_user_where">

<!-- 如果 userQueryVo中传入查询条件,再进行sql拼接-->

<!-- test中userCustom.username表示从userQueryVo读取属性值-->

<if test="userCustom!=null">

<if test="userCustom.username!=null and userCustom.username!=''">

and username like '%${userCustom.username}%'

</if>

<if test="userCustom.sex!=null and userCustom.sex!=''">

and sex = #{userCustom.sex}

</if>

<!-- 根据id集合查询用户信息 -->

<!-- 最终拼接的效果:

SELECT id ,username ,birthday FROM USER WHERE username LIKE '%小明%' AND id IN (16,22,25)

collection:集合的属性

open:开始循环拼接的串

close:结束循环拼接的串

item:每次循环取到的对象

separator:每两次循环中间拼接的串

-->

<foreach collection="ids" open=" AND id IN ( " close=")" item="id" separator=",">

#{id}

</foreach>

<!--

SELECT id ,username ,birthday FROM USER WHERE username LIKE '%小明%' AND (id = 16 OR id = 22 OR id = 25)

<foreach collection="ids" open=" AND ( " close=")" item="id" separator="OR">

id = #{id}

</foreach>

-->

<!-- 还有很的查询条件 -->

</if>

</sql>

[html] view plain copy

</span><select id="findUserList" parameterType="userQueryVo" resultType="user">

select id,username,birthday from user

<!-- where标签相当 于where关键字,可以自动去除第一个and -->

<where>

<!-- 引用sql片段,如果sql片段和引用处不在同一个mapper必须前边加namespace -->

<include refid="query_user_where"></include>

<!-- 下边还有很其它的条件 -->

<!-- <include refid="其它的sql片段"></include>-->

</where>

</select>


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/bake/11960869.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存