您的位置:首页 > 博客中心 > 数据库 >

MyBatis学习17-动态sql

时间:2022-03-14 16:25

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);
}

 

热门排行

今日推荐

热门手游