zoukankan      html  css  js  c++  java
  • 动态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(30) NOT NULL COMMENT '博客作者',
    `create_time` DATETIME NOT NULL COMMENT '创建时间',
    `views` INT(30) NOT NULL COMMENT '浏览量'
    )ENGINE = INNODB DEFAULT CHARSET=utf8
    

    创建一个基础工程

    1. 导包

    2. 编写配置文件

    3. 编写实体类

      @Data
      public class Blog {
          private int id;
          private String title;
          private String author;
          private Date createTime;
          private int views;
      }
      
    4. 编写实体类对应的Mapper接口和Mapper.xml文件

    if - where

    <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>
    

    choose(when, otherwise) - where

    <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>
                    views = #{views}
                </otherwise>
            </choose>
        </where>
    </select>
    

    if - set

    <update id="updateBlog" parameterType="map">
        update blog
        <set>
            <if test="title != null">
                title = #{title},
            </if>
            <if test="author != null">
                author = #{author},
            </if>
            <if test="views != null">
                views = #{views}
            </if>
        </set>
        where id = #{id}
    </update>
    

    where和set的本质都是trim

    <trim prefix="WHERE" prefixOverrides="AND |OR ">
      ...
    </trim>
    
    <trim prefix="SET" suffixOverrides=",">
      ...
    </trim>
    

    SQL片段

    <sql id="片段名">
    	--片段代码
    </sql>
    ...
    	--插入片段
    	<include refid="片段名"/>
    ...
    

    foreach

    <select id="selectPostIn" resultType="domain.blog.Post">
      SELECT *
      FROM POST P
      WHERE ID in
      <foreach item="item" index="index" collection="list"
          open="(" separator="," close=")">
            #{item}
      </foreach>
    </select>
    
    • 通过foreach查找id为1,2,4的数据:

      <select id="queryBlogForeach" parameterType="map" resultType="blog">
          select * from blog
          <where>
              <foreach item="id" collection="ids" open="and (" close=")" separator="or">
                  id = #{id}
              </foreach>
          </where>
      </select>
      
      @Test
      public void queryBlogForeach() {
          SqlSession sqlSession = MybatisUtils.getSqlSession();
          BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
          HashMap map = new HashMap();
          ArrayList<Integer> ids = new ArrayList<Integer>();
          ids.add(1);
          ids.add(2);
          ids.add(4);
          map.put("ids", ids);
          List<Blog> blogList = mapper.queryBlogForeach(map);
          for (Blog blog : blogList) {
              System.out.println(blog);
          }
          sqlSession.close();
      }
      
  • 相关阅读:
    git 只添加cpp文件
    URI和URL学习
    scanpy中常用函数
    特征去量纲方法
    排列组合数计算公式
    UML图
    行测图形推理笔记-
    nis服务器实现用户帐号管理同步
    rsh配置双方主机免密
    两周实习的总结
  • 原文地址:https://www.cnblogs.com/pinked/p/12181007.html
Copyright © 2011-2022 走看看