Mybatis动态sql

时间:2021-01-26
本文章向大家介绍Mybatis动态sql,主要包括Mybatis动态sql使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Mybatis动态sql

动态sql:根据不同的条件生成不同的sql语句。

mybatis提供了如下几个元素来实现动态sql

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

搭建数据库

动态sql——if

要求:若title和author都为空的情况下,查出所有记录,title不为空的情况下查出相对应的title记录,author不为空的情况下查出相对应的author记录。

定义接口

public interface BlogMapper {
    List<Blog> queryBlogIF(Map<Object,Object> map);
}

实现接口

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="gbl.dao.BlogMapper">
    <insert id="addBlog" parameterType="blog">
        insert into mybatis.blog(id, title, author, create_time, views)
        values (#{id},#{title},#{author},#{createTime},#{views})
    </insert>

    <select id="queryBlogIF" parameterType="map" resultType="blog">
        select * from blog
        <where>
            <if test="title != null " >
                and title = #{title}
            </if>
            <if test="author != null " >
                and author = #{author}
            </if>
        </where>
    </select>
</mapper>

测试

title和author为空,查出所有信息

public void queryBlogIF(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
    Map<Object,Object>  map  = new HashMap<>();
    List<Blog> blogs = mapper.queryBlogIF(map);
    for (Blog blog : blogs) {
        System.out.println(blog);
    }

    sqlSession.close();
}

//结果
Blog{id='e24e0c77e76d4623a12ceeebbc68e57f', title='Java', author='xxgbl', createTime=Tue Jan 26 21:16:21 CST 2021, views=999}
Blog{id='33a67d7887b04d628a4c915db5056f2c', title='SSM', author='xxgbl', createTime=Tue Jan 26 21:16:21 CST 2021, views=999}
Blog{id='796207a9cd2c48d4aa83049d7afd4e48', title='Spring', author='gbl', createTime=Tue Jan 26 21:16:21 CST 2021, views=999}
Blog{id='2ee49a5bca2b400794b410cadf7fe175', title='JS', author='gbl', createTime=Tue Jan 26 21:16:21 CST 2021, views=999}

title不为空

public void queryBlogIF(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
    Map<Object,Object>  map  = new HashMap<>();
    map.put("title","Java");
    List<Blog> blogs = mapper.queryBlogIF(map);
    for (Blog blog : blogs) {
        System.out.println(blog);
    }

    sqlSession.close();
}

//结果
Blog{id='e24e0c77e76d4623a12ceeebbc68e57f', title='Java', author='xxgbl', createTime=Tue Jan 26 21:16:21 CST 2021, views=999}

author不为空

public void queryBlogIF(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
    Map<Object,Object>  map  = new HashMap<>();
    map.put("author","xxgbl");
    List<Blog> blogs = mapper.queryBlogIF(map);
    for (Blog blog : blogs) {
        System.out.println(blog);
    }

    sqlSession.close();
}

//结果
Blog{id='e24e0c77e76d4623a12ceeebbc68e57f', title='Java', author='xxgbl', createTime=Tue Jan 26 21:16:21 CST 2021, views=999}
Blog{id='33a67d7887b04d628a4c915db5056f2c', title='SSM', author='xxgbl', createTime=Tue Jan 26 21:16:21 CST 2021, views=999}

动态sql——choose(when、otherwise)

choose有点像Java中的switch语句。

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

动态sql——foreach

<!--
        select * from blog where title in("Java" , "SSM")

        collection: 接受一个集合,相当于("Java" , "SSM")
        item:相当于("Java" , "SSM")中的每一个具体的值
        open:前缀,相当于("Java" , "SSM")中的前括号(
        separator:分隔符,相当于("Java" , "SSM")中的逗号,
        close:后缀,相当于("Java" , "SSM")中的后括号)

        所以这个sql语句应该是: select * from blog where title in("Java" , "SSM")

    -->
<select id="queryBlogForeach" parameterType="map" resultType="blog">
    select * from blog where title in
    <foreach item="title" collection="list" open="(" separator="," close=")">
        #{title}
    </foreach>
</select>

测试:

public void queryBlogForeach(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
    ArrayList<String> list = new ArrayList<>();
    list.add("Java");
    list.add("SSM");

    Map<Object,Object> map = new HashMap();
    map.put("list",list);
    List<Blog> blogs = mapper.queryBlogForeach(map);
    for (Blog blog : blogs) {
        System.out.println(blog);
    }
    sqlSession.close();
}

//
这个sql相当于 select * from blog where title in("Java" , "SSM")
    
//结果
Blog{id='e24e0c77e76d4623a12ceeebbc68e57f', title='Java', author='xxgbl', createTime=Tue Jan 26 21:16:21 CST 2021, views=999}
Blog{id='33a67d7887b04d628a4c915db5056f2c', title='SSM', author='xxgbl', createTime=Tue Jan 26 21:16:21 CST 2021, views=999}

原文地址:https://www.cnblogs.com/xxgbl/p/14332720.html