Mybatis-学习笔记(4)1对1、1对多、多对多
2024-10-07 06:13:27
1、1对1
有2种方式对内嵌Bean设值:
1》关联查询就一条语句。使用association关键字,直接将嵌套对象的映射表的字段赋值内嵌对象。
<association property="teacher" javaType="com.lfy.bean.Teacher">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
</association>
2》在同一个mapper中写嵌套bean的映射查询,或者嵌套bean的查询在独立的mapper中。还是使用association关键字。
<!-- getTeacher为同mapper的一个查询。对内嵌teacher属性进行关联查询 -->
<resultMap type="com.lfy.bean.Classes" id="ClassesResultMap2">
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<association property="teacher" column="teacher_id" select="getTeacher" javaType="com.lfy.bean.Teacher"/>
</resultMap>
<!-- getTeacher为其他mapper的一个查询。对内嵌teacher属性进行关联查询 -->
<resultMap type="com.lfy.bean.Classes" id="ClassesResultMap2">
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<association property="teacher" column="teacher_id" select="com.lfy.mapper.teacherMapper.getTeacher" javaType="com.lfy.bean.Teacher"/>
</resultMap>
总结:关键字association。
2、1对多
外键一般放置在多方,如学生与班级的关系,多个学生对应一个班级,是多对一的关系,外键应该放在学生表中,即学生表参照了班级表。
但我们现在的需求是,查询出某班级,并查询出班级的所有学生,班级与学生的关系是一对多的关系。
<!-- 根据id查询班级信息,返回resultMap -->
<select id="selectClazzById" parameterType="int" resultMap="clazzResultMap">
SELECT * FROM tb_clazz WHERE id = #{id}
</select> <!-- 映射Clazz对象的resultMap -->
<resultMap type="com.lfy.bean.Clazz" id="clazzResultMap">
<id property="id" column="id"/>
<result property="code" column="code"/>
<result property="name" column="name"/>
<!-- 一对多关联映射:collection fetchType="lazy"表示懒加载 -->
<collection property="students" javaType="ArrayList"
column="id" ofType="com.lfy.bean.Student"
select="com.lfy.mapping.StudentMapper.selectStudentByClazzId"
fetchType="lazy">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="sex" column="sex"/>
<result property="age" column="age"/>
</collection>
</resultMap>
fetchType属性:有两个取值eager和lazy,eager表示立即加载,是默认的加载形式。在查询Clazz对象的时候,会立即执行关联的selectStudentByClazzId中定义的SQL语句去查询班级的所有学生;lazy表示懒加载,其不会立即发送SQL语句去查询班级的所有学生,而是等到需要使用到班级的students属性时,才会发送SQL语句去查询班级的所有学生信息。
fetch机制更多的是为了性能考虑,如果查询班级时确定会访问班级的所有学生,则该属性应该设置为eager;如果查询班级时只是查询班级信息,有可能不会访问班级的所有学生,则该属性应该设置为lazy。一般情况下,一对多所关联的集合对象,都应该被设置成lazy。
使用懒加载,还需要在Mybatis配置文件中增加如下配置:
总结:关键字collection。
3、多对多
数据库中的多对多关系,推荐使用中间表来维护关系,中间表中的订单id作为外键参照订单表的id,商品id作为外键参照商品表的id。
主要是对前面两种的总和应用。
最新文章
- Searching for a valid kernel header path... The path ";"; is not a valid path to the ***** kernel headers. Would you like to change it? [yes]
- JAVA 8 Lambda表达式-Lambda Expressions
- [20130704] Intra-Query Parallel Thread Deadlocks
- c++中二进制和整数转化
- BZOJ4298 : [ONTAK2015]Bajtocja
- 批量kill mysql processlist进程
- poj 3083 Children of the Candy Corn (广搜,模拟,简单)
- xml文件操作
- MODBUS协议解析中常用的转换帮助类(C#)
- linux-shell系列4-init
- Nagios 监控 Mysql
- Android Studio xml文件中的布局预览视图
- Jmeter使用自定义编写代码
- 啰里吧嗦redis
- 深度学习网络层之 Pooling
- Fedora下Eclipse/MyEclipse崩溃的解决方案
- 在Windows下编译Emacs
- 131.007 Unsupervised Learning - Feature Selection | 非监督学习 - 特征选择
- Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性
- IDEA2017 使用(二)