`
furuitao
  • 浏览: 33473 次
  • 性别: 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查询语句里,可以使用多表查询

    Ibatis查询语句里,可以使用多表查询,返回多个表的值.doc

    主子表查询ibatis

    使用ibatis配置的主子表关联查询的实例,一对多关系,在控制台打印,有log4j的使用,打印结果详细,(码云同步)

    ibatis and和or联合查询 .doc

    ibatis and和or联合查询 .doc

    spring+ibatis 多表

    框架:spring ibatis jquery 数据库: mysql 2个关联关系的表 有分页查询

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

    一个Ibatis+Mysql的简单例子,有数据库文件。希望对初学者有所帮助!

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

    ibatis 的小例子,主要是通过ibatis来处理2个数据表,其中数据表直接是有关系的

    iBatis条件查询

    iBatis做的按条件查询,没关联其他表,内带Mysql,适用于小型项目,hibernate是全自动化,如有朋友想学习下半自动化持久层框架,那就来下载这个看看吧。。

    ibatis的实现(包含模糊查询、关联查询、增删改查)

    ibatis的实现(包含模糊查询、关联查询、增删改查) 数据库sql server 2005

    ibatis实战之一对多关联(源代码)

    ibatis实战之一对多关联源代码 文章地址:http://blog.csdn.net/itmyhome1990/article/details/30050183

    iBatisMyBatis 主子表关联查询 .doc

    iBatisMyBatis 主子表关联查询 .doc

    ibatis配置文件介绍

    iBATIS是以SQL为中心的持久化层框架。能支持懒加载、关联查询、继承等特性

    ibatis+Spring demo

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

    iBatis SQL Maps开发指南.pdf

    延迟加载 VS 联合查询(1:1) 复杂类型集合的属性 避免N+1 Select(1:M和M:N) 组合键值或多个复杂参数属性 支持Parameter Map和Result Map的数据类型 缓存Mapped Statement结果集 只读 VS 可读写 Serializable可...

    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 ...

    ibatis2所需jar包

    iBATIS[2]是一个可以设计和实现更好的 Java/.NET 应用程序持久化层的框架。iBATIS 把对象和存储过程或者使用 XML 描述符的 SQL 语句进行了关联。简单是 iBATIS 最大的优势

    iBATIS介绍入门

    能支持懒加载、关联查询、继承等特性。 iBATIS不同于一般的OR映射框架。OR映射框架,将数据库表、字段等映射到类、属性,那是一种元数据(meta-data)映射。iBATIS则是将SQL查询的参数和结果集映射到类。 所以,...

    ibatis2.x 详细介绍

    一对多关联............................................................................................ 26 一对一关联......................................................................................

    IBatis简单使用

    IBatis完成学员的增删改查,无关联关系。

    ibatis开发指南_夏昕

    一对多关联............................................................................................26 一对一关联........................................................................................

Global site tag (gtag.js) - Google Analytics