mybatis的动态sql
2017-11-27 20:16
239 查看
动态sql
可以参考http://www.mybatis.org/mybatis-3/zh/dynamic-sql.htmlMyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。
通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中。
动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半的元素就可以了。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。
If(XML中)
判断条件是否满足如果满足自动凭拼接到主sql语句中
动态 SQL 通常要做的事情是有条件地包含 where 子句的一部分。比如:<select id="queryStudentById" resultType="student"> select * from student where 1=1 <if test="sName!=null"> and sname like '%${sname}%' </if> <if test="adress!=null"> and adress like '%${adress}%' </if> </select> Where(XML中)
自动判断第一个条件是否有where,如果有就去掉where,没有就追加where,同时去掉第一个and
<select id="queryStudentById1" resultType="student"> select * from student <where> <if test="sName!=null"> and sname like '%${sname}%' </if> <if test="adress!=null"> and adress like '%${adress}%' </if> </where> </select>
Trim
trim应用灵活度更高,有一些属性如下吗,通常都是成对使用prefix="" 配置的参数会被添加在sql语句开始的地方
prefixOverrides=""sql语句首次出现的参数会被覆盖
suffix="" 添加在sql语句结尾
suffixOverrides="" sql语句结尾的参数会被覆盖
例如:将第一个and覆盖为where
<select id="queryStudentById1" resultType="student"> select * from student <trim prefix="where" prefixOverrides="and"> <if test="sName!=null"> and sname like '%${sname}%' </if> <if test="adress!=null"> and adress like '%${adress}%' </if> </trim> </select>
Set
动态去掉最后一个条件的“,”如果最后sql语句中有一个有“,”就会去掉,还会自动添加set字段
用trim的后两个属性可以实现set.
<trimsuffix="" suffixOverrides=","></trim>
例如
<update id="testUpdate"> update student <set> sex=#{sex}, sname=#{sname}, age=#{age}, </set> where sid=#{sid} </update>
Foreach
例如:select * from student wheregid in(0,1,2)
表示查询gid是0,1,2的学生,可以用foreach来代替
foreach
open表示循环开始之前追加的sql
close表示循环结束之后追加的sql
collection指定传入的值 的集合
separator非最后一次的循环值上添加分隔符,
item表示每一次循环被存储的变量名
例如:
<select id="queryAnyGrad"> select * from student <foreach item="gid" collection="gradeList" open="where gid in(" close=")" separator=","> ${gid} </foreach> </select>
在注解中实现动态sql(select查询)
自己用的两种方式(自己用来看,一般使用第二个内部类),下面是个小例子,具体的语句不做详细介绍
//一个内部类,用来提供sql static class studentProvide{ public String studentById(Map map){ Student student=(Student)map.get("stu"); String sql="select * from student where 1=1"; if(student.getsName()!=null && !"".equals(student.getsName())){ student.setsName("%"+student.getsName()+"%"); sql+=" and sname like ${stu.sName}"; } if(student.getAdress()!=null && !"".equals(student.getAdress())){ student.setAdress("%"+student.getAdress()+"%"); sql+=" and adress like ${stu.adress}"; } return sql; } } //提供sql语句的类(这里是个内部类) static class studentProvide1{ public String studentById(Map map){ Student student=(Student)map.get("stu"); SQL sql=new SQL(); sql.SELECT("*").FROM("student"); if(student.getsName()!=null && !"".equals(student.getsName())){ student.setsName("%"+student.getsName()+"%"); sql.WHERE(" and sname like ${stu.sName}"); } if(student.getAdress()!=null && !"".equals(student.getAdress())){ student.setAdress("%"+student.getAdress()+"%"); sql.AND(); sql.WHERE(" and adress like ${stu.adress}"); } return sql.toString(); } } @SelectProvider(type=studentProvide.class,method="studentById") public List<Student> queryStudentById(@Param("stu") Student student);
相关文章推荐
- mybatis系列-动态 SQL(四)
- 【JavaEE】之MyBatis动态SQL
- MyBatis动态SQL
- MyBatis SQL语句动态传入参数作表名。
- MyBatis-动态sql与模糊查询 -07
- Mybatis的动态sql语句if和choose
- Mybatis之动态 SQL
- MyBatis中实现动态的SQL语句,分页以及mybatis的常用的配置
- Mybatis学习总结之动态SQL与模糊查询
- MyBatis参数传入集合之foreach动态sql
- MyBatis的动态SQL详解
- MyBatis基础:MyBatis动态SQL(3)
- ssm的mybatis的动态SQL语句
- MyBatis参数传入集合之foreach动态sql
- Mybatis的动态SQL实现
- Mybatis 动态SQL和关联映射
- MyBatis-动态SQL的if、choose、when、otherwise、trim、where、set、foreach使用
- Mybatis学习(4)输入映射、输出映射、动态sql
- Mybatis动态SQL与模糊查询
- MyBatis动态SQL底层原理分析 与 JavaScript中的Date对象,以及UTC、GMT、时区的关系