zoukankan      html  css  js  c++  java
  • mybatis动态sql语句学习(一)

    动态 SQL

    MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。

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

    if 元素

    有条件的执行where语句,if 元素是与(and)的关系。

    <select id="selectStudentInfoFive" parameterType="map" resultType="com.springboot02.dao.entity.StudentInfoEntity">
        SELECT * FROM student_t
        WHERE state = 1 
        <if test="id != null">
            AND _id = #{id,jdbcType=VARCHAR}
        </if>
        <if test="name != null">
            AND name = #{name,jdbcType=VARCHAR}
        </if>
    </select>
    
    <!--SELECT * FROM student_t WHERE state = 1 AND _id = '1'-->

    choose, when, otherwise 元素

    类似于Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。choose 是或(or)的关系。

    <select id="selectUserInfoTwo" parameterType="java.lang.String" resultMap="BaseResultMap">
        SELECT * FROM user WHERE status = 1
        <choose>
          <when test="username != null and username != ''">
            AND username = #{username,jdbcType = VARCHAR}
          </when>
          <when test="password != null and password != ''">
           AND password = #{password,jdbcType = VARCHAR}
          </when>
          <otherwise>
            AND power = '1'
          </otherwise>
        </choose>
    </select> <!--SELECT * FROM user WHERE status = 1 AND username = 'nana'--> <!--SELECT * FROM user WHERE status = 1 AND power = '1'-->

    trim, where, set 元素

    trim 元素可以定制我们想要的功能,例如set或者是where元素的功能。

    where 元素只有在一个以上的if条件有值的情况下才去插入“WHERE”子句。而且,若最后的内容是“AND”或“OR”开头的where 元素会将他们去除。

    set 元素可以被用于动态包含需要更新的列,去除内容中最后一个“,”。

    例子1:trim 元素替换where 元素

    <select id="selectUserInfoByPowerTwo" parameterType="java.lang.String" resultMap="BaseResultMap">
      SELECT * FROM user
      <where>
        <if test="power != null and power != ''">
          AND power = #{power,jdbcType = VARCHAR}
        </if>
        <if test="status != null and status != ''">
          AND status = 1
        </if>
      </where>
    </select>
    
    
    <select id="selectUserInfoByPower" parameterType="java.lang.String" resultMap="BaseResultMap">
        SELECT * FROM user
        <trim prefix=" where" prefixOverrides="AND|OR">
          <if test="power != null and power != ''">
            power = #{power,jdbcType = VARCHAR}
          </if>
          <if test="status != null and status != ''">
            AND status = 1
          </if>
        </trim>
    </select>
     <!--select * from user WHERE power = '1'-->
     <!--select * from user WHERE status = 1-->

    prefix:前缀      

    prefixoverride:去掉第一个and或者是or

    例子2:trim 元素替换set 元素

    <update id="updateStudentInfoTwo" parameterType="com.springboot02.dao.entity.StudentInfoEntity">
        UPDATE student_t
        <set>
          <if test="name != null and name !=''">
            name=#{name,jdbcType = VARCHAR},
          </if>
          <if test="age != null and age != ''">
            age = #{age,jdbcType = VARCHAR},
          </if>
        </set>
        WHERE _id = #{id,jdbcType = VARCHAR}
    </update>
    <!--UPDATE student_t SET name='name', age = '12' WHERE _id = 1-->
    
    
    <update id="updateStudentInfoOne" parameterType="com.springboot02.dao.entity.StudentInfoEntity">
        UPDATE student_t
        <trim prefix="set" suffixOverrides="," suffix="WHERE _id = #{id,jdbcType=VARCHAR}">
          <if test="name != null and name !=''">
            name=#{name,jdbcType = VARCHAR},
          </if>
          <if test="age != null and age != ''">
           age = #{age,jdbcType =VARCHAR},
          </if>
        </trim>
    </update>
    <!--UPDATE student_t SET name = 'nanana' WHERE _id = 1-->

    suffix:后缀      

    suffixoverride:去掉最后一个,

    foreach 元素

    foreach 元素主要用于构建in条件,可以在sql中对集合进行迭代。可以在批量删除、添加等操作中使用。

    <delete id="deleteStudentInfoOne" parameterType="arraylist">
          DELETE FROM student_t WHERE _id IN
          <foreach collection="array" item="id" index="index" open="(" close=")" separator=",">
              #{id}
          </foreach>
    </delete>
    <!--DELETE FROM student_t WHERE _id IN (1,2)-->

    collection :collection属性的值有3种:list、array、map,分别对应的参数类型为:List、数组、map集合。

    item : 表示迭代元素的别名。

    index :表示当前迭代的次数

    open :前缀

    close :后缀

    separator :分隔符,表示迭代时每个元素之间以什么分隔。

    sql 片段

    在mybatis中通过使用SQL片段可以提高代码的重用性。

    例子1:

    <!--创建动态sql-->
    <sql id="sql_count">select count(*)</sql>
    
    <!--查找学生表,状态为1的全部学生数量-->
    <select id="selectListCount" resultType="java.lang.String">
          <include refid="sql_count"/> FROM student_t where status = 1
    </select>
    
    <!--select count(*) FROM student_t where status = 1-->

     例子2:

    <!--创建动态sql-->
    <sql id="sql_student">select * from student_t </sql>
    <sql id="sql_where">
            <trim prefix="where" prefixOverrides="AND|OR">
                <if test="id != null">AND _id = #{id}</if>
                <if test="name != null and name.length() > 0">AND name = #{name}</if>
                <if test="age != null and age.length() > 0">AND age = #{age}</if>
            </trim>
    </sql>
    
    <!--根据输入条件,查找学生信息-->
    <select id="selectStudentInfoThree" parameterType="map" resultMap="BaseResultMap">
         <include refid="sql_student"/>
         <include refid="sql_where"/>
    </select>
    <!--SELECT * FROM student_t WHERE _id = 1 AND name = 'nana'-->
  • 相关阅读:
    springboot嵌入式servlet容器的自动配置以及原理
    简单认识springboot的错误处理机制
    使用springboot来编写web项目的一些实现
    spring-cloud-starter-openfeign 源码详细讲解
    简述application.properties和application.yml 以及 @ConfigurationProperties 和@PropertySource @Value 和@ImportResource的用法,区别
    Ribbon源码分析(二)-- 服务列表的获取和负载均衡算法分析
    git的详细使用,项目创建到同步远程仓库,版本回退,忽略文件,分支创建,分支合并,分支名称修改,冲突解决,项目迁移
    Ribbon源码分析(一)-- RestTemplate 以及自定义负载均衡算法
    eureka源码--服务的注册、服务续约、服务发现、服务下线、服务剔除、定时任务以及自定义注册中心的思路
    eureka集群的搭建
  • 原文地址:https://www.cnblogs.com/nananana/p/8491688.html
Copyright © 2011-2022 走看看