`
lqy_2019
  • 浏览: 19190 次
  • 性别: Icon_minigender_2
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

ibatis联表查询

阅读更多
修改ibator代码生成的代码,实现多表关联查询(实现方法)

1.      public static class Criteria{}静态内部类的修改

增加属性criteriaJoinTableName、criteriaJoinTableColumn

修改isValid方法

增加方法:public void addJoinTable(String tableName);

          public void addJoinTableColumn(String expression);

具体如下:




public List criteriaWithoutValue;

    public List criteriaWithListValue;

    public List criteriaWithSingleValue;

    public List criteriaWithBetweenValue;

    public List criteriaJoinTableName;

    public List criteriaJoinTableColumn;



    public boolean isValid(){

       return criteriaWithoutValue.size() > 0

              || criteriaWithSingleValue.size() > 0

              || criteriaWithListValue.size() > 0

              || criteriaWithBetweenValue.size() > 0

              || criteriaJoinTableColumn.size() > 0;

    }

/**

     * <p>方法名称: addJoinTable|描述: 增加关联表</p>

     * @param tableName 关联表名

     */

    public void addJoinTable(String tableName){

       if(criteriaJoinTableName==null){

           criteriaJoinTableName = new ArrayList();

       }

       criteriaJoinTableName.add(tableName);

    }

    /**

     * <p>方法名称: addJoinTableColumn|描述: 增加关联关系</p>

     * @param expression 关联表达式

     */

    public void addJoinTableColumn(String expression){

       if(criteriaJoinTableColumn == null){

           criteriaJoinTableColumn = new ArrayList();

       }

       criteriaJoinTableColumn.add(expression);

    }




2.       sqlMap配置文件的修改

主要修改查询条件字句:ibatorgenerated_Example_Where_Clause




<sql id="ibatorgenerated_Example_Where_Clause">

    <!--

       WARNING - This element is automatically generated by Apache iBATIS ibator, do not modify.

    -->

    <iterate property="oredCriteria">

       <isNotEmpty

           property="oredCriteria[].criteriaJoinTableName">

           <iterate conjunction="," prepend=","

              property="oredCriteria[].criteriaJoinTableName">

              $oredCriteria[].criteriaJoinTableName[]$

           </iterate>

       </isNotEmpty>

    </iterate>

    <iterate property="oredCriteria" conjunction="or"

       prepend="where" removeFirstPrepend="iterate">

       <isEqual property="oredCriteria[].valid"

           compareValue="true">

           (

           <iterate conjunction="and" prepend="and"

              property="oredCriteria[].criteriaJoinTableColumn">

              $oredCriteria[].criteriaJoinTableColumn[]$

           </iterate>

           <iterate prepend="and"

              property="oredCriteria[].criteriaWithoutValue" conjunction="and">

              $oredCriteria[].criteriaWithoutValue[]$

           </iterate>

           <iterate prepend="and"

              property="oredCriteria[].criteriaWithSingleValue"

              conjunction="and">

              $oredCriteria[].criteriaWithSingleValue[].condition$

              #oredCriteria[].criteriaWithSingleValue[].value#

           </iterate>

           <iterate prepend="and"

              property="oredCriteria[].criteriaWithListValue"

              conjunction="and">

              $oredCriteria[].criteriaWithListValue[].condition$

              <iterate

                  property="oredCriteria[].criteriaWithListValue[].values" open="("

                  close=")" conjunction=",">

                  #oredCriteria[].criteriaWithListValue[].values[]#

              </iterate>

           </iterate>

           <iterate prepend="and"

              property="oredCriteria[].criteriaWithBetweenValue"

              conjunction="and">

              $oredCriteria[].criteriaWithBetweenValue[].condition$

              #oredCriteria[].criteriaWithBetweenValue[].values[0]#

              and

              #oredCriteria[].criteriaWithBetweenValue[].values[1]#

           </iterate>

           )

       </isEqual>

    </iterate>

</sql>




使用配置

1.       配置对应的的sqlMap配置文件,仿照【sqlMap配置文件的修改】示例,将那两段代码拷贝到相应的位置(只是增加,没有修改!!!!)

2.       调用addJoinTable和addJoinTableColumn方法,进行表连接查询。

示例:关联V_ORGAN_USER_INFO表进行查询。关联关系为,主表指定字段和V_ORGAN_USER_INFO表的ORGAN_ID进行关联




public void addCriterionWithUserId(String user_id, String organKey){

    if(user_id == null){

       throw new RuntimeException("Value for condition cannot be null");

    }

    this.addJoinTable("V_ORGAN_USER_INFO"); //关联表名

    this.addJoinTableColumn(organKey +" = V_ORGAN_USER_INFO.ORGAN_ID"); //关联关系

    this.addCriterion("V_ORGAN_USER_INFO.USER_ID = '" + user_id + "'"); //其他查询条件

}






注意问题:表之间有重名的字段。

1.       如果重名的字段出现在查询结果列中,则需要修改sqlMap中的select字句,给字段增加所属表名(最好使用表的全名,而不要给表定义别名,这样查询总数时就不用管,也会避免其它的一些问题),具体如下:




  <select id="ibatorgenerated_selectByExample"

    resultMap="ibatorgenerated_BaseResultMap"

    parameterClass="com.resoft.web.bean.T00SysLogCriteria">

    <!--

        WARNING - This element is automatically generated by Apache iBATIS ibator, do not modify.

    -->

    select T00_SYS_LOG.USER_ID, USER_ENAME, BUZI_NAME,

    EXEC_TIME,ORGAN_KEY from T00_SYS_LOG

    <isParameterPresent>

        <include

           refid="T00_SYS_LOG.ibatorgenerated_Example_Where_Clause" />

        <isNotNull property="orderByClause">

           order by $orderByClause$

        </isNotNull>

    </isParameterPresent>

  </select>




2.       如果重名的字段出现在页面的查询条件中,

则需要对XXXCriteria进行修改




public Criteria andUserIdIsNull(){

    addCriterion("T00_SYS_LOG.USER_ID is null");

    return this;

}



public Criteria andUserIdIsNotNull(){

    addCriterion("T00_SYS_LOG.USER_ID is not null");

    return this;

}



public Criteria andUserIdEqualTo(String value){

    addCriterion("T00_SYS_LOG.USER_ID =", value, "userId");

    return this;

}

。。。。。。。。。。。。。。。


3.       关联字段有重名,则要带上表名

如:this.addJoinTableColumn(organKey +" = V_ORGAN_USER_INFO.ORGAN_ID");
分享到:
评论

相关推荐

    主子表查询ibatis

    本文将深入探讨如何在iBATIS中进行主子表查询,以及涉及到的相关技术如一对多关系、日志管理库log4j等。 首先,主子表查询是数据库设计中常见的场景,通常涉及到一个“父”表(主表)和一个或多个“子”表(从表)...

    Ibatis查询语句里,可以使用多表查询

    ### iBatis 多表查询知识点详解 #### 一、iBatis简介 iBatis 是一款优秀的持久层框架,它将 SQL 映射到 Java 对象,简化了 JDBC 编程过程中的繁琐操作,提高了开发效率。iBatis 的核心功能包括 SQL 映射、动态 SQL...

    Ibatis的简单例子(增删改查,联合查询等)

    在XML映射文件中,你可以使用标签或在标签内直接编写JOIN语句,以实现多个表的数据联合查询。记得在Mapper接口中定义对应的方法。 6. **Service层和DAO层**: 在实际项目中,我们通常会创建Service层来封装业务...

    ibatis and和or联合查询 .doc

    ### ibatis and和or联合查询知识点 #### 一、ibatis简介 ibatis是一个支持普通SQL查询、存储过程以及高级映射的优秀开源数据访问框架。ibatis消除了几乎所有的JDBC对象操作,提供了一个简单的基本API,它通过XML或...

    IBatis.NET开发文档

    - 复杂查询:涉及子查询,联合查询,存储过程的调用等。 - 缓存机制:讲解iBATIS的缓存策略,如何启用和配置缓存以提高性能。 - 异常处理:介绍iBATIS抛出的异常类型及其处理方式。 - 批量操作:如何利用iBATIS...

    ibatis的的增删改查和一对一、一对多查询

    在SQL查询中,可以使用嵌套选择(`&lt;select&gt;`标签)或者联合主键(`&lt;join&gt;`标签)来关联一对一的表。 2. **一对多关系**:在一个实体类中,可能存在与多个其他实体类的关系,如一个用户有多个订单。同样,使用`...

    IBatis.pdf

    1. **复杂查询**:当需要进行复杂的数据库查询,如分页、联合查询、子查询时,IBatis 提供的 SQL 映射和动态 SQL 功能非常有用。 2. **性能优化**:通过缓存机制,可以减少对数据库的频繁访问,提高系统性能。 3. ...

    ibatis日期格式.doc

    - **问题1**: 建议优化`search`方法,使用联合查询替代多条SQL语句。iBatis支持动态SQL,可以利用`&lt;union&gt;`标签来组合多个查询,提高效率。 - **问题2**: 对于日志保存,建议进行更彻底的封装。这意味着可能需要...

    ibatis教材大全

    4. **避免N+1 Select**:通过联合查询等方式减少不必要的数据库查询次数。 5. **组合键值或多个复杂参数属性**:支持复杂的参数传递和映射逻辑。 #### 五、缓存机制 iBATIS支持多种缓存机制,包括只读缓存和可读写...

    ibatis+Spring demo

    内容包里面是源代码,运行该例子的方式就是,使用里面的sql文件还原数据库。...使用cmd进入该解压包,运行 java -jar *.jar ibatis2spring....欲了解代码的详细,请访问作者博客,搜索《ibatis + Spring 多表查询》文章。

    iBATIS实战

    9.3.4 联合使用readOnly属性和serialize属性 159 9.4 如何使用高速缓存模型中的标签 160 9.4.1 高速缓存的清除 160 9.4.2 设置高速缓存模型实现的特性 163 9.5 高速缓存模型的类型 163 9.5.1 MEMORY 163 9.5.2 LRU ...

    iBATIS缓存介绍

    iBATIS的高速缓存主要关注于提高查询性能和减少数据库负载。 **2.2 iBATIS对高速缓存管理的帮助** iBATIS提供了内置的缓存管理机制,可以帮助开发者轻松地管理和配置缓存策略。 **2.3 iBATIS高速缓存和传统O/RM...

    IBATIS.pdf

    相比之下,iBATIS更适用于那些需要高级SQL查询技巧的应用场景,如处理复杂联表查询、分页查询等。iBATIS给予开发者对SQL语句的完全控制权,这意味着开发者可以优化查询逻辑,以适应数据库设计的特殊需求,特别是在...

    ibatisDemo.rar

    例如,复杂的查询、分页或联表操作,使用Ibatis可以更加直观和高效。 四、配置数据库连接池 高效的数据库连接池是优化数据库操作的关键。在IbatisDemo中,推荐使用如Druid这样的高性能连接池。Druid提供监控、SQL...

    Ibatis的学习笔记

    关联映射则用于一对一或一对多的关系,通过nestedResultMap或association标签,可以实现主从表的联合查询和结果转换。 对于存储过程的处理,Ibatis允许直接调用数据库的存储过程,并通过out参数获取返回结果。在XML...

    ibatis 学习资料

    1. **联合查询的使用.jpg**:这可能是一个关于iBatis如何实现多表联合查询的示例。在iBatis中,可以通过和标签来定义复杂的SQL查询,包括JOIN操作,以此来获取多个表的数据。 2. **iBATIS.in.Action.pdf.lnk**:这...

    Ibatis 数据层 轻型框架

    尽管如此,Ibatis 也有一些局限性,比如对于复杂事务管理和多表联合查询的支持相对有限,需要开发者有较强的SQL功底。 总的来说,Ibatis 是一款优秀的数据访问工具,尤其适合那些需要高度定制SQL语句的项目。其轻量...

    iBATIS 2.0 开发指南

    - **数据关联**:处理复杂的数据结构,如嵌套查询或联合查询。 - **事务管理**:支持两种事务管理机制,包括基于 JDBC 的事务管理和基于 JTA 的事务管理。 - **基于 JDBC 的事务管理机制**:适用于单数据源的情况。...

    iBATIS SQL Maps官方中文教程(PDF)

    7. 查询:深入讨论如何执行SQL查询,包括简单的单表查询、多表联合查询、分页查询以及使用ResultMaps处理复杂的结果集。 8. 参数映射:介绍如何传递参数给SQL语句,包括基本类型、复杂对象和集合类型的参数映射方法...

    ibatis in action

    - **书籍概述**:《iBATIS in Action》是一本详细介绍iBATIS框架使用的书籍,由Clinton Begin、Brandon Goodin、Larry Meadors联合撰写,于2007年出版。 - **目标读者**:本书主要面向已经熟悉Java编程语言并希望...

Global site tag (gtag.js) - Google Analytics