Mybatis、ibatis动态SQL问题
2017-04-07 16:44
381 查看
使用JDBC一个非常普遍的问题就是动态SQL。使用参数值、参数本身和数据列都是动态SQL,通常是非常困难的。典型的解决办法就是用上一堆 的IF-ELSE条件语句和一连串的字符串连接。对于这个问题,Ibatis提供了一套标准的相对比较清晰的方法来解决一个问题,这里有个简单的例子:
上面的例子中,根据参数bean“id”属性的不同情况,可创建两个可能的语句。如果参数“id”大于0,将创建下面的语句:
或者,如果“id”参数小于等于0,将创建下面的语句:
以上的这个例子是否可以看出Ibatis里提供的简单的写法来实现了复杂拖沓的动态SQL呢?我们在做查询的时候,对于同一个表,甚至可以用来定义一个动态SQL,做到重用的地步,还是上面那个例子:
举个小例子:
(2)、一元条件元素:一元条件元素检查属性的状态是否符合特定的条件。
检查Collection.size()的值,属性的String或String.valueOf()值,是否不为null或不为空(“”或size() > 0)
小例子:
(3)、其他元素条件
遍历类型为java.util.List的元素。
例子:
注意:使用时,在List元素名后面包括方括号[]非常重要,方括号[]将对象标记为List,以防解析器简单地将List输出成String。
<select id="getUserList" resultMap="user"> select * from user <isGreaterThan prepend="and" property="id" compareValue="0"> where user_id = #userId# </isGreaterThan> order by createTime desc </select>
上面的例子中,根据参数bean“id”属性的不同情况,可创建两个可能的语句。如果参数“id”大于0,将创建下面的语句:
select * from user where user_id = ? order by createTime desc
或者,如果“id”参数小于等于0,将创建下面的语句:
select * from user order by createTime desc
以上的这个例子是否可以看出Ibatis里提供的简单的写法来实现了复杂拖沓的动态SQL呢?我们在做查询的时候,对于同一个表,甚至可以用来定义一个动态SQL,做到重用的地步,还是上面那个例子:
<sql id="queryCondition"> <dynamic prepend="WHERE"> <isGreaterThan prepend="and" property="id" compareValue="0"> where user_id = #userId# </isGreaterThan> </dynamic> </sql> <select id="getUserList" resultMap="user"> select * from user <!-- 引入动态的查询条件 --> <include refid="queryCondition"/> order by createTime desc </select>
这个使用的话是否更加的具有公用性能,这就是Ibatis带来的便利。 在Ibatis中,动态的条件元素包含一下几种:二元条件元素、一元条件元素和其他条件元素: (1)、二元条件元素:将一个属性值和静态值或另一个属性值比较,如果条件为真,元素将被包容在查询SQL语句中。 二元条件元素的属性: perpend——可被覆盖的SQL语句组成部分,添加在语句的前面(可选) property——是比较的属性(必选) compareProperty——另一个用于和前者比较的属性(必选或选择compareValue) compareValue——用于比较的值(必选或选择compareProperty) <isEqual> 比较属性值和静态值或另一个属性值是否相等。 <isNotEqual> 比较属性值和静态值或另一个属性值是否不相等。 <isGreaterThan> 比较属性值是否大于静态值或另一个属性值。 <isGreaterEqual> 比较属性值是否大于等于静态值或另一个属性值。 <isLessThan> 比较属性值是否小于静态值或另一个属性值。 <isLessEqual>比较属性值是否小于等于静态值或另一个属性值。
举个小例子:
<isLessEqual prepend=”AND” property=”age” compareValue=”18”> ADOLESCENT = ‘TRUE’ </isLessEqual>
如果大于等18岁时,则为成年人
(2)、一元条件元素:一元条件元素检查属性的状态是否符合特定的条件。
一元条件元素的属性: prepend——可被覆盖的SQL语句组成部分,添加在语句前面(可选) property——被比较的属性(必选) <isPropertyAvailable> 检查是否存在该属性(存在parameter bean的属性) <isNotPropertyAvailable> 检查是否不存在该属性(不存在parameter bean的属性) <isNull> 检查属性是否为null <isNotNull> 检查属性是否不为null <isEmpty> 检查Collection.size()的值,属性的String或String.valueOf()值,是否为null或空(“”或size() < 1)
检查Collection.size()的值,属性的String或String.valueOf()值,是否不为null或不为空(“”或size() > 0)
小例子:
<isNotEmpty prepend="AND" property="firstName" > FIRST_NAME=#firstName#
(3)、其他元素条件
(a).Parameter Present:这些元素检查参数对象是否存在 Parameter Present条件的属性 prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选) <isParameterPresent> 检查是否存在参数对象(不为null) <isNotParameterPresent> 例子: <isNotParameterPresent prepend=”AND”> EMPLOYEE_TYPE = ‘DEFAULT’ </isNotParameterPresent> (b)、Iterate:这属性遍历整个集合,并为List集合中的元素重复元素体的内容。 Iterate的属性: prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选) property - 类型为java.util.List的用于遍历的元素(必选) open - 整个遍历内容体开始的字符串,用于定义括号(可选) close -整个遍历内容体结束的字符串,用于定义括号(可选) conjunction - 每次遍历内容之间的字符串,用于定义AND或OR(可选)
遍历类型为java.util.List的元素。
例子:
<iterate prepend="AND" property="userNameList" open="(" close=")" conjunction="OR"> username=#userNameList[]# </iterate>
注意:使用时,在List元素名后面包括方括号[]非常重要,方括号[]将对象标记为List,以防解析器简单地将List输出成String。
相关文章推荐
- MyBatis 和 ibatis的动态SQL语句配置符号,不兼容大于号、小于号等特殊符号问题 X
- MyBatis 和 ibatis的动态SQL语句配置符号,不兼容大于号、小于号等特殊符号问题
- ibatis如果查看动态sql语法正确,但是没有返回值问题定位
- MyBatis 动态拼接Sql字符串的问题
- MyBatis动态sql问题
- ssm项目使用Mybatis动态拼接sql语句,生成的sql中文全部显示为???的问题(配置文件sql语句中文解析问题)
- 关于mybatis插件tk.mybatis生成的动态sql语句字段不加``的问题
- mybatis+0+null--------------mybatis中stutas==0是sql动态语句拼接问题
- mybatis动态sql参数为实体类时出现的问题
- MyBatis解决Update动态SQL逗号的问题
- mybatis(ibatis)中的动态sql<dynamic prepend="where"><isNotEmpty>的讲解
- Ibatis 中关于sql动态传值问题
- mybatis中修改数据库单一数据时,连带清空其他数据的问题【动态sql】
- mybatis(四)动态拼sql以及不反序列化问题
- mybatis动态sql解决关于There is no getter for property named 'certitype'错误问题
- ibatis中动态查询返回字段返回用resultClass="java.util.HashMap" Java.sql.SQLException: 列名无效的问题
- MyBatis 动态SQL的单参数不执行问题
- SSM框架day02-MyBatis——034——符合查询问题演示、035——动态SQL
- 有关在ibatis中动态拼写SQL,查询多次后结果不同的问题
- Mybatis:关于动态生成sql语句的一些问题