MyBatis的动态Sql语句
1、< if >
根据实体类的不同取值,使用不同的SQL够来进行查询。
- 持久层Dao接口
/*
* 根据用户信息,查询用户表
* @param userName
* @return
* */
List<User>findByUser(User user);
- 持久层Dao映射配置
<!--配置根据用户信息查询-->
<select id="findByUser" parameterType="com.oceanstar.domain.User" resultType="com.oceanstar.domain.User">
select * from user where 1 = 1
<if test="username != null and username != ''">
and username like #{username}
</if>
<if test="sex != null">
and sex = #{sex}
</if>;
</select>
- 测试
@Test
public void testFindByUser(){
User u = new User();
u.setUsername("%王%");
u.setSex("女");
List<User> users = iUserDao.findByUser(u);
for (User user : users){
System.out.println(user);
}
}
2、< where >
为了简化上面where 1=1的条件拼装,我们可以使用< where >
- 持久层Dao映射配置
<!--配置根据用户信息查询-->
<select id="findByUser" parameterType="com.oceanstar.domain.User" resultType="com.oceanstar.domain.User">
select * from user
<where>
<if test="username != null and username != ''">
and username like #{username}
</if>
<if test="sex != null">
and sex = #{sex}
</if>
</where>
</select>
3、< foreach >
传入多个id查询用户信息,可以这样写
SELECT * FROM `user` where id = 42 or id = 43;
select * from `user` where id in (42, 43);
即:在进行范围查询时,就要将一个集合中的值,作为参数动态添加尽量
问:如何进行参数的传递?
- 在QueryVo中加入一个List集合用于封装参数
/*
* 查询条件对象
* */
public class QueryVo implements Serializable {
private List<Integer> ids;
public List<Integer> getIds() {
return ids;
}
public void setIds(List<Integer> ids) {
this.ids = ids;
}
}
- 持久层Dao接口
/*
* 根据id集合,查询用户表
* @param userName
* @return
* */
List<User>findInIds(QueryVo vo);
- 持久层Dao映射配置
<select id="findInIds" parameterType="com.oceanstar.domain.QueryVo" resultType="com.oceanstar.domain.User">
select * from user
<where>
<if test="ids != null and ids.size() > 0">
<!--colletions表示要遍历的集合元素,open表示语句的开始部分,close表示结束部分-->
<foreach collection="ids" open="id in ( " close=")" item="uid" separator=",">
#{uid}
</foreach>
</if>
</where>
</select>
- 测试
public void testFindInIds(){
QueryVo vo = new QueryVo();
List<Integer> ids = new ArrayList<Integer>();
ids.add(41);
ids.add(42);
ids.add(43);
vo.setIds(ids);
List<User> users = iUserDao.findInIds(vo);
for (User user : users){
System.out.println(user);
}
}
4、Sql重用
Sql中可以将重复的Sql提取出来,使用时用include引用即可,最终到达Sql宠用的目目的
- 定义代码片段
<sql id="defaultSql">
select * from user
</sql>
- 引用代码片段
<!--配置根据id查询-->
<select id="findById" parameterType="java.lang.Integer" resultType="com.oceanstar.domain.User">
<include refid="defaultSql"></include>
where id = #{aaaa}
</select>