MyBatis 最强大的特性之一就是它的动态语句功能。如果您以前有使用JDBC或者类似框架的 经历,您就会明白把SQL语句条件连接在一起是多么的痛苦,要确保不能忘记空格或者不要在 columns列后面省略一个逗号等。动态语句能够完全解决掉这些痛苦。
尽管与动态SQL一起工作不是在开一个party,但是MyBatis确实能通过在任何映射SQL语句中 使用强大的动态SQL来改进这些状况。
if 元素
if元素条件判断,动态 SQL 最常做的事就是有条件地包括 where 子句。例如:
<select id=”findActiveBlogWithTitleLike” parameterType=”Blog” resultType=”Blog”> SELECT * FROM BLOG WHERE state = ‘ACTIVE' <if test=”title != null”> AND title like #{title} </if> </select>
where元素
where元素知道插入“where”如果它包含的标签中有内容返回的话。此外,如果返回的内容 以“AND” 或者 “OR”开头,它会把“AND” 或者 “OR”去掉。
<select id="findStudentList" parameterType="hashmap" resultMap="studentInfo"> select * from t_student <where> <if test="name!=null"> and name=#{name} </if> <if test="age!=null"> and age=#{age} </if> </where> </select>
choose元素
有时候我们不想应用所有的条件,而是想从多个选项中选择一个。与 java 中的 switch 语句 相似,MyBatis 提供了一个 choose 元素。
when元素
当when里面的条件成立时,执行when标签内的语句
<select id="findStudentList" parameterType="hashmap" resultMap="studentInfo"> select * from t_student <where> <choose> <when test="name!=null"> and name=#{name} </when> <when test="age!=null"> and age=#{age} </when> </choose> </where> </select>
otherwise元素
当所有when都不成立了,执行otherwise
<select id="findStudentList" parameterType="hashmap" resultMap="studentInfo"> select * from t_student <where> <choose> <when test="name!=null"> and name=#{name} </when> <when test="age!=null"> and age=#{age} </when> <otherwise> and name='jim' </otherwise> </choose> </where> </select>
trim元素
如果 where 元素的行为并没有完全按您想象的那样,您还可以使用 trim 元素来自定义。
trim内的if有成立的就添加一个前缀用prefix=""定义,没有就不添加。
trim元素也可以去掉where后面指定的关键字and或者or等等,用prefixOverrides=""定义
<select id="findStudentList" parameterType="hashmap" resultMap="studentInfo"> select * from t_student <trim prefix="where" prefixOverrides="and"> <if test="name!=null"> and name=#{name} </if> <if test="age!=null"> and age=#{age} </if> </trim> </select>
set元素
在动态update语句里相似的解决方式叫做set,这个set元素能够动态地更新列。
set 元素将动态的配置set关键字,也用来剔除追加到条件末尾的任何不相关的逗号。
<update id="updateStudent" parameterType="Student"> update t_student <set> <if test="name!=null"> name=#{name}, </if> <if test="age!=null"> age=#{age}, </if> </set> where id=#{id} </update>
当然了,聪明的你肯定想知道等同的 trim 元素该怎么写吧,它就像这样 :
<update id="updateStudent" parameterType="Student"> update t_student <trim prefix="set" prefixOverrides=","> <if test="name!=null"> name=#{name}, </if> <if test="age!=null"> age=#{age}, </if> </trim> where id=#{id} </update>
注意这种情况,我们剔除了一个后缀, 同时追加了一个前缀 。
Foreach 元素
另一个动态 SQL 经常使用到的功能是集合迭代,通常用在 in条件句
foreach 元素非常强大,允许您指定一个集合,申明能够用在元素体内的项和索引变量。也 允许您指定开始和结束的字符,也可以加入一个分隔符到迭代器之间。这个元素的聪明之处在于 它不会意外地追加额外的分隔符。
<select id="findStudentByAge" resultMap="studentInfo"> select * from t_student where age in <foreach collection="list" item="item" open="(" separator="," close=")"> #{item} </foreach> </select>
测试方法如下:
public void findStudentByAge() { SqlSession sqlSession = null; try { sqlSession = MyBatisUtil.getsqlSession(); StudentDao studentDao = sqlSession.getMapper(StudentDao.class); List<Integer> list= new ArrayList<Integer>(); list.add(21); list.add(23); List<Student> liststudent =studentDao.findStudentByAge(list); System.out.println(liststudent); } catch (Exception e) { e.printStackTrace(); } }
输出的sql结果:select * from t_student where age in (item,item),显示age为21、23的学生信息。
Settings 元素
Setting 元素下是些非常重要的设置选项,用于设置和改变 MyBatis 运行中的行为。下面的 表格列出了 Setting 元素支持的属性、默认值及其功能。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vuQc9cUw-1576746278488)(E:\javaEE笔记\img\QQ浏览器截图20191218153217.png)]
完整配置例子:
<settings> <setting name="cacheEnabled" value="true"/> <setting name="lazyLoadingEnabled" value="true"/> <setting name="multipleResultSetsEnabled" value="true"/> <setting name="useColumnLabel" value="true"/> <setting name="useGeneratedKeys" value="false"/> <setting name="enhancementEnabled" value="false"/> <setting name="defaultExecutorType" value="SIMPLE"/> <setting name="defaultStatementTimeout" value="25000"/> </settings>
XML 中的特殊字符
如果 MyBatis 使用 XML 配置,那不可避免地会遇到一些对 XML 来说是特殊的字符。如小于号 “<”,因为 XML 解析器会认为是一个新元素的开始,因此要进行转义。这里有两个方法:
1 使用转义实体
下面是五个在 XML 文档中预定义好的转义实体 :
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
<select id="findStudentList" parameterType="hashmap" resultMap="studentInfo"> select * from t_student where age $lt; 23 </select>
2 使用 CDATA 部件
一个 CDATA 部件以"“标记结束。在”"之间 的特殊字符的意义都不起作用,而转变为普通字符串内容。
一般地,在 MyBatis 的 XML 映射语句配置文件中,如果 SQL 语句有特殊字符,那么使用 CDTA 部件括起来,如:
<select id="findStudentList" parameterType="hashmap" resultMap="studentInfo"> <![CDATA[ select * from t_student where age = 23 ]]> </select>
而在动态 SQL 各元素的测试语句中,在元素的属性中不能再嵌套其它元素或包含 CDATA 部 件,因此只能使用转义实体, 如:
<select id="selectAuthor_use_where" parameterType="Blog" resultType="Author"> select * from author <where> <if test="authorId != null and authorId >= 1 and authorId <= 5"> id = #{authorId} </if> </where> </select>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍自己动手实现mybatis动态sql的方法,包括了自己动手实现mybatis动态sql的方法的使用技巧和注意事项,需要的朋友参考一下 发现要坚持写博客真的是一件很困难的事情,各种原因都会导致顾不上博客。本来打算写自己动手实现orm,看看时间,还是先实现一个动态sql,下次有时间再补上orm完整的实现吧。 用过mybatis的人,估计对动态sql都不陌生,如果没有用过,就当看看热闹吧。
本文向大家介绍MyBatis中动态sql的实现方法示例,包括了MyBatis中动态sql的实现方法示例的使用技巧和注意事项,需要的朋友参考一下 1. 动态sql 动态sql是mybatis中的一个核心,什么是动态sql? 动态sql即对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。 MyBatis的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的
本文向大家介绍Mybatis4 之Mybatis动态sql的实现代码,包括了Mybatis4 之Mybatis动态sql的实现代码的使用技巧和注意事项,需要的朋友参考一下 1.什么是动态SQL 传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个空格,都会导致错误。Mybatis的动态SQL功能正是为了解决这种问题, 其通过 if, choose, wh
本文向大家介绍MyBatis动态SQL实现配置过程解析,包括了MyBatis动态SQL实现配置过程解析的使用技巧和注意事项,需要的朋友参考一下 动态SQL 什么是动态SQL: 动态SQL就是根据不同的条件生成不同的SQL语句 if choose(when,otherwise) trim(where,set) foreach 1、搭建环境 建表 创建一个基础工程 导包 编写配置文件 编写实体类
本文向大家介绍Mybatis动态SQL实例详解,包括了Mybatis动态SQL实例详解的使用技巧和注意事项,需要的朋友参考一下 动态SQL 什么是动态SQL? MyBatis的官方文档中是这样介绍的? 动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列
本文向大家介绍MyBatis拦截器实现分页功能的实现方法,包括了MyBatis拦截器实现分页功能的实现方法的使用技巧和注意事项,需要的朋友参考一下 MyBatis拦截器实现分页功能的实现方法 前言: 首先说下实现原理。使用拦截器拦截原始的sql,然后加上分页查询的关键字和属性,拼装成新的sql语句再交给mybatis去执行。 除了业务代码之外,需要写的东西不多,提几个关键的: 1、分页对象Page