MyBatis框架:第九章:动态SQL语句
准备工作:
public class User {
private int id;
private String lastName;
private int sex;
14.1、if 语句
说明: if语句,可以动态的根据你的值来决定,是否需要动态的添加查询条件。
UserMapper类中的方法
public interface UserMapper {
public List<User> queryUsersByNameAndSex(User user);
}
UserMapper配置文件中的配置
<!--
if语句
-->
<select id="queryUsersByNameAndSex" parameterType="com.bean.User" resultType="com.bean.User">
select id,last_name lastName,sex from t_user where
<!-- 我们希望动态的创建这个条件语句 -->
<if test="lastName != null">
last_name like concat('%',#{ lastName },'%')
</if>
<if test="sex == 0 or sex == 1">
and sex = #{sex}
</if>
</select>
测试代码:
@Test
public void testQueryUsersByNameAndSex() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
List<User> users = userMapper.queryUsersByNameAndSex(new User(0, "dmi", 1));
System.out.println(users);
} finally {
session.close();
}
}
执行的结果:
14.2、where 语句
说明: where语句,可以帮我们在多个动态语句中,有效的去掉前面的多余的and 或 or 之类的多余关键字
UserMapper配置文件
<!--
where - if语句
-->
<select id="queryUsersByNameAndSex" parameterType="com.bean.User" resultType="com.atguigu.bean.User">
select id,last_name lastName,sex from t_user
<where>
<!-- 我们希望动态的创建这个条件语句 -->
<if test="lastName != null">
last_name like concat('%',#{ lastName },'%')
</if>
<if test="sex == 0 or sex == 1">
and sex = #{sex}
</if>
</where>
</select>
测试的代码是:
@Test
public void testQueryUsersByNameAndSex() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
List<User> users = userMapper.queryUsersByNameAndSex(new User(0, null, 1));
System.out.println(users);
} finally {
session.close();
}
}
测试的结果:
14.3、trim语句
说明: trim 可以动态在包含的语句前面和后面添加内容。也可以去掉前面或者后面给定的内容
prefix 前面添加内容
suffix 后面添加内容
suffixOverrides 去掉的后面内容
prefixOverrides 去掉的前面内容
UserMapper配置文件中的内容
<!--
trim - if 语句
-->
<select id="queryUsersByNameAndSex" parameterType="com.bean.User" resultType="com.bean.User">
select id,last_name lastName,sex from t_user
<!--
trim 可以动态在包含的语句前面和后面添加内容。也可以去掉前面或者后面给定的内容
prefix 前面添加内容
suffix 后面添加内容
suffixOverrides 去掉的后面内容
prefixOverrides 去掉的前面内容
-->
<trim prefix="where" suffixOverrides="and" prefixOverrides="">
<!-- 我们希望动态的创建这个条件语句 -->
<if test="lastName != null">
last_name like concat('%',#{ lastName },'%') and
</if>
<if test="sex == 0 or sex == 1">
sex = #{sex}
</if>
</trim>
</select>
测试代码:
@Test
public void testQueryUsersByNameAndSex() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
List<User> users = userMapper.queryUsersByNameAndSex(new User(0, "dmi", 5));
System.out.println(users);
} finally {
session.close();
}
}
测试的结果:
14.4、choose( when , otherwise )语句
说明:choose when otherwise 可以执行多路选择判断,但是只会有一个分支会被执行。
类似switch case 语句
UserMapper接口中添加的方法:
public List<User> queryUsersByNameAndSexForChoose(User user);
UserMapper配置文件的内容:
<!--
choose when otherwise 语句
有点类似于switch case 多路判断。只执行一路。
-->
<select id="queryUsersByNameAndSexForChoose" parameterType="com.bean.User"
resultType="com.bean.User">
select id,last_name lastName,sex from t_user
<where>
<choose>
<when test="id > 0">
id = #{ id }
</when>
<when test="lastName != null">
last_name = #{lastName}
</when>
<otherwise>
1 = 1
</otherwise>
</choose>
</where>
</select>
测试的代码:
@Test
public void testQueryUsersByNameAndSexForChoose() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
List<User> users = userMapper.queryUsersByNameAndSexForChoose(new User(1, "admin", 0));
System.out.println(users);
} finally {
session.close();
}
}
测试的结果:
14.4、set语句
说明: set语句可以去掉,更新时候,set更新的多个列,由于动态生成的sql语句,而导致多出来的逗号
UserMapper中添加的方法
public int updateUserForSet(User user);
UserMapper配置文件中的内容:
<!--
update语句
set标签,可以去掉,多个列中的逗号
-->
<update id="updateUserForSet" parameterType="com.bean.User">
update t_user
<set>
<if test="lastName != null">
last_name = #{lastName},
</if>
<if test="sex == 0 or sex == 1">
sex = #{sex}
</if>
</set>
where id = #{id}
</update>
测试代码:
@Test
public void testUpdateUserForSet() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
userMapper.updateUserForSet(new User(3, "xxxx", 10));
session.commit();
} finally {
session.close();
}
}
测试结果:
14.5、foreach语句
说明: foreach语句,可以遍历输出一个集合的数据
在UserMapper中添加的方法
public List<User> queryUserByidsForIn(@Param("ids")List<Integer> ids);
UserMapper配置文件中的内容
<!--
foreach语句可以遍历输出数据
collection属性设置遍历的集合
open 属性设置遍历输出前的内容
close 属性设置遍历输出后的内容
separator 属性设置每输出一个元素中间的间隔内容
item 属性 当前正在遍历到的数据名
-->
<select id="queryUserByidsForIn" resultType="com.bean.User">
select id,last_name,sex from t_user
where
id in
<foreach collection="ids" open="(" close=")" separator="," item="item_id">
#{item_id}
</foreach>
</select>
测试代码:
@Test
public void testQueryUserByidsForIn() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
List<Integer> ids = new ArrayList<>();
ids.add(3);
ids.add(6);
ids.add(7);
List<User> users = userMapper.queryUserByidsForIn( ids );
System.out.println(users);
} finally {
session.close();
}
}
测试结果: