1 if标签
以根据条件查询用户为例,当我们在UserMapper.xml配置文件中写上sql语句
<select id="queryUserByCondition" parameterType="user" resultType="user">
select * from user where sex=#{sex} and username like '%${username}%'
</select>
测试代码上写上如下代码;
void testqueryUserByCondition() {
SqlSession sqlSession = MyBatisUtils.getSqlSessionFactory().openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setSex("1");
user.setUsername("张");
List<User> userList= mapper.queryUserByCondition(user);
for(User user2:userList)
System.out.println(user2);
sqlSession.close();
}
这样能够从数据库中查询到对应的记录,但是当我们将user.setSex("1")注释以后,就无法从数据库中查询到对应的数据,这时可以用MyBatis动态SQL中的if标签解决
将上述的UserMapper.xml改成如下所示
<!-- if标签用于条件判断 -->
<select id="queryUserByCondition" parameterType="user" resultType="user">
select * from user where 1=1
<if test="sex!=null and sex!=''">
and sex=#{sex}
</if>
<if test="username!=null and username!=''">
and username like '%${username}%'
</if>
</select>
再运行测试代码,发现没有问题了。
2 where标签
看上面的代码还有where 1=1 这样的语句,可以利用where标签进行改造,它的作用就是可以自动添加where,同时处理sql语句中第一个前and关键字(在下面的打括号的and可要可不要,where标签会处理)
<select id="queryUserByCondition2" parameterType="user" resultType="user">
select * from user
<where>
<if test="sex!=null and sex!=''">
(and) sex=#{sex}
</if>
<if test="username!=null and username!=''">
and username like '%${username}%'
</if>
</where>
</select>
3 sql片段
sql片段可将重复的sql提取出来,最终达到sql重用的目的。
<sql id="userQuery">
select * from user
</sql>
引用的时候使用include标签(<include refid="userQuery"/>)
<select id="queryUserByCondition3" parameterType="user" resultType="user">
<include refid="userQuery"/>
<where>
<if test="sex!=null and sex!=''">
and sex=#{sex}
</if>
<if test="username!=null and username!=''">
and username like '%${username}%'
</if>
</where>
</select>
4 forEach
当我们向sql传递数组或List,mybatis使用foreach解析
以右边的SQL语句为例: SELECT * FROM user WHERE id IN (24,31,39)
4.1 Mapper.xml
<select id="getUserByIds" parameterType="user" resultType="user">
<include refid="userQuery"/>
<where>
<!-- forEach标签 -->
<!-- collection:要遍历的集合 -->
<!-- open:循环开始之前输出的内容 -->
<!-- item:设置循环变量 -->
<!-- separator:分隔符 -->
<!-- close:循环结束之后输出的内容 -->
<foreach collection="ids" item="item" open="id in(" close=")" separator=",">
#{item}
</foreach>
</where>
</select>
4.2 User对象(有一个ids属性,与foreach标签的collection对应)
package com.itykd.domain;
import java.util.Date;
import java.util.List;
public class User {
private int id;
private int[] ids;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址
//省略get、set、toString方法
}
4.3 测试类
void testGetUserByIds() {
SqlSession sqlSession = MyBatisUtils.getSqlSessionFactory().openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
int[] array= new int[] {24,31,39};
user.setIds(array);
List<User> userList= mapper.getUserByIds(user);
for(User user2:userList)
System.out.println(user2);
sqlSession.close();
}
4347

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



