修改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中进行主子表查询,以及涉及到的相关技术如一对多关系、日志管理库log4j等。 首先,主子表查询是数据库设计中常见的场景,通常涉及到一个“父”表(主表)和一个或多个“子”表(从表)...
### iBatis 多表查询知识点详解 #### 一、iBatis简介 iBatis 是一款优秀的持久层框架,它将 SQL 映射到 Java 对象,简化了 JDBC 编程过程中的繁琐操作,提高了开发效率。iBatis 的核心功能包括 SQL 映射、动态 SQL...
在XML映射文件中,你可以使用标签或在标签内直接编写JOIN语句,以实现多个表的数据联合查询。记得在Mapper接口中定义对应的方法。 6. **Service层和DAO层**: 在实际项目中,我们通常会创建Service层来封装业务...
### ibatis and和or联合查询知识点 #### 一、ibatis简介 ibatis是一个支持普通SQL查询、存储过程以及高级映射的优秀开源数据访问框架。ibatis消除了几乎所有的JDBC对象操作,提供了一个简单的基本API,它通过XML或...
- 复杂查询:涉及子查询,联合查询,存储过程的调用等。 - 缓存机制:讲解iBATIS的缓存策略,如何启用和配置缓存以提高性能。 - 异常处理:介绍iBATIS抛出的异常类型及其处理方式。 - 批量操作:如何利用iBATIS...
在SQL查询中,可以使用嵌套选择(`<select>`标签)或者联合主键(`<join>`标签)来关联一对一的表。 2. **一对多关系**:在一个实体类中,可能存在与多个其他实体类的关系,如一个用户有多个订单。同样,使用`...
1. **复杂查询**:当需要进行复杂的数据库查询,如分页、联合查询、子查询时,IBatis 提供的 SQL 映射和动态 SQL 功能非常有用。 2. **性能优化**:通过缓存机制,可以减少对数据库的频繁访问,提高系统性能。 3. ...
- **问题1**: 建议优化`search`方法,使用联合查询替代多条SQL语句。iBatis支持动态SQL,可以利用`<union>`标签来组合多个查询,提高效率。 - **问题2**: 对于日志保存,建议进行更彻底的封装。这意味着可能需要...
4. **避免N+1 Select**:通过联合查询等方式减少不必要的数据库查询次数。 5. **组合键值或多个复杂参数属性**:支持复杂的参数传递和映射逻辑。 #### 五、缓存机制 iBATIS支持多种缓存机制,包括只读缓存和可读写...
内容包里面是源代码,运行该例子的方式就是,使用里面的sql文件还原数据库。...使用cmd进入该解压包,运行 java -jar *.jar ibatis2spring....欲了解代码的详细,请访问作者博客,搜索《ibatis + Spring 多表查询》文章。
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的高速缓存主要关注于提高查询性能和减少数据库负载。 **2.2 iBATIS对高速缓存管理的帮助** iBATIS提供了内置的缓存管理机制,可以帮助开发者轻松地管理和配置缓存策略。 **2.3 iBATIS高速缓存和传统O/RM...
相比之下,iBATIS更适用于那些需要高级SQL查询技巧的应用场景,如处理复杂联表查询、分页查询等。iBATIS给予开发者对SQL语句的完全控制权,这意味着开发者可以优化查询逻辑,以适应数据库设计的特殊需求,特别是在...
例如,复杂的查询、分页或联表操作,使用Ibatis可以更加直观和高效。 四、配置数据库连接池 高效的数据库连接池是优化数据库操作的关键。在IbatisDemo中,推荐使用如Druid这样的高性能连接池。Druid提供监控、SQL...
关联映射则用于一对一或一对多的关系,通过nestedResultMap或association标签,可以实现主从表的联合查询和结果转换。 对于存储过程的处理,Ibatis允许直接调用数据库的存储过程,并通过out参数获取返回结果。在XML...
1. **联合查询的使用.jpg**:这可能是一个关于iBatis如何实现多表联合查询的示例。在iBatis中,可以通过和标签来定义复杂的SQL查询,包括JOIN操作,以此来获取多个表的数据。 2. **iBATIS.in.Action.pdf.lnk**:这...
尽管如此,Ibatis 也有一些局限性,比如对于复杂事务管理和多表联合查询的支持相对有限,需要开发者有较强的SQL功底。 总的来说,Ibatis 是一款优秀的数据访问工具,尤其适合那些需要高度定制SQL语句的项目。其轻量...
- **数据关联**:处理复杂的数据结构,如嵌套查询或联合查询。 - **事务管理**:支持两种事务管理机制,包括基于 JDBC 的事务管理和基于 JTA 的事务管理。 - **基于 JDBC 的事务管理机制**:适用于单数据源的情况。...
7. 查询:深入讨论如何执行SQL查询,包括简单的单表查询、多表联合查询、分页查询以及使用ResultMaps处理复杂的结果集。 8. 参数映射:介绍如何传递参数给SQL语句,包括基本类型、复杂对象和集合类型的参数映射方法...
- **书籍概述**:《iBATIS in Action》是一本详细介绍iBATIS框架使用的书籍,由Clinton Begin、Brandon Goodin、Larry Meadors联合撰写,于2007年出版。 - **目标读者**:本书主要面向已经熟悉Java编程语言并希望...