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

ibatis 多表关联查询

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

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

增加属性criteriaJoinTableNamecriteriaJoinTableColumn

修改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.       调用addJoinTableaddJoinTableColumn方法,进行表连接查询。

示例:关联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中,多表查询是一项重要的功能,它允许我们处理复杂的数据库操作,例如一对多、多对一或一对一的关系。在这个例子中,我们将探讨如何使用Ibatis进行一对多的多表查询,以`book`和`user`两个表为例。 首先,...

    Ibatis多表查询

    ### Ibatis多表查询知识点详解 #### 一、数据库表结构设计 为了演示Ibatis的多表查询功能,本文档采用了一个简单的例子:一个图书 (`book`) 表和一个用户 (`user`) 表,其中图书表与用户表之间存在一对多的关系。...

    ibatis配置多表关联(一对一、一对多、多对多

    ibatis配置多表关联(一对一、一对多、多对多

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

    多表查询通常涉及到 JOIN 操作,例如内连接(INNER JOIN)、左连接(LEFT JOIN)等,这些操作可以帮助我们从多个相关联的表中获取所需的数据。 #### 三、多表查询示例分析 根据提供的部分代码,我们可以看到一个多...

    ibatis多表查询过程

    在数据库设计中,多表查询通常涉及到表之间的关联,例如一对一、一对多、多对多关系。在iBatis中,我们可以使用`&lt;select&gt;`标签来定义多表查询的SQL语句。 ### 3. 使用`&lt;include&gt;`标签 为了保持SQL语句的整洁和可...

    主子表查询ibatis

    2. **一对多查询SQL编写**: 在SQL脚本(如sql.sql文件)中,我们需要编写查询主表及所有子表记录的SQL语句。通常使用JOIN操作来实现关联查询,例如LEFT JOIN或INNER JOIN,将主表和子表通过共同的外键连接起来。在...

    ibatis多对多关系(详细)

    iBatis多对多关系详解 iBatis是一种流行的持久层框架,用于简化Java应用程序...我们使用了三个数据库表来存储学生和教师之间的多对多关系,并使用iBatis来映射数据库表和Java对象。最后,我们实现了DAO来访问数据库。

    spring+ibatis 多表

    综上所述,"spring+ibatis 多表"项目涉及了后端的Spring和iBatis框架,它们共同处理数据库交互,特别是涉及到多表关联查询的复杂操作。前端则利用jQuery进行交互设计,包括分页查询的实现。这样的组合提供了一种高效...

    Mybatis/ibatiS多表映射 一对一 一对多 extjs前台取值 详细讲解

    接下来是多表关联查询的部分。这里使用了`&lt;select&gt;`标签,其`id`是查询方法的标识,`parameterType`指定了传入参数的类型,`resultMap`则指定了返回的结果集映射。查询SQL使用了LEFT JOIN来连接`test_xxx_classInfo1...

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

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

    ibatis and和or联合查询 .doc

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

    Ibatis复杂查询语句.doc

    在Ibatis中,复杂查询通常涉及到多个表的联接、条件动态拼接、子查询以及各种数据类型的处理。文档"Ibatis复杂查询语句.doc"所展示的查询语句就是一个很好的例子,展示了Ibatis如何处理复杂的数据库操作。接下来,...

    使用ibatis操作两个有关系的表

    在处理两个有关系的表时,Ibatis提供了多种策略,如一对一、一对多、多对一、多对多等映射关系。 1. **一对一映射**:当两个表之间存在一对一关系时,例如用户表和用户详细信息表,一个用户对应一条详细信息。在...

    ibatis 多表

    标题 "iBatis 多表" 指的是在使用 iBatis 框架时进行多表关联查询的相关知识。iBatis 是一个优秀的持久层框架,它允许开发者将 SQL 语句直接写在 XML 映射文件或注解中,提供了灵活的数据库操作方式。在处理复杂的...

    ibatis 一对多 多对多完整映射

    总结,iBATIS的一对多和多对多关系映射是通过XML映射文件和自定义SQL查询实现的。理解这些配置和相关的源码有助于优化数据访问性能,同时使用合适的工具能提高开发效率。在实际项目中,务必根据具体需求选择合适的...

    ibatis 文档查询

    iBATIS允许处理复杂的集合属性,例如一个Account可能包含多个Order,每个Order又包含多个OrderItem。通过`&lt;resultMap&gt;`中的`&lt;result&gt;`标签和`select`属性,可以指定嵌套的查询,实现级联加载。在上述示例中,当查询...

    ibatis做连接查询 .doc

    这里使用了LEFT JOIN来连接`t_depart`和`t_class`表,获取所有部门及其关联的班级信息。 4. **Mapper接口方法**: 在`DepartMapper`接口中,对应上述XML中的`selectDepartWithClasses`,定义一个方法,例如: `...

    ibatis 一对多

    一对多映射是数据库关系模型中的常见概念,指的是一个父表(如部门表)可以对应多个子表(如员工表),每个部门可以有多个员工。在`iBatis` 中,我们可以利用映射文件来配置这种关系,以便在查询时自动处理关联数据...

Global site tag (gtag.js) - Google Analytics