`
wjjbfq
  • 浏览: 82088 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

iBATIS动态映射浅析

阅读更多
    iBATIS动态映射是怎么回事呢?下面我们通过这篇文档向你介绍实际操作中iBATIS动态映射的情况。

     

    iBATIS动态映射都是用在复杂查询过程中,我们常常需要根据用户的选择决定查询条件,这里发生变化的并不只是SQL 中的参数,包括Select 语句中所包括的字段和限定条件,都可能发生变化。典型情况,如在一个复杂的组合查询页面,我们必须根据用户的选择和输入决定查询的条件组合。

    iBATIS动态映射的一个典型的页面如下:

    对于这个组合查询页面,根据用户选择填写的内容,我们应为其生成不同的查询语句。如用户没有填写任何信息即提交查询请求,我们应该返回所有记录:

    Select * from t_user;

    如用户只在页面上填写了姓名“Erica”,我们应该生成类似:

    Select * from t_user where name like ‘%Erica%’ ;的SQL查询语句。

    如用户只在页面上填写了地址“Beijing”,我们应该生成类似:

    Select * from t_user where address like ‘%Beijing%”;的SQL。

    而如果用户同时填写了姓名和地址(”Erica”&’Beijing’),则我们应生成类似:

    Select * from t_user where name like ‘%Erica%’ and address like ‘%Beijing%”的SQL查询语句。

    对于iBATIS 这样需要预先指定SQL 语句的ORM 实现而言,传统的做法无非通过if-else 语句对输入参数加以判定,然后针对用户选择调用不同的statement 定义。对于上面这种简单的情况(两种查询条件的排列组合,共4 种情况)而言,statement 的重复定义工作已经让人不厌其烦,而对于动辄拥有七八个查询条件,乃至十几个查询条件

    的排列组合而言,琐碎反复的statement定义实在让人不堪承受。

    考虑到这个问题,iBATIS引入了动态映射机制,即在statement定义中,根据不同的

    iBATIS动态映射查询参数,设定对应的SQL语句。

    还是以上面的示例为例:

    select

    id,

    name,

    sex

    from t_user

    (name like #name#)

    (address like #address#)

    通过dynamic 节点,我们定义了一个动态的WHERE 子句。此WHERE 子句中将

    可能包含两个针对name 和address 字段的判断条件。而这两个字段是否加入检索取决于用户所提供的查询条件(字段是否为空[isNotEmpty])。

    对于一个典型的Web程序而言,我们通过HttpServletRequest获得表单中的字段名并将其设入查询参数,如:

    user.setName(request.getParameter("name"));

    user.setAddress(request.getParameter("address"));

    sqlMap.queryForList("User.getUsers", user);

    在执行queryForList("User.getUsers", user)时,ibatis 即根据配置文

    件中设定的SQL动态生成规则,创建相应的SQL语句。

    上面的示例中,我们通过判定节点isNotEmpty,指定了关于name 和address 属

    性的动态规则:

    (name like #name#)

    这个节点对应的语义是,如果参数类的"name"属性非空(isNotEmpty,即非空

    字符串””),则在生成的SQL Where字句中包括判定条件(name like #name#),其

    中#name#将以参数类的name属性值填充。

    Address属性的判定生成与name属性完全相同,这里就不再赘述。

    这样,我们通过在statement 定义中引入dynamic 节点,很简单的实现了SQL 判定子句的动态生成,对于复杂的组合查询而言,这将带来极大的便利。判定节点的定义可以非常灵活,我们甚至可以使用嵌套的判定节点来实现复杂的动态映射,如:

    ( name=#name#address=#address#)

    这段定义规定,只有用户提供了姓名信息时,才能结合地址数据进行查询(如果只提供地址数据,而将姓名信息忽略,将依然被视为全检索)。Dynamic节点和判定节点中的prepend属性,指明了本节点中定义的SQL子句在

    主体SQL中出现时的前缀。如:

    (name like #name#)

    (address like #address#)

    假设"name"属性的值为“Erica”, "address"属性的值为“Beijing”,则会生成类似下面的SQL子句(实际运行期将生成带占位符的PreparedStatement,之后再为其填充数据):

    WHERE (name like ‘Beijing’) AND (address like ‘Beijing’)

    其中WHERE 之后的语句是在dynamic 节点中所定义,因此以dynamic 节点的prepend设置("WHERE")作为前缀,而其中的”AND”,实际上是address属性所对应的isNotEmpty节点的prepend设定,它引领了对应节点中定义的SQL子句。至于name属性对应的isNotEmpty节点,由于iBATIS会自动判定是否需要追加prepend前缀,这里(name like #name#)是WHERE 子句中的第一个条件子句,无需AND 前缀,所以自动省略。

    判定节点并非仅限于isNotEmpty,iBATIS中提供了丰富的判定定义功能。判定节点分两类:

    Ø 一元判定

    一元判定是针对属性值本身的判定,如属性是否为NULL,是否为空值等。

    上面示例中isNotEmpty就是典型的一元判定。

    一元判定节点有:

    节点名 描述

    参数类中是否提供了此属性

    与相反

    属性值是否为NULL

    与相反

    如果属性为Collection或者String,其size是否 与相反。

    Ø 二元判定

    二元判定有两个判定参数,一是属性名,而是判定值,如

    (age=#age#)

    其中,property="age"指定了属性名”age”,compareValue=”18”指明了判定值为”18”。上面判定节点isGreaterThan 对应的语义是:如果age 属性大于18(compareValue),则在SQL中加入(age=#age#)条件。

    二元判定节点有:

    节点名 属性值与compareValues的关系

    相等。

    不等。

    大于。

    大于等于。

    小于。

    小于等于。

    iBATIS动态映射的情况我们就介绍到这里,希望这篇关于iBATIS动态映射的文档对你认识iBATIS动态映射有帮助。

分享到:
评论

相关推荐

    iBATIS教程之快速入门浅析

    iBATIS 是一款轻量级的Java持久层框架,它主要负责对象关系映射(Object-Relational Mapping,简称O/R Mapping),使得开发者可以将关注点集中在业务逻辑上,而无需过多地处理数据库操作的细节。与Hibernate等其他...

    iBATIS教程之入门浅析借鉴.pdf

    iBATIS是一个Java编程语言中的持久层框架,它提供了一种半自动化的方式来处理ORM(对象关系映射)。与Hibernate和Apache OJB等一站式ORM解决方案不同,iBATIS允许开发者更自由地控制SQL查询,提供了更高的灵活性。这...

    ibatis 学习资料

    3. **iBATIS的多对多映射配置浅析 - 51CTO_COM.mht**:这份资料可能详细解析了iBatis中的多对多映射配置。在处理多对多关系时,iBatis使用标签来建立中间表的关系,实现关联对象的自动加载。 4. **iBATIS.pdf**:这...

    浅析Spring和MyBatis整合及逆向工程

    值得注意的是,早期的ibatis与Spring的整合由Spring官方提供,但现在MyBatis已经提供了与Spring的整合支持。 整合配置是整个过程中关键的一步。首先,我们需要在`applicationContext.xml`中配置SqlSessionFactory和...

    struts入门教程

    2. **配置文件**:Struts2的配置主要通过`struts.xml`文件实现,该文件用于定义各种配置信息,如Action映射、拦截器、结果类型等,是框架运行的基础。 3. **Action配置**:Action是Struts2中的业务逻辑处理单元,...

    Struts2轻松入门,合适入门的朋友。

    IBATIS是一个流行的持久层框架,Struts2可以通过简单的配置来与IBATIS进行集成。 #### 13.1 集成HIBERNATE HIBERNATE是一个强大的对象关系映射(ORM)框架,可以轻松地与Struts2集成,提供数据库操作的支持。 ###...

    struts2入门教程

    - **配置文件详解**:解析`struts.xml`配置文件的作用和编写方式,如何配置Action映射、拦截器栈等。 - **Action配置**:讲解如何定义Action类,Action的生命周期,以及如何返回不同的结果。 #### 四、表单验证 - *...

    网络第一份struts2.0学习文档

    - 支持动态属性绑定。 - 自动表单填充。 #### 九、表达式OGNL - **OGNL概述**: - OGNL(Object-Graph Navigation Language)是一种强大的表达式语言。 - 用于获取或设置对象的属性值。 - **OGNL基础**: - ...

    Struts2入门教程.pdf

    - **集成iBatis**:探索Struts2与iBatis的集成方案。 - **集成jQuery**:介绍jQuery在Struts2中的应用,包括CSS操作、DOM操作等内容。 #### 十三、案例分析 - **投票管理系统**:通过具体的案例分析,展示了Struts...

    struts2经典入门教程

    2. 配置文件:Struts2框架的配置文件主要有struts.xml文件,它定义了Action映射和结果类型等信息,用于引导请求和响应的处理流程。 3. Action配置:Action是Struts2的核心,主要负责业务逻辑的处理和返回结果。...

    轻松入门之Struts2

    #### 十、视图技术浅析 Struts2支持多种视图技术,如JSP、FreeMarker等,可以根据具体需求选择合适的视图技术。 #### 十一、与其他框架的集成 Struts2可以很容易地与其他Java EE框架集成,如Spring和Hibernate。...

Global site tag (gtag.js) - Google Analytics