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中特殊符号如”,>,<等这些都需要使用 转义字符
访问集合伪属性: