在JDBC编程中,往往会去拼装sql语句,拼装的时候往往根据条件的不同,拼装成不同的sql语句。
MyBatis通过动态sql来实现这个过程,即动态生成sql,MyBatis是通过配置文件中的各种标记来实现的。
标记类型:
- if、choose标记
- where、set和trim标记
- foreach标记
if、choose标记:条件判断和多重条件判断
<!--if标记-->
<select id="selectReaderMoney" resultType="Reader" parameterType="Reader">
select * from reader
where 1=1
<if test="money!=null">
and money>#{money}
</if>
</select>
<!-- where 1=1 本来可以去掉,这里是因为可能会有多个if造成and写与不写的问题, 加个1=1 方便拼装sql 是一种习惯-->
<!-- choose 多重条件判断-->
<select id="selectUserChoose" resultType="User" parameterType="User">
select * from User where 1=1
<choose>
<when test="name!=null">
and name like #{name}
</when>
<when test="id!=0">
and id =#{id}
</when>
<otherwise>
and password is not null
</otherwise>
</choose>
</select>
where、set和trim标记:
1. where标记=智能条件 用于Select操作
在if和choose中,我们会了方便拼装sql使之不会出错,特地加了一个看似没有意义的where 1 = 1,来让后面语句都 + and。
在这里,MyBatis提供了where标记,能够智能通过判断条件来决定是否把前缀的and 去掉,即如果上一个条件没有或者不成立,下一个sql句段前面的and就是自动删除
<!--where-->
<select id="selectUserWhere" resultType="User" parameterType="User">
select * from User
<where>
<if test="name!=null">
and name like #{name}
</if>
<if test="id!=null">
and id =#{id}
</if>
</where>
</select>
2. set=智能赋值 用于Update操作
与where类似,这里的智能性体现在 对语句末 ,的处理
<!-- set-->
<update id="updateSet" parameterType="User">
update JiKeUser
<set>
<if test="name != null">name=#{name},</if>
<if test="password != null">password=#{password},</if>
</set>
where id=#{id}
</update>
3. trim = 装修,格式化
trim标记=格式化标记
可以与其它标记组合完成where与set标记功能,更加强大
| 标记 | 意义 |
|---|---|
| prefix | 前缀添加 |
| suffix | 后缀添加 |
| prefixOverrides | 自动判断前置 |
| suffixOverrides | 自动判断后置 |
代替set
在sql语句前置添加set,后置添加WHERE id = #{id},同时智能判断后置 , 是否添加或者去除
<update id="updateUserTrim" parameterType="User">
UPDATE User
<trim prefix="SET" suffixOverrides="," suffix="WHERE id = #{id}" >
<if test="name != null and name != '' ">
name = #{name},
</if>
<if test="password != null and password != '' ">
password=#{password},
</if>
</trim>
</update>
代替where
select * from user
<trim prefix="where" prefixOverrides="and|or">
<if test="userName!=null">
and userName like #{userName}
</if>
<if test="id!=null">
and id =#{id}
</if>
</trim>
foreach标记:
用于循环查询和循环赋值
循环查询:
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
| 属性 | 描述 |
|---|---|
| item | 每一次迭代结果 |
| collection | 循环集合或指定类型 |
| separator | 元素之间的分隔符,可选 |
| open | 开始符号,可选 |
| close | 关闭符号,可选 |
| index | list和数组的序号,可选 |
<!-- foreach 循环查询-->
<select id="selectUserForeach" resultType="User" parameterType="list">
select * from user
<where>
id in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</where>
</select>
//测试
ArrayList<Integer> ides=new ArrayList();
ides.add(2);
……
List<User> ap=session.selectList("selectUserForeach", ides);
<!-- foreach 循环赋值-->
<insert id="insertUserForeach">
insert into User (name, password) values
<foreach item="item" index="key" collection="list"
open="" separator="," close="">(#{item.name}, #{item.password})
</foreach>
</insert>
本文详细介绍了MyBatis框架中的动态SQL特性,包括if、choose、where、set和trim等标记的应用,以及如何使用foreach进行循环查询和赋值。
671

被折叠的 条评论
为什么被折叠?



