`

MyBatis动态sql问题

阅读更多
接使用JDBC一个非常普遍的问题就是动态SQL。使用参数值、参数本身和数据列都是动态SQL,通常是非常困难的。典型的解决办法就是用上一堆 的IF-ELSE条件语句和一连串的字符串连接。对于这个问题,Ibatis提供了一套标准的相对比较清晰的方法来解决一个问题,这里有个简单的例子:

     <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)
<isNotEmpty> 检查Collection.size()的值,属性的String或String.valueOf()值,是否不为null或不为空(“”或size() > 0)

小例子:

    <isNotEmpty prepend="AND" property="firstName" >
           FIRST_NAME=#firstName#
   </isNotEmpty>

   (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(可选)
<iterate> 遍历类型为java.util.List的元素。
例子:
<iterate prepend="AND"  property="userNameList"
open="(" close=")" conjunction="OR">
username=#userNameList[]#
</iterate>
注意:使用<iterate>时,在List元素名后面包括方括号[]非常重要,方括号[]将对象标记为List,以防解析器简单地将List输出成String。
分享到:
评论

相关推荐

    mybatis动态sql.zip

    mybatis动态sql,动态sql解析引擎,类似mybatis动态sql的功能。 mybatis动态sql,动态sql解析引擎,类似mybatis动态sql的功能。mybatis动态sql,动态sql解析引擎,类似mybatis动态sql的功能。mybatis动态sql,...

    mybatis 动态sql及参数传递

    在实际开发过程中,我们往往需要编写复杂的SQL语句,拼接稍有不注意就会导致错误,Mybatis给开发者提供了动态SQL,大大降低了拼接SQL导致的错误。 动态标签 if标签 if标签通常用那个胡where语句,update语句,insert...

    mybatis动态sqlmybatis动态sqlmybatis动态sql

    mybatis动态sql MyBatis是一种开源的持久层框架,它为Java程序员提供了一种简化数据库访问的方式。其中,动态SQL是MyBatis的一个重要特性,它允许用户根据不同的条件拼接SQL语句,从而实现更加灵活和可扩展的数据库...

    mybatis动态SQL语句

    if 、where、set、trim、choose 、foreach等在mybatis中的具体用法,有具体实例可供参考,玩转mybatis

    mybatis动态sql上传

    mybatis动态sql批量增删改查,增强了mybatis的认识。

    什么是mybatis动态sql以及学习mybatis动态sql的意义

    mybatis动态sql

    MyBatis 动态 SQL 示例

    附件是MyBatis 动态 SQL 示例,MyBatis 是一个持久层框架,它允许用户在 XML 文件中编写动态 SQL 语句。MyBatis 的动态 SQL 功能非常强大,它允许开发者根据运行时的条件动态地生成 SQL 语句。这使得 MyBatis 能够...

    MyBatis 动态SQL示例

    附件是MyBatis 动态SQL示例,MyBatis 是一个持久层框架,它允许用户在 XML 文件中编写动态 SQL 语句。MyBatis 的动态 SQL 功能非常强大,它允许开发者根据运行时的条件动态地生成 SQL 语句。这使得 MyBatis 能够灵活...

    mybatis之动态SQL

    mybatis之动态SQL

    MyBatis动态SQL.pdf

    MyBatis框架通过其独特的动态SQL机制,极大地简化了这一过程。本文将详细介绍MyBatis动态SQL的概念、工作原理以及在实际开发中的应用。 MyBatis动态SQL是一种基于条件的SQL构建方式。它允许开发者在XML映射文件中...

    MyBatis动态SQL:构建灵活查询的利器.md

    内容概要:本文介绍了MyBatis动态SQL的基本概念、常用标签和使用技巧,帮助读者了解如何构建灵活的查询语句。 使用人群:适用于使用MyBatis框架进行数据库操作的开发者,尤其是需要构建复杂查询逻辑的开发者。 ...

    mybatis慢SQL插件

    基于mybatis的慢SQL小插件,原理是mybatis拦截器。只需要在springboot的配置文件做简单的配置,mybatis拦截器将SQL中所有参数自动做了填充。拦截器监控慢SQL并将完整的可执行的SQL语句打印在日志文件中,复制该SQL...

    MyBatis动态拼接SQL

    MyBatis动态拼接SQL

    mybatis动态SQL的详所有细用法代码。经过测试

    这是一个测试,专门测试Mybatis的动态sql。里面包含了所有的动态sql的用法,全部用代码形式描述出来,并给与适当的注释。

    Mybatis动态sql

    Mybatis动态SQL实现,详细,简单,!

    MyBatis动态SQL,MyBatis批量插入(Oracle数据库)[收集].pdf

    MyBatis动态SQL,MyBatis批量插入(Oracle数据库)[收集].pdf

    mybatis动态sql语句详解

    mybatis动态sql

    mybatis动态sql的一些相关资源

    MyBatis动态SQL是一种强大的特性,它允许开发人员根据条件动态地构建SQL语句,从而极大地提高了SQL语句的复用性和灵活性。在传统的JDBC或其他类似框架中,开发人员通常需要手动拼接SQL语句,这不仅工作量大,而且...

    mybatis动态sql及其JAVA示例

    mybatis动态sql

Global site tag (gtag.js) - Google Analytics