1.mybatis核心:对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。
2.问题来源
<select id="findUserList" parameterType="UserQueryVo" resultType="UserCustom">
select * from user where sex= #{userCustom.sex} and username like ‘%${userCustom.username}%‘
</select>
上述的查询条件可能都为空,所以需要对查询条件进行判断,然后拼接。修改为:
<select id="findUserList" parameterType="UserQueryVo" resultType="UserCustom">
select * from user
<where>
<if test="userCustom!=null">
<if test="userCustom.sex!=null and userCustom.sex!=‘‘">
and user.sex = #{userCustom.sex}
</if>
<if test="userCustom.username!=null and userCustom.username!=‘‘">
username like ‘%${userCustom.username}%‘
</if>
</if>
</where>
</select>
where可以自动去掉条件中的第一个and
3.sql片断
将上边的动态sql的判断代码块抽取出来,组成一个sql片断。那么其他的statement可以引用这个sql片断。
定义一个sql片断,去掉上述黑体字中的<where></where>
<sql id="query_user_where">
<if test="userCustom!=null">
<if test="userCustom.sex!=null and userCustom.sex!=‘‘">
and sex = #{userCustom.sex}
</if>
<if test="userCustom.username!=null and userCustom.username!=‘‘">
and username like ‘%${userCustom.username}%‘
</if>
</if>
</sql>
引用sql片断
<select id="findUserList" parameterType="UserQueryVo" resultType="UserCustom">
select * from user
<where>
<include refid="query_user_where"></include>
</where>
</select>
4.for-each
向sql传递数组或List,mybatis使用foreach解析
需求:public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;
a.在输入参数类型UserQueryVo 添加List<Integer> ids以用于传入多个id
public class UserQueryVo {
//传入多个id
private List<Integer> ids;
。。。
b.修改mapper.xml
<sql id="query_user_where">
<if test="userCustom!=null">
<if test="userCustom.sex!=null and userCustom.sex!=‘‘">
and sex = #{userCustom.sex}
</if>
<if test="userCustom.username!=null and userCustom.username!=‘‘">
and username like ‘%${userCustom.username}%‘
</if>
<if test="ids!=null">
<foreach collection="ids" item="user_id" open="AND (" close=")" separator="or">
id=#{user_id}
</foreach>
</if>
</if>
</sql>
c.测试,测试成功
@Test
public void testFindUserList() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
UserQueryVo userQueryVo = new UserQueryVo();
UserCustom userCustom = new UserCustom();
//userCustom.setSex("1");
userCustom.setUsername("小明");
userQueryVo.setUserCustom(userCustom);
List<Integer> ids = new ArrayList<Integer>();
ids.add(16);
ids.add(22);
ids.add(27);
userQueryVo.setIds(ids);
List<UserCustom> list = userMapper.findUserList(userQueryVo);
System.out.println(list);
}