MYBATIS05_ifwherechoosewhentrimsetforEach标签sql片段
Posted 所得皆惊喜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MYBATIS05_ifwherechoosewhentrimsetforEach标签sql片段相关的知识,希望对你有一定的参考价值。
文章目录
①. 动态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 | 去掉最后一个指定内容 |
- ②. 替代where的实现
<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>
- ③. 替换set标签
<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 | 用一个变量名表示当前循环的索引位置 |
- ②. 传入集合list
<!--forEach的使用-->
<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>
/*根据用户ids进行查询*/
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>
- ⑤. 传入map
<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
//1.获取会话对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//2.执行sql
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片段简化编写-->
<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>
以上是关于MYBATIS05_ifwherechoosewhentrimsetforEach标签sql片段的主要内容,如果未能解决你的问题,请参考以下文章
阶段3 1.Mybatis_01.Mybatis课程介绍及环境搭建_05.mybatis环境搭建-前期准备
阶段3 1.Mybatis_05.使用Mybatis完成CRUD_2 Mybatis的CRUD-保存操作
阶段3 1.Mybatis_05.使用Mybatis完成CRUD_5 Mybatis的CRUD-查询返回一行一列和占位符分析