Mybatis动态查询
mybatis 中的动态查询
😎
多条件的查询
if
if 根据标签中test的属性所对应的表达式决定标签中的内容是否拼接到sql语句中
<select id="getUserByCondition" resultType="User">
select * from t_user where 'cwlz'='cwlz'
<if test="userName != null and userName != '' ">
and user_name = #{userName}
</if>
<if test="age != null and age != '' ">
and age = #{age}
</if>
</select>
上面的where后面的 1=1 是细节,因为当where后面的条件都为空时就成了 select * from t_user where
显然这种sql语句是有问题的,还有一种情况就是当userName为null时语句就成了 select * from t_user where and age=#{age}
这也是错的,所以在where后加一个恒成立的条件不仅不会影响查询结果,而且没有会在特定情况时sql语句是会报错的所以很有必要
where
where 当where标签中有内容时,会自动生成where关键字,并且将内容前多余的and 或者or去掉
当where中没有内容时,此时where标签没有任何效果 就是不会生成关键字注意:在写条件时不能在后面加and or 这个在下一条语句无效时mybatis不会帮你去掉!
trim
- prifix|suffix : 将trim标签中在内容前面或后面添加指定内容
- suffixOverrides|prefixOverrides: 将trim标签中内容前面或后面去掉指定内容
<select id="getUserByCondition" resultType="User">
select * from t_user
<trim prefix="where" suffix="" prefixOverrides="" suffixOverrides="and|or" >
<if test="userName != null and userName != '' ">
user_name = #{userName} and
</if>
<if test="age != null and age != '' ">
age = #{age} and
</if>
<if test="password != null and password !=''">
password = #{password}
</if>
</trim>
</select>
choose when otherwise
相当于 if else
- choose:用于包when otherwise
- when: 相当于if
- otherwise: else
<select id="getUserByCondition" resultType="User">
select * from t_user
<where>
<choose>
<when test="userName != null and userName != '' ">
user_name = #{userName}
</when>
<when test="age != null and age != '' ">
age = #{age}
</when>
<when test="password != null and password != '' ">
password = #{password}
</when>
<otherwise>
did = 1
</otherwise>
</choose>
</where>
</select>
foreach
一个案例 -->就是当我们需要批量删除一些东西时(参数以数组的形式传入)
<delete id="deletesByIds" >
delete from t_user where id in
(
<foreach collection="ids" item="id" separator=",">
#{id}
</foreach>
)
</delete>
- collection 是需要遍历的集合
- item 代表当前的
- separator 分隔
- open 以什么开始,在上面案例中的括号可以 open="(" 这样写
- close 以什么结束,在上面案例中的括号可以 open=")" 这样写
<delete id="deletesByIds" >
delete from t_user where id in
<foreach collection="ids" item="id" separator="or" open="(" close=")">
id = #{id}
</foreach>
</delete>
sql
sql 片段: 在我们的查询语句不能在实际开发中也一直写 *;因为我们要按需查找,不必将不需要的也查询出来,我们可以将我们平常查询次数较多的字段
放在sql片段内,可以在需要查询时直接进行引用!
<sql id="sqldept"> id,dept_name</sql>
<select id="getDeptAndById" resultMap="m2">
select <include refid="sqldept"></include> from t_dept where id = #{did}
</select>