mybatis之动态sql(超详细)

动态SQL

可以根据具体的参数条件,来对SQL语句进行动态拼接。

比如在以前的开发中,由于不确定查询参数是否存在,许多人会使用类似于where 1 = 1来作为前缀,然后后面用AND拼接要查询的参数,这样,就算要查询的参数为空,也能够正确执行查询,如果不加1 = 1,则如果查询参数为空,SQL语句就会变成SELECT * FROM student where,SQL不合法。

mybatis里的动态标签主要有

  • if
<!-- 示例 -->
<select id="find" resultType="student" parameterType="student">
       SELECT * FROM student WHERE age >= 18
       <if test="name != null and name != ''">
           AND name like '%${name}%'
       </if>
</select>

当满足test条件时,才会将<if>标签内的SQL语句拼接上去。

  • choose
<!-- choose 和 when , otherwise 是配套标签 
类似于java中的switch,只会选中满足条件的一个
-->
<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <choose>
    <when test="title != null">
      AND title like #{title}
    </when>
    <when test="author != null and author.name != null">
      AND author_name like #{author.name}
    </when>
    <otherwise>
      AND featured = 1
    </otherwise>
  </choose>
</select>
  • sql
    <!--  List<User> findByList(List<Integer> list);  -->
    <select id="findByList" resultType="com.xia.domo.User" parameterType="java.util.List">
        SELECT * FROM user
        <include refid="rnm"></include>

    </select>

    <sql id="rnm">
        <where>
            <if test="list != null and list.size() > 0">
                AND id in
                <foreach collection="list" item="id" open="(" separator="," close=")">
                    #{id}
                </foreach>
            </if>
        </where>
    </sql>
  • trim

    • where

      <where>标签只会在至少有一个子元素返回了SQL语句时, 才会向SQL语句中添加WHERE,并且如果WHERE之后是以AND或OR开头,会自动将其删掉。

    <select id="findActiveBlogLike"
       resultType="Blog">
    	SELECT * FROM BLOG
    	<where>
     	 <if test="state != null">
          	 state = #{state}
    	  </if>
     	 <if test="title != null">
         	 AND title like #{title}
     	 </if>
      	 <if test="author != null and author.name != null">
          	AND author_name like #{author.name}
         </if>
    	</where>
    </select>
    

    <where>标签可以用<trim>标签代替

    <trim prefix="WHERE" prefixOverrides="AND | OR">
     ...
    </trim>
    
    • set

    在至少有一个子元素返回了SQL语句时,才会向SQL语句中添加SET,并且如果SET之后是以,开头的话,会自动将其删掉

    <set>标签相当于如下的<trim>标签

    <trim prefix="SET" prefixOverrides=",">
    ...
    </trim>
    
    • bind

    mybatis的动态SQL都是用OGNL表达式进行解析的,如果需要创建OGNL表达式以外的变量,可以用bind标签。

    <select id="selectBlogsLike" resultType="Blog">
    <bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
    SELECT * FROM BLOG
    WHERE title LIKE #{pattern}
    </select>
    

版权声明:本文为xjszsd原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。