狂神说Mybatis07:动态SQL

动态SQL

什么是动态SQL:动态SQL就是指根据不同的条件生成不同的SQL语句

利用动态SQL这一特性可以彻底摆脱这种痛苦

动态SQL元素和JSTL或基于类似XML的文本处理器相似。在MyBatis之前的版本中,有很多元素需要花时间了解。MyBatis 3大大精简了元素种类,现在只需学习原来一半的元素便可。MyBatis采用功能强大的基于OGNL的表达式来淘汰其它大部分元素。

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

搭建环境

CREATE TABLE `blog`(

`id` VARCHAR(50) NOT NULL COMMENT '博客id',
`title` VARCHAR(100) NOT NULL COMMENT '博客标题',
`author` VARCHAR(100) NOT NULL COMMENT '博客作者',
`create_time` DATETIME NOT NULL COMMENT '创建时间',
`views` INT(30) NOT NULL COMMENT '浏览量'
)ENGINE=INNODB DEFAULT CHARSET=utf8

1、创建一个基础maven子工程mybatis-08

2、导入Lombok包

3、编写配置文件(拷贝前面的配置文件和工具类)

4、编写实体类

@Data
public class Blog {

    private String id;
    private String title;
    private String author;
    private Date createTime;//属性名和字段名不一致
    private int views;
}

5、工具类设置添加ID为随机

@SuppressWarnings("all")//抑制警告
public class IDutils {

    public static String getId() {
        return UUID.randomUUID().toString().replaceAll("-","");
    }

  @Test
    public void test(){
         System.out.println(IDutils.getId());
         System.out.println(IDutils.getId());
         System.out.println(IDutils.getId());
     }

6、开启驼峰命名自动映射

 <settings>
<!--        是否开启驼峰命名自动映射-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
 </settings>

7、测试添加数据

<insert id="addBlog" parameterType="blog">

    insert  into mybatis.blog(id,title,author,create_time,views)
    values (#{id},#{title},#{author},#{createTime},#{views});
</insert>
  @Test
    public void test() {
//        System.out.println(IDutils.getId());
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);

        Blog blog = new Blog();
        blog.setId(IDutils.getId());
        blog.setTitle("Mybatis");
        blog.setAuthor("神");
        blog.setCreateTime(new Date());
        blog.setViews(9999);

        mapper.addBlog(blog);

        blog.setId(IDutils.getId());
        blog.setTitle("Java");
        mapper.addBlog(blog);

        blog.setId(IDutils.getId());
        blog.setTitle("Spring");
        mapper.addBlog(blog);

        blog.setId(IDutils.getId());
        blog.setTitle("微服务");
        mapper.addBlog(blog);

        sqlSession.close();
    }

8、编写实体类对应Mapper接口和Mapper.XML文件

1、IF

public interface BlogMapper {

    //插入数据
    int addBlog(Blog blog);

    //查询博客
    List<Blog> queryBlogIF(Map map);
}
  <select id="queryBlogIF" parameterType="map" resultType="blog">
        select * from blog where 1=1
        <if test="title!=null">
            and title =#{title}
        </if>
        <if test="author!=null">
        and author =#{author}
        </if>
    </select>

测试查询

@Test
    public void testqueryBlogIF() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);

        HashMap hashMap = new HashMap();
        hashMap.put("title","Mybatis");

        List<Blog> blogs = mapper.queryBlogIF(hashMap);
        for (Blog blog : blogs) {
            System.out.println(blog);
        }

        sqlSession.close();
    }

2、choose (when, otherwise)

 <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、trim (where,set)

 select * from blog 
        <where>
            <if test="title!=null">
                and title =#{title}
            </if>
            <if test="author!=null">
                and author =#{author}
            </if>
        </where>
 <select 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}
    </select>

所谓的动态SQL,本质还是SQL语句,只是我们可以在SQL层面,去执行一个逻辑代码

SQL片段

有的时候,我们可能会将一些公共的部分抽取出来,方便复用!

1、使用SQL标签抽取公共的部分

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

2、在需要使用的地方使用Include标签引用即可

 <select id="queryBlogIF" parameterType="map" resultType="blog">
        select * from blog 
       <where>
           <include refid="if-title-author"></include>
       </where>
 </select>

注意事项:

  • 最好基于单表来定义SQL片段!

  • 不要存在where标签

4、Foreach

select * from blog where 1=1  and
 <foreach collection="ids" item="id" 
 open="(" separator="or" close=")" >
            #{id}
  </foreach>
        
(id=1 or id =2 or id=3)

狂神说Mybatis07:动态SQL_第1张图片

狂神说Mybatis07:动态SQL_第2张图片

 @Test
    public void testqueryBlogForeach(){

        SqlSession sqlSession = MybatisUtils.getSqlSession();
        BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);

        HashMap hashMap = new HashMap();

        ArrayList<Integer> ids = new ArrayList<Integer>();
        ids.add(1);
        ids.add(2);
        hashMap.put("ids",ids);

        List<Blog> blogs = mapper.queryBlogForeach(hashMap);
        for (Blog blog : blogs) {
            System.out.println(blog);
        }

        sqlSession.close();
    }
<!--  select * from blog where 1=1 and (id=1 or id =2 or id=3) -->
<!--    我们现在传递一个万能的map , 这map中可以存在一个集合!-->
    <select id="queryBlogForeach" parameterType="map" resultType="blog">
        select * from blog
        <where>
        <foreach collection="ids" item="id" open="and (" close=")" separator="or">
            id=#{id}
        </foreach>
        </where>
    </select>

动态SQL就是在拼接SQL语句,我们只要保证SQL的正确性,按照SQL的格式,去排列组合就可以了

建议:

现在Mysql中写出完整的SQL,再对应的去修改成为我们的动态SQL实现通用即可!

你可能感兴趣的:(java,intellij-idea,mybatis)