MyBatis-动态SQL

动态sql

动态拼串
动态 SQL是MyBatis强大特性之一。极大的简化我们拼装SQL的操作。
动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。
MyBatis 采用功能强大的基于 OGNL 的表达式来简化操作。

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

if 多余的and or 不会自动处理、

name != "" => equal
name != '' => name != ''

@Test
    public void getBookByPriceAndBookName() {
        openSession = sqlSessionFactory.openSession();
        BookMapper mapper = openSession.getMapper(BookMapper.class);
        Book book = new Book();
        book.setIsbn("%ISBN%");
        book.setPrice(100);
        List<Book> b  = mapper.getBookByIsbn(book);
        System.out.println(b);
    }
    <select id="getBookByIsbn" resultType="com.project.bean.Book">
        SELECT * FROM book where 
        <if test="price !=null and price !='' ">
            price > #{price} AND
        </if>
        <if test="isbn !=null and isbn !='' ">
            isbn Like #{isbn} AND
        </if>
        <if test="book_name != null and book_name != ''">
            book_name = #{book_name}
        </if>
    </select>

WHERE 取掉前面 and

<mapper namespace="com.project.mapper.BookMapper">
    <select id="getBookByIsbn" resultType="com.project.bean.Book">
        SELECT * FROM book
        <where>
            <if test="price !=null and price !='' ">
                price > #{price} 
            </if>
            <if test="isbn !=null and isbn !='' ">
                AND isbn Like #{isbn} 
            </if>
            <if test="book_name != null and book_name != ''">
                AND book_name = #{book_name}
            </if>
        </where>
    </select>
</mapper>

choose【if else】

<select id="getBookByIsbn" resultType="com.project.bean.Book">
        SELECT * FROM book
        <trim>
            <choose >
                <when test="price !=null and price !='' ">
                    price > #{price} 
                </when>
                <when test="isbn !=null and isbn !='' ">
                    isbn Like #{isbn} 
                </when>
                <otherwise>
                    book_name = #{book_name}
                </otherwise>
            </choose>
        </trim>
    </select>

trim

prefix:为我们下面sql整体添加一个前缀
prefixOverrides 取出整体字符串前面多余的字符
suffix="" 为整体添加一个后缀
suffixOverrides 后面哪个多了可以去掉
prefix="where" prefixOverrides="and" suffix="" suffixOverrides="and"

<select id="getBookByIsbn" resultType="com.project.bean.Book">
        SELECT * FROM book
        <trim prefix="where" prefixOverrides="and" suffix="" suffixOverrides="and">
            <if test="price !=null and price !='' ">
                price > #{price} 
            </if>
            <if test="isbn !=null and isbn !='' ">
                AND isbn Like #{isbn} 
            </if>
            <if test="book_name != null and book_name != ''">
                AND book_name = #{book_name}
            </if>
        </trim>
    </select>

foreach

  • 动态 SQL 的另外一个常用的必要操作是需要对一个集合进行遍历,通常是在构建 IN 条件语句的时候。

  • 当迭代列表、集合等可迭代对象或者数组时
    index是当前迭代的次数,item的值是本次迭代获取的元素

  • 当使用字典(或者Map.Entry对象的集合)时
    index是键,item是值

帮我们遍历集合的,collection="",指定要遍历的集合的key ,close="" 以什么结束,
index="i":索引【如果遍历的是一个list:index指定的变量保存了当前索引,item:保存当前遍历的元素的值】【如果遍历的是一个map:index:指定的变量就是保存了当前遍历的元素的key,item:就是保存当前的元素的值】
item="变量名",每次遍历出的元素起一个变量名方便引用
open="",以什么开始
separator="",每次遍历的元素的分隔符

<select id="getBookByPrices" resultType="com.project.bean.Book">
        SELECT * FROM book WHERE price in
        <foreach collection="list" open="(" close=")" item="price" index="i" separator=",">
            #{price}
        </foreach>
    </select>

set 针对数据库更新

<update id="updateBookById" >
        update book 
        <set>
            <if test="book_name != null and isbn !='' ">
                book_name = #{book_name},
            </if>
            <if test="isbn!=null and isbn!='' ">
                isbn = #{isbn},
            </if>
            <if test="price!=null" >
                price = #{price}
            </if>
        </set>
        <where>
            isbn=#{isbn}
        </where>
    </update>

bind麻烦 不用

元素可以从 OGNL 表达式中创建一个变量并将其绑定到上下文。

<bind name="_name" value="'%'+name+'name'">

sql抽取可重用sql的语句

<sql id="selectSql">select * from book </sql>
<select>
    <include refid="selectSql"></include>
    where id = #{id}
</select>

ulti-db vendor support

若在 mybatis 配置文件中配置了 databaseIdProvider , 则可以使用 “_databaseId”变量,这样就可以根据不同的数据库厂商构建特定的语句

_parameter代表传来的参数

  • 单个参数:_parameter就代表这个参数
  • 多个参数:_parameter就代表多个参数集合起来的map

_databaseId :当前环境
如果配置了databaseIdProvider:_databaseId 就有值

OGNL

OGNL( Object Graph Navigation Language )对象图导航语言,这是一种强大的
表达式语言,通过它可以非常方便的来操作对象属性。 类似于我们的EL,SpEL等

  • 访问对象属性: person.name

  • 调用方法: person.getName()

  • 调用静态属性/方法: @java.lang.Math@PI

          @java.util.UUID@randomUUID()
  • 调用构造方法: new com.atguigu.bean.Person(‘admin’).name

  • 运算符: +,-*,/,%

  • 逻辑运算符: in,not in,>,>=,<,<=,==,!=

      注意:xml中特殊符号如”,>,<等这些都需要使用 转义字符  
  • 访问集合伪属性:
    图片说明

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务