一、嵌套的resultMap
<?xml version="1.0" encoding="utf8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--与以前一样,namespace的值是对应的映射器接口的完整名称-->
<mapper namespace="com.abc.mapper.TeacherMapper">
<!--TeacherMapper接口中getById方法对应的SQL语句。
查询教师及其指导的学生的信息。由于教师、学生都有
id、name、gender等属性,因此给教师的字段都起了别名-->
<select id="getById" parameterType="int" resultMap="supervisorResultMap">
select t.id t_id, t.name t_name, t.gender t_gender,
t.research_area t_research_area, t.title t_title,
s.id,s.name, s.gender,s.major,s.grade
from teacher t,student s where t.id=#{id}
and s.supervisor_id = t.id
</select>
<!--教师实体映射-->
<resultMap id="supervisorResultMap" type="Teacher">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
<result property="gender" column="t_gender"/>
<result property="researchArea" column="t_research_area"/>
<result property="title" column="t_title"/>
<!--需要注意的是,上面的select语句中学生的字段名/别名应与 下面的column属性一 致。ofType指collection包含的元素的类型, 此属性不可少-->
<collection property="supStudents"ofType="Student">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="gender" column="gender"/>
<result property="major" column="major"/>
<result property="grade" column="grade"/>
<!--映射学生的指导教师属性,用到了supervisorResultMap本身-->
<association property="supervisor" resultMap="supervisorResultMap"/>
</collection>
</resultMap>
</mapper>
这种写法的缺点是学生实体映射被嵌入到教师实体映射中,因此学生实体映射不能被重用。
二、嵌套的select语句
这种方式是使用一条单独的select语句来加载关联的实体(在本例中就是学生实体),然后在collection元素中引用此select语句.
<?xml version="1.0" encoding="utf8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--与以前一样,namespace的值是对应的映射器接口的完整名称-->
<mapper namespace="com.abc.mapper.TeacherMapper">
<!--TeacherMapper接口中getById方法对应的SQL语句。 查询教师的信息。-->
<select id="getById" parameterType="int" resultMap="supervisorResultMap">
select * from teacher where id=#{id}
</select>
<!--教师实体映射-->
<resultMap id="supervisorResultMap" type="Teacher">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="gender" column="gender"/>
<result property="researchArea" column="research_area"/>
<result property="title" column="title"/>
<!--ofType指collection包含的元素的类型,此属性不可少。
column属性指把上述的getById的select语句中的教师id列的值作为参数
传递给将要引用到的下述的getStudents的select语句,此属性不可少。
引用的形式为:命名空间.select语句id-->
<collection property="supStudents" column="id" ofType="Student"
select="com.abc.mapper.StudentMapper.getStudents"/>
</resultMap>
</mapper>
在这里把根据指导教师id查询学生信息的SQL语句写在StudentMapper.xml中,并引用其中的学生实体映射studentResultMap。
<?xml version="1.0" encoding="utf8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.abc.mapper.StudentMapper">
<resultMap id="studentResultMap" type="Student">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="gender" column="gender"/>
<result property="major" column="major"/>
<result property="grade" column="grade"/>
<!--在这里引用supervisorResultMap和getById 亦采用命名空间名.相关元素id的形式。 column="supervisor_id"属性不可少-->
<association property="supervisor"
resultMap="com.abc.mapper.TeacherMapper.supervisorResultMap"
select="com.abc.mapper.TeacherMapper.getById"
column="supervisor_id"/>
</resultMap>
<!--根据指导教师id查询学生信息-->
<select id="getStudents" parameterType="int" resultMap="studentResultMap">
select * from student where supervisor_id = #{id}
</select>
</mapper>
本文出自 “肖凡的专栏” 博客 其它请参考,http://legend2011.blog.51cto.com/3018495/888848
分享到:
相关推荐
在MyBatis中,association和collection是两种常用的标签,用于实现延迟加载和子查询。association标签用于实现一对一查询,而collection标签用于实现一对多查询。 使用association标签 association标签用于实现一...
在本文中,我们将介绍两种实现 N级联动效果的方式:使用递归函数和使用数组。 第一种方式:使用递归函数 在第一种方式中,我们可以使用递归函数来实现 N级联动效果。递归函数是一种特殊的函数,它可以调用自身以便...
本项目涵盖了 Mybatis 基于注解和 XML 的两种方式,来实现对单表和多表的操作,特别适合初学者进行学习和实践。 首先,我们来探讨基于注解的单表操作。在 Mybatis 中,我们可以使用 @Mapper 和 @Select、@Insert、@...
在 Mybatis 中,Collection 和 Association 是两个重要的概念,它们都是用于描述对象之间的关系,但是它们之间有着很大的区别。 Association 在 Mybatis 中,Association 是用于描述一对一或多对一的关系。它通常...
MyBatis是一个流行的Java持久层框架,它简化了数据库操作,通过XML或注解的方式将SQL与Java代码绑定,提供了一种简洁的API来处理数据库交互。在MyBatis中,`batis-3-config.dtd` 和 `mybatis-3-mapper.dtd` 是两个至...
通过这两种方式,Mybatis可以根据查询结果自动装配对象,形成`CompanyModel`与其关联的多个`CompanyImagesModel`实例的集合。 总结来说,Mybatis的一对多关联查询主要依赖于映射关系的配置,无论是通过XML文件还是...
3. 参数映射:Mybatis 支持两种参数映射方式,分别是传入 Java 对象和 Map。使用 `@Param` 注解可以为传入的参数命名,便于在 SQL 中引用。对于 Map 参数,键作为参数名,值作为参数值。 4. resultMap:`...
1. 在MyBatis 里面创建两个源码目录,分别为 src_user,test_src, 用如下方式建立,鼠标右键点击 JavaResource. 2. 设置mybatis 配置文件:Configuration.xml, 在src_user目录下建立此文件,内容如下: 程序代码 程序...
总的来说,MyBatis的关联映射功能提供了灵活且强大的方式来处理复杂的对象关系。通过深入理解并实践`chapter10_oneToOne`、`chapter10_oneToMany`和`chapter10_ManyToMany`中的例子,你将能够熟练地在项目中应用这些...
MyBatis3DTD约束是MyBatis框架中用于定义XML映射文件的一种规范,它描述了XML文件的结构和元素。DTD(Document Type Definition)是XML文档类型定义,用于规定XML文档的合法构建块,包括元素、属性以及它们之间的...
MyBatis提供两种加载方式:立即加载(Eager)和懒加载(Lazy)。默认情况下,MyBatis采用立即加载策略,即在查询主表时同时加载关联的从表数据。如果希望延迟加载,可以在`<collection>`标签中设置`fetchType="lazy...
- MyBatis支持两种参数映射方式:`#`和`$`。前者用于预编译参数,后者将参数直接拼接在SQL字符串中。通常推荐使用预编译参数以防止SQL注入。 8. **事务控制**: - 由于该项目没有整合Spring,事务管理需要手动...
本篇文章将深入探讨这三种关系以及如何通过嵌套查询和嵌套结果两种方式在MyBatis中实现它们。 ### 一对一关系映射 一对一关系通常存在于主从表或者详细信息与基本信息之间。在MyBatis中,可以通过`<resultMap>`...
- MyBatis提供了本地缓存和二级缓存两种方式,可以提高数据读取速度。本地缓存只存在于SqlSession生命周期内,而二级缓存可以跨SqlSession共享数据。 6. **插件支持**: - MyBatis允许开发者编写拦截器插件,对...
可以通过`<typeAliases>`标签进行配置,支持单个别名定义和包扫描两种方式。 #### 四、接口映射配置 - **接口映射**:MyBatis支持通过接口来映射SQL语句,这种方式称为DAO模式。通过定义接口并在映射文件中引用该...
4. Executor执行器:负责执行SQL,有简单和分页两种模式。 5. ParameterHandler参数处理器:处理SQL语句中的参数。 6. ResultSetHandler结果集处理器:处理查询结果,将其转化为Java对象。 二、MyBatis主要功能 1. ...
关联映射分为嵌套查询(Nested Select)和嵌套结果(Nested ResultMap)两种方式。 1. 嵌套查询:在查询主表数据时,通过子查询来获取关联的子表数据。这种方式通常用于一对多关系,例如一个用户有多个订单。在XML...
7. **事务管理**:MyBatis提供了基于编程和基于配置两种事务管理方式。编程式事务管理需要在代码中手动开启和提交事务,而配置式事务管理则可以通过Spring等框架进行管理。 8. **日志功能**:MyBatis内置了日志框架...
6. **参数映射**:myBatis支持两种参数映射方式,一种是通过注解@Param来指定参数名,另一种是在XML映射文件中使用`<parameterMap>`和`<parameter>`元素。 7. **缓存机制**:myBatis内置了两级缓存,一级缓存是...