修改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进行一对多的多表查询,以`book`和`user`两个表为例。 首先,...
### Ibatis多表查询知识点详解 #### 一、数据库表结构设计 为了演示Ibatis的多表查询功能,本文档采用了一个简单的例子:一个图书 (`book`) 表和一个用户 (`user`) 表,其中图书表与用户表之间存在一对多的关系。...
ibatis配置多表关联(一对一、一对多、多对多
多表查询通常涉及到 JOIN 操作,例如内连接(INNER JOIN)、左连接(LEFT JOIN)等,这些操作可以帮助我们从多个相关联的表中获取所需的数据。 #### 三、多表查询示例分析 根据提供的部分代码,我们可以看到一个多...
在数据库设计中,多表查询通常涉及到表之间的关联,例如一对一、一对多、多对多关系。在iBatis中,我们可以使用`<select>`标签来定义多表查询的SQL语句。 ### 3. 使用`<include>`标签 为了保持SQL语句的整洁和可...
2. **一对多查询SQL编写**: 在SQL脚本(如sql.sql文件)中,我们需要编写查询主表及所有子表记录的SQL语句。通常使用JOIN操作来实现关联查询,例如LEFT JOIN或INNER JOIN,将主表和子表通过共同的外键连接起来。在...
iBatis多对多关系详解 iBatis是一种流行的持久层框架,用于简化Java应用程序...我们使用了三个数据库表来存储学生和教师之间的多对多关系,并使用iBatis来映射数据库表和Java对象。最后,我们实现了DAO来访问数据库。
综上所述,"spring+ibatis 多表"项目涉及了后端的Spring和iBatis框架,它们共同处理数据库交互,特别是涉及到多表关联查询的复杂操作。前端则利用jQuery进行交互设计,包括分页查询的实现。这样的组合提供了一种高效...
接下来是多表关联查询的部分。这里使用了`<select>`标签,其`id`是查询方法的标识,`parameterType`指定了传入参数的类型,`resultMap`则指定了返回的结果集映射。查询SQL使用了LEFT JOIN来连接`test_xxx_classInfo1...
在XML映射文件中,你可以使用标签或在标签内直接编写JOIN语句,以实现多个表的数据联合查询。记得在Mapper接口中定义对应的方法。 6. **Service层和DAO层**: 在实际项目中,我们通常会创建Service层来封装业务...
### ibatis and和or联合查询知识点 #### 一、ibatis简介 ibatis是一个支持普通SQL查询、存储过程以及高级映射的优秀开源数据访问框架。ibatis消除了几乎所有的JDBC对象操作,提供了一个简单的基本API,它通过XML或...
在Ibatis中,复杂查询通常涉及到多个表的联接、条件动态拼接、子查询以及各种数据类型的处理。文档"Ibatis复杂查询语句.doc"所展示的查询语句就是一个很好的例子,展示了Ibatis如何处理复杂的数据库操作。接下来,...
在处理两个有关系的表时,Ibatis提供了多种策略,如一对一、一对多、多对一、多对多等映射关系。 1. **一对一映射**:当两个表之间存在一对一关系时,例如用户表和用户详细信息表,一个用户对应一条详细信息。在...
标题 "iBatis 多表" 指的是在使用 iBatis 框架时进行多表关联查询的相关知识。iBatis 是一个优秀的持久层框架,它允许开发者将 SQL 语句直接写在 XML 映射文件或注解中,提供了灵活的数据库操作方式。在处理复杂的...
总结,iBATIS的一对多和多对多关系映射是通过XML映射文件和自定义SQL查询实现的。理解这些配置和相关的源码有助于优化数据访问性能,同时使用合适的工具能提高开发效率。在实际项目中,务必根据具体需求选择合适的...
iBATIS允许处理复杂的集合属性,例如一个Account可能包含多个Order,每个Order又包含多个OrderItem。通过`<resultMap>`中的`<result>`标签和`select`属性,可以指定嵌套的查询,实现级联加载。在上述示例中,当查询...
这里使用了LEFT JOIN来连接`t_depart`和`t_class`表,获取所有部门及其关联的班级信息。 4. **Mapper接口方法**: 在`DepartMapper`接口中,对应上述XML中的`selectDepartWithClasses`,定义一个方法,例如: `...
一对多映射是数据库关系模型中的常见概念,指的是一个父表(如部门表)可以对应多个子表(如员工表),每个部门可以有多个员工。在`iBatis` 中,我们可以利用映射文件来配置这种关系,以便在查询时自动处理关联数据...