本文整理自网络,侵删。
目录
- 情景:
- 概述:
- SQL元素:
- <if>:
- <choose>:
- <where>:
- <trim>:
- <set>:
- <foreach>:
- <bind>:
情景:
我们在使用JDBC或者其他类似的框架开发进行数据库开发时,通常要根据需求动手组装SQL,不用想都觉得是件很痛苦的事情了,而Mybatis框架提供的对SQL语句动态组装的功能,能很好地解决这个麻烦。
概述:
动态SQL是MyBatis框架的一个强大特性,MyBatis3可采用功能强大的基于OGNL的表达式来完成动态SQL,它删除了之前版本中需要了解的大多数元素,只使用不到原来一半的元素就能完成所需的工作。
SQL元素:
SQL元素 | 说明 |
---|---|
<if> | 判断语句,用于单条件分支判断 |
<choose> (<when>,<otherwise>) | 相当于Java中的switch...case...default语句,用于多条件分支判断 |
<where> | 简化SQL语句中的where的条件判断 |
<trim> | 可以灵活地去除多余的关键字 |
<set> | 解决动态更新语句 |
<foreach> | 循环语句,常用于in语句等列举条件中 |
<bind> | 从OGNL表达式中创建一个变量,并将其绑定到上下文,常用于模糊查询的SQL中 |
<if>:
使用动态 SQL 最常见情景是根据条件包含 where 子句的一部分
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.example.mapper.BookMapper"> <resultMap id="BookType" type="org.example.po.Book"> <id property="id" column="id"></id> <result property="bookName" column="bookName"></result> <result property="price" column="price"></result> <result property="publisher" column="publisher"></result> </resultMap> <select id="bookSelectById" parameterType="int" resultMap="BookType"> select * from t_book <where> <if test="id!=null and id!=''"> id=#{id} </if> </where> </select> <select id="bookSelectByname" parameterType="string" resultMap="BookType"> select * from t_book <where> <if test="bookNmae!=null and bookName!=''"> bookName LIKE concat('%',#{bookName},'%') </if> </where> </select> </mapper>
<choose>:
有时候,我们不想使用所有的条件,而只是想从多个条件中选择一个使用。针对这种情况,MyBatis 提供了 choose 元素,它有点像 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>
<where>:
<where>标签相当于 where 1=1 ,主要用来简化SQL语句中的where条件判断,并能智能地处理and和or不必担心多余关键字导致的语法错误。代码参考<if>标签代码。
<trim>:
这个标签我觉得是最灵活的,trim元素也会自动识别其标签内是否有返回值,若有的话,则会在已包含的内容前加上某些前缀或者后缀(先判断是否有语句包含),用到的属性是
1、prefix(前缀),suffix(后缀)
还可以把包含内容的首内容或尾内容的符号去掉,用到的属性是
2、prefixOverride(前缀覆盖),suffixOverride(后缀覆盖)
相关阅读 >>
sql中where变量is null条件导致全表扫描问题的解决方法
更多相关阅读请进入《sql》频道 >>
数据库系统概念 第6版
机械工业出版社
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。
转载请注明出处:木庄网络博客 » MyBatis超详细讲解动态SQL的实现
相关推荐
评论
管理员已关闭评论功能...