一、实体类
多方:
public class Employ {
private int id;
private String enployName;
private int salary;
private Department department;
public Employ() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getEnployName() {
return enployName;
}
public void setEnployName(String enployName) {
this.enployName = enployName;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
}
一方:
public class Department {
private int did;
private String departmentName;
private List<Employ> employees;
public int getDid() {
return did;
}
public void setDid(int did) {
this.did = did;
}
public String getDepartmentName() {
return departmentName;
}
public void setDepartmentName(String departmentName) {
this.departmentName = departmentName;
}
public List<Employ> getEmployees() {
return employees;
}
public void setEmployees(List<Employ> employees) {
this.employees = employees;
}
}
二、映射文件
多方:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="Employ">
<!-- Use type aliases to avoid typing the full classname every time. -->
<typeAlias alias="Employ" type="com.test.domain.Employ"/>
<!-- Result maps describe the mapping between the columns returned
from a query, and the class properties. A result map isn't
necessary if the columns (or aliases) match to the properties
exactly. -->
<resultMap id="EmployResult" class="Employ">
<result property="id" column="id"/>
<result property="enployName" column="employ_name"/>
<result property="salary" column="salary"/>
<result property="department.did" column="did"/>
<result property="department.departmentName" column="department_name"/>
</resultMap>
<!-- Select with no parameters using the result map for Account class. -->
<select id="selectAllEmploy" resultMap="EmployResult">
<![CDATA[
select * from employees e, departments d where e.departmentid = d.did
]]>
</select>
<!-- A simpler select example without the result map. Note the
aliases to match the properties of the target result class. -->
<!-- Insert example, using the Account parameter class -->
<insert id="insertEmploy" parameterClass="Employ">
<![CDATA[
insert into employees (employ_name, salary, departmentid) values(#enployName#, #salary#, #department.did#)
]]>
</insert>
<!-- Update example, using the Account parameter class -->
<!-- Delete example, using an integer as the parameter class -->
</sqlMap>
一方:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="Department">
<!-- Use type aliases to avoid typing the full classname every time. -->
<typeAlias alias="Department" type="com.test.domain.Department"/>
<!-- Result maps describe the mapping between the columns returned
from a query, and the class properties. A result map isn't
necessary if the columns (or aliases) match to the properties
exactly. -->
<resultMap id="DepartmentResult" class="Department">
<result property="did" column="did"/>
<result property="departmentName" column="department_name"/>
</resultMap>
<!-- Select with no parameters using the result map for Account class. -->
<select id="selectDepartmentById" parameterClass="int" resultMap="DepartmentResult">
<![CDATA[
select * from departments where did = #did#
]]>
</select>
<!-- A simpler select example without the result map. Note the
aliases to match the properties of the target result class. -->
<!-- Insert example, using the Account parameter class -->
<insert id="insertDepartment" parameterClass="Department">
<![CDATA[
insert into departments (department_name) values(#departmentName#)
]]>
</insert>
<!-- Update example, using the Account parameter class -->
<!-- Delete example, using an integer as the parameter class -->
</sqlMap>
分享到:
相关推荐
"ibatis解决多对一n+1问题"这个主题聚焦于MyBatis框架中如何高效地处理多对一关联查询,避免出现性能瓶颈的“n+1”问题。这个问题通常发生在查询一对多关系时,如果不对查询进行优化,会导致大量的额外数据库访问,...
2. **连接查询(JOIN)**: 通过在SQL语句中使用JOIN操作,将原本的多次查询合并为一次,从而避免N+1问题。不过,这种方法需要注意的是,当数据量过大时,可能会导致内存压力增大。 3. **延迟加载(Lazy Loading)**...
在数据库查询优化中,"N+1 选择问题"是一个常见的性能瓶颈,特别是在使用ORM(对象关系映射)框架如iBATIS时。N+1问题发生在当我们执行一系列单独的SQL查询来获取关联数据,而不是一次性加载所有所需数据。这可能...
7. 性能优化:通过合理设计SQL,避免N+1查询问题,使用缓存提高性能。 总之,iBATIS作为一个轻量级的持久层框架,通过提供SQL Maps和Mapped Statements,降低了数据库操作的复杂性,使得开发者可以专注于业务逻辑而...
- **Avoiding N+1 Selects (1:1)**:避免N+1次查询问题,提高性能。 - **Complex Collection Properties**:处理集合类型的属性。 - **Avoiding N+1 Selects (1:M and M:N)**:处理一对多或多对多关系时的查询...
- **避免 N+1 Select 问题**: 即使是一对一关联,也需要注意避免多次数据库查询。 #### 三、延迟加载 延迟加载是一种优化技术,它允许在实际需要时才加载关联对象的数据,而不是在加载主对象时就立即加载所有关联...
6. **最佳实践**:学习如何优化SQL,避免N+1查询问题,以及如何利用缓存提高性能。 7. **实战项目**:通过参与实际项目或复刻JpetStore_4,提升对iBatis的运用能力。 总之,iBatis是一个强大且灵活的持久层框架,...
10. **最佳实践**:如何有效地设计Mapper接口和XML文件,避免N+1查询,以及如何利用iBATIS进行性能优化。 学习iBATIS不仅需要理解上述知识点,还需要通过实际项目实践来巩固和深化理解。通过分析提供的源码,我们...
10. **最佳实践**:了解如何优化Ibatis的使用,如合理设计SQL,避免N+1问题,使用动态SQL等。 这个教程将引导初学者一步步完成Ibatis环境的搭建,理解其基本工作原理,并通过实际操作掌握Ibatis的使用。通过这些...
Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责SQL映射,使得开发者能够将注意...在使用过程中,注意合理设计SQL语句,避免N+1查询问题,同时利用Ibatis提供的各种特性优化数据库访问,提高系统性能。
- **避免 N+1 Select**:通过联合查询等方式优化查询性能。 - **延迟加载 VS 联合查询**:选择合适的查询策略以提高效率。 - **复杂类型集合的属性**:处理复杂类型集合的映射。 - **组合键值或多个复杂参数属性**:...
- **避免 N+1 Select(1:M 和 M:N)**:进一步讲解如何优化多对多查询。 - **组合键值或多个复杂参数属性**:当一个参数由多个属性组成时的处理方法。 - **支持 ParameterMap 和 ResultMap 的数据类型**:详细...
10. **最佳实践**:分享一些使用 iBatis 的最佳实践,如避免N+1查询问题,提高性能的技巧等。 通过学习这个 iBatis 的 demo,开发者可以更好地理解和掌握 iBatis 在实际开发中的运用,提升数据访问层的构建能力。...
- **避免N+1查询问题**:通过合理设计SQL语句减少不必要的查询次数。 - **复合主键或多属性复合对象**:处理复杂的对象映射情况。 #### 五、缓存机制 iBATIS-SqlMaps提供了两种缓存机制:只读缓存和可读写缓存。...
8. **最佳实践与案例分析**:提供实际开发中的最佳实践,如如何优化SQL,避免N+1问题,以及在大型项目中如何有效地组织和管理映射文件。 9. **与其他框架集成**:探讨如何将iBatis与Spring、Struts等其他框架整合,...
6.2.3 避免N+1查询问题 105 6.3 继承 107 6.4 其他用途 109 6.4.1 使用语句类型和DDL 109 6.4.2 处理超大型数据集 109 6.5 小结 115 第7章 事务 116 7.1 事务是什么 116 7.1.1 一个简单的银行转账示例 116 7.1.2 ...
支持代码生成工具,避免N+1查询问题。 - **缺点**:相较于Hibernate等框架来说,知名度和社区支持相对较低。 ### 3. 在具体项目中如何选择合适的技术栈 在实际项目开发过程中,选择合适的数据库访问技术是至关重要...