①. 动态sql语句概述
-
①. 动态SQL是MyBatis的强大特性之一。如果你使用过JDBC或其它类似的框架,你应该能理解根据不同条件拼接SQL语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态SQL,可以彻底摆脱这种痛苦。 -
②. 使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性 -
③. 如果你之前用过JSTL或任何基于类XML语言的文本处理器,你对动态SQL元素可能会感觉似曾相识。在MyBatis之前的版本中,需要花时间了解大量的元素。借助功能强大的基于OGNL的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。
②. if判断标签
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</select>
③. where标签
- where:可以自动去掉条件中的第一个and或者or
<select id="findByCondition" parameterType="user" resultType="user">
select * from User
<where>
<if test="id!=0">
and id=#{id}
</if>
<if test="username!=null">
and username=#{username}
</if>
</where>
</select>
④. choose、when、otherwise
-
①. 有时候,我们不想使用所有的条件,而只是想从多个条件中选择一个使用。针对这种情况,MyBatis提供了choose元素,它有点像Java中的 switch 语句 -
②. 传入了"title”就按"title”查找,传入了 "author” 就按"author”查找的情形。若两者都没有传入,就返回标记为featured的BLOG
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND author_name like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>
⑤. trim语句
- ①. trim标记是一个格式化的标记。可以完成set或者where标记的功能
属性 | 说明 |
---|
prefix | 前缀 | prefixOverrides | 去掉第一个指定内容 | suffix | 后缀 | suffixoverrides | 去掉最后一个指定内容 |
<select id="queryWhere" parameterType="user" resultType="user">
select *from t_user
<trim prefix="where" prefixOverrides="AND |OR ">
<if test="username != null">
and username = #{username}
</if>
<if test="address != null">
and address like #{address}
</if>
<if test="gender != null">
and gender = #{gender}
</if>
</trim>
</select>
<update id="updateUser" parameterType="user" >
update t_user
<trim prefix="set" suffixOverrides=",">
<if test="username != null">
username = #{username},
</if>
<if test="address != null">
address = #{address},
</if>
<if test="gender != null">
gender = #{gender},
</if>
</trim>
where id = #{id}
</update>
⑥. set标签
- set元素主要用于更新操作,其主要作用是在动态包含的sql语句前输出一个SET关键字,并将SQL语句中最后一个逗号去除
⑦. forEach遍历
- ①. foreach一共有List,array,Map三种类型的使用场景。foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合
属性 | 说明 |
---|
collection | collection属性的值有三个分别是list、array、map三种 | open | 前缀 | close | 后缀 | separator | 分隔符,表示迭代时每个元素之间以什么分隔 | item | 表示在迭代过程中每一个元素的别名 | index | 用一个变量名表示当前循环的索引位置 |
<select id="findByIds" parameterType="list" resultType="user">
select * from User
<where>
<foreach collection="list" open="id in(" close=")" item="id" separator=",">
#{id}
</foreach>
</where>
</select>
List<User> findByIds(List<Integer>list);
@Test
public void test2(){
List<Integer>ids=new ArrayList<>();
ids.add(1);
ids.add(2);
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User>users = mapper.findByIds(ids);
System.out.println(users);
}
- ③. 批量插入数据的时候使用
- ④. 传入数组array
List<User>selectByIdS(@Param("ids") Integer[]ids)
<select id="selectByIdS" resultType="user">
select * from user where id in
<foreach collection="array" separator="," open="(" close=")" item="id">
#{id}
</foreach>
</select>
<select id="selectByIdSWithMap" resultType="user">
select * from user where id in
<foreach collection="idsByMap.split(',')" separator="," open="(" close=")" item="id">
#{id}
</foreach>
</select>
List<User>selectByIdSWithMap(Map<String,String>maps);
@Test
public void forEachByMaps()throws Exception{
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap<String, String> map = new HashMap<>();
map.put("idsByMap","1,512,513");
List<User> users = mapper.selectByIdSWithMap(map);
users.forEach(System.out::print);
sqlSession.commit();
}
⑧. sql片段
- ①. 先定义一个sql片段
- ②. 引用sql片段
<sql id="selectUser"></sql> select * from User</sql>
<select id="findById" parameterType="int" resultType="user">
<include refid="selectUser"></include> where id=#{id}
</select>
<select id="findByIds" parameterType="list" resultType="user">
<include refid="selectUser"></include>
<where>
<foreach collection="array" open="id in(" close=")" item="id" separator=",">
#{id}
</foreach>
</where>
</select>
|