Mybatis学习笔记8:动态sql

Posted Vincent9847

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis学习笔记8:动态sql相关的知识,希望对你有一定的参考价值。

一、介绍

根据不同的查询条件,生成不同的sql语句。运用动态sql来处理复sql语句的拼接问题。

1.if、where

需求:根据作者名字和博客名字来查询博客!如果作者名字为空,那么只根据博客名字查询,反之,则根据作者名来查询.

1.接口

//
List<Blog> queryBlogIf(Map map);

2.blogMapper.xml

<!--需求1:
根据作者名字和博客名字来查询博客!
如果作者名字为空,那么只根据博客名字查询,反之,则根据作者名来查询
select * from blog where title = #{title} and author = #{author}
-->
<select id="queryBlogIf" parameterType="map" resultType="blog">
  select * from blog
   <where>
       <if test="title != null">
          title = #{title}
       </if>
       <if test="author != null">
          and author = #{author}
       </if>
   </where>
</select>

这个“where”标签会知道如果它包含的标签中有返回值的话,它就插入一个‘where’。此外,如果标签返回的内容是以AND 或OR 开头的,则它会剔除掉.

3.测试

@Test
public void test(){
   SqlSession session = MybatisUtils.getSession();
   BlogDao blogDao = session.getMapper(BlogDao.class);

   HashMap<String, String> map = new HashMap<String, String>();
   map.put("title","1");
   map.put("author","小一");
   List<Blog> blogs = blogDao.queryBlogIf(map);

   System.out.println(blogs);

   session.close();
}

2.set

1.接口

int updateBlog(Map map);

2.blogMapper.xml

<!--注意set是用的逗号隔开-->
<update id="updateBlog" parameterType="map">
  update blog
     <set>
         <if test="title != null">
            title = #{title},
         </if>
         <if test="author != null">
            author = #{author}
         </if>
     </set>
  where id = #{id};
</update>

3.测试

@Test
public void test(){
   SqlSession session = MybatisUtils.getSession();
   BlogDao blogDao = session.getMapper(BlogDao.class);

   HashMap<String, String> map = new HashMap<String, String>();
   map.put("title","动态sql");
   map.put("author","小一");
   map.put("id","1");

   blogDao.updateBlog(map);

   session.close();
}

3.choose

查询条件满足一个即可。(类似Java的switch)

1.接口

List<Blog> queryBlogChoose(Map map);

2.blogMapper.xml

<select id="queryBlogChoose" parameterType="map" resultType="blog">
  select * from blog
   <where>
       <choose>
           <when test="title != null">
                title = #{title}
           </when>
           <when test="author != null">
              and author = #{author}
           </when>
           <otherwise>
              and views = #{views}
           </otherwise>
       </choose>
   </where>
</select>

3.测试

@Test
public void test(){
   SqlSession session = MybatisUtils.getSession();
   BlogDao blogDao = session.getMapper(BlogDao.class);

   HashMap<String, Object> map = new HashMap<String, Object>();
   map.put("title","1");
   map.put("author","小一");
   map.put("views",111);
   List<Blog> blogs = blogDao.queryBlogChoose(map);

   System.out.println(blogs);

   session.close();
}

4.sql片段

增加代码重用性。

注意:最好基于单表定义sql片段;在sql片段中不要包括where。

1.sql片段:

<sql id="if-title-author">
   <if test="title != null">
      title = #{title}
   </if>
   <if test="author != null">
      and author = #{author}
   </if>
</sql>

2.引用sql片段

<select id="queryBlogIf" parameterType="map" resultType="blog">
  select * from blog
   <where>
       <!-- 引用 sql 片段,如果refid 指定的不在本文件中,那么需要在前面加上 namespace -->
       <include refid="if-title-author"></include>
       <!-- 在这里还可以引用其他的 sql 片段 -->
   </where>
</select>

5.foreach

需求:将blog表中的前三个数据的id改为1、2、3

1.接口

List<Blog> queryBlogForeach(Map map);

2.blogMapper.xml

<select id="queryBlogForeach" parameterType="map" resultType="blog">
  select * from blog
   <where>
       <!--
        collection:指定输入对象中的集合属性
        item:每次遍历生成的对象
        open:开始遍历时的拼接字符串
        close:结束时拼接的字符串
        separator:遍历对象之间需要拼接的字符串
        select * from blog where 1=1 and (id=1 or id=2 or id=3)-->
       <foreach collection="ids"  item="id" open="and (" close=")" separator="or">
          id=#{id}
       </foreach>
   </where>
</select>

3.测试

@Test
public void test(){
   SqlSession session = MybatisUtils.getSession();
   BlogDao blogDao = session.getMapper(BlogDao.class);

   HashMap map = new HashMap();
   List<Integer> ids = new ArrayList<Integer>();
   ids.add(1);
   ids.add(2);
   ids.add(3);
   map.put("ids",ids);

   List<Blog> blogs = blogDao.queryBlogForeach(map);

   System.out.println(blogs);

   session.close();
}

 

以上是关于Mybatis学习笔记8:动态sql的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis-05-笔记

Mybatis学习笔记8:动态sql

mybatis学习(39):动态sql片段

Mybatis学习笔记-动态SQL

学习笔记——Mybatis动态SQL

MyBatis学习笔记 —— 动态SQL