MyBatis知识点复习-08动态SQL
上一篇:MyBatis知识点复习-07resultType与resultMap讲解
下一篇:MyBatis知识点复习-09多表操作讲解
本节为大家讲解动态SQL,所谓动态SQL就是可以动态变化SQL语句。
一.where和if标签的联合使用
这一小节不为大家编写Test方法的内容,大家理解后自行使用验证,我已经运行通过了
在UserMapper接口中添加下面函数:
public List<User> findByUser(User user);
现在假设我们要求该函数实现这样的功能:
如果传入的参数user的username不叫李成且不为空就按照user的属性返回
否则返回所有
实现方式为在mapper/UserMapper.xml文件里面添加如下内容:
<select id="findByUser" parameterType="user" resultType="user">
select * from user
<where>
<if test="username !=null and username!='李成'">
name = #{username}
</if>
</where>
</select>
下面我们来解析一下上面的内容:
<where>标签相当于在 select * from user语句后面加上了where语句,但是如果最后if判断后<where>标签里面没有了sql语句会自动的把where去掉,同时<where>标签还拥有灵活去掉and语句的功能(上面这个例子没有体现),将下来是<if>标签里面的test属性值,这里的username应该是参数user的属性名,如果没有这个属性会报错(如果传递的参数的有成员对象A,可以用A.A的属性名来获取A的属性值,上面的例子也没有体现这一点)。
最后需要说明的是如果要判断参数user是否为空貌似mybatis无法实现(反正我不知道,不知道是否可以实现),同时<select>不可以在使用<where>与<if>后而导致其标签体内容为空,这样会报错前面的<insert>、<delete>、<update>也同理
注意点:在使用<if>标签时要注意判断:如果是对象要看是不是null,如果是字符串要判断是不是null和‘’
二.SQL片断
利用SQL片断我们可以把上一小节的内容等效改为下面这样:
<!--声明SQL片断-->
<sql id="select_by_user">
name = #{username}
</sql>
<select id="findByUser" parameterType="user" resultType="user">
select * from user
<where>
<if test="username !=null and username!='李成'">
<!--引入SQL片断-->
<include refid="select_by_user"></include>
</if>
</where>
</select>
具体语法看上面的就懂了,我就不细讲了
三.foreach遍历
在UserMapper接口里面添加如下函数:
public List<User> findByIds(UserQueryVO vo);
在UserQueryVO类添加下面属性:
List<Integer> ids;
记得生成他的getter与setter方法
在mapper/UserMapper.xml文件中添加如下内容:
<select id="findByIds" parameterType="vo" resultType="user">
<!--性别和名字 SELECT * FROM user WHERE id in (10,16,24) -->
SELECT * FROM user
<where>
<if test="ids != null and ids.size > 0">
<!--
collection:集合,写集合属性
item:遍历接收变量
open:遍历开始
close:遍历结束
separator:拼接格式
for(Integer id : ids){
}
-->
<foreach collection="ids" item="id" open="id in(" close=")" separator=",">
${id}
</foreach>
</if>
</where>
</select>
上面注释已经介绍了含义这里就不解释了。
Test方法内容:
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
UserQueryVO vo = new UserQueryVO();
List<Integer> list = new ArrayList<Integer>(){
{
add(10);
add(16);
add(24);
}
};
vo.setIds(list);
List<User> byIds = mapper.findByIds(vo);
System.out.println(byIds);
sqlSession.commit();//提交事务,否则会事务回滚
结果:
上一篇:MyBatis知识点复习-07resultType与resultMap讲解
下一篇:MyBatis知识点复习-09多表操作讲解