什么是动态sql
mybatis核心对SQL语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装,生成sql
需求
用户信息综合查询和用户信息综合查询总数
对查询条件进行判断,如果输入参数不为空才进行查询条件拼接
<select id="findUserList" parameterType="cn.itcast.mybatis.pojo.UserQueryVo" resultType="cn.itcast.mybatis.pojo.UserCustom">
select * from user
<where>
<if test="userCustom != null">
<if test="userCustom.sex != null and userCustom.sex != ''">
user.sex = #{userCustom.sex}
</if>
<if test="userCustom.username != null and userCustom.username != ''">
user.username like '%${userCustom.username}%'
</if>
</if>
</where>
</select>
<!--用户信息总和查询-->
<select id="findUserCount" parameterType="cn.itcast.mybatis.pojo.UserQueryVo" resultType="int">
select count(*) from user
<where>
<if test="userCustom != null">
<if test="userCustom.sex != null and userCustom.sex != ''">
user.sex = #{userCustom.sex}
</if>
<if test="userCustom.username != null and userCustom.username != ''">
user.username like '%${userCustom.username}%'
</if>
</if>
</where>
</select>
用if进行修改
测试代码
@Test
public void testFindUserList() throws Exception{
//创建usermappper对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建mapper对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//调用usermapper方法
UserQueryVo userQueryVo = new UserQueryVo();
UserCustom userCustom = new UserCustom();
// userCustom.setSex("1");
userCustom.setUsername("张三丰");
userQueryVo.setUserCustom(userCustom);
List<UserCustom> list = userMapper.findUserList(userQueryVo);
System.out.println(list);
}
sql片段
抽取代码块,组成一个sql片段,使其他的statement可以引用代码段
基于单表进行定义sql片段,可重用高
sql不要使用where
<sql id="query_user_where">
<if test="userCustom != null">
<if test="userCustom.sex != null and userCustom.sex != ''">
user.sex = #{userCustom.sex}
</if>
<if test="userCustom.username != null and userCustom.username != ''">
user.username like '%${userCustom.username}%'
</if>
</if>
</sql>
使用sql片段
for each标签
如果对sql进行传递数组或者list,就要用到foreac来解析
select * from user where id=1 or id =10 or id =16