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语句中进行迭代一个集合
属性说明
collectioncollection属性的值有三个分别是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-查询返回一行一列和占位符分析

MyBatis学习总结_05_实现关联表查询

MYBATIS05_ifwherechoosewhentrimsetforEach标签sql片段

MYBATIS05_表结构关系一对一一对多多对多延迟加载