mybatis 一对多配置

  • Post author:
  • Post category:其他


比如同时有baiA.java和B.java两个类,A.java如下du:

public class A{


private B b1;

private List b2;

}

在映射b1属性时用association标签bai, 映射b2时用collection标签,分别是一对一du,一对多的关系

什么是一对多?

一对多关系应该是开发人员接触得最多的关联关系。打个比方,淘宝上,一个用户他拥有多个订单,而这几个订单单独属于此用户,这个关联关系就叫一对多关系。在数据库中则表示为两张表互相关联,如用户表(A表)关联订单表(B表),那么A表的一行数据就和B表的多条数据产生关联。

MyBatis加载关联关系对象主要通过两种方式

嵌套查询:

1、嵌套查询是通过另一条SQL映射语句来返回预期的复杂类型

2、嵌套查询是查询语句中插入一个子SQL语句

3、嵌套查询会执行多条SQL语句

4、嵌套查询编写SQL语句较为简单,但消耗资源大,可配置延迟加载解决

嵌套结果:

1、嵌套结果是使用嵌套结果映射来重复的联合结果的子集

2、嵌套结果是一个嵌套的多表查询的SQL语句

3、嵌套结果只会执行一条复杂的SQL语句

4、嵌套结果SQL语句编写比较复杂

在< collection >子标签通常可以配置一下属性

它的属性大部分和association标签的属性相同,但多了个ofType属性。

属性名 作用

property 指定映射数据库的JAVA实体类对象的属性,与数据库表的字段一一对应

colum 数据库表的(字段名)列名或者列的字段别名

javaType 要接收数据库数据的完整的java类对象名或别名

select 嵌套查询时,声明引入一条子SQL语句

fetchType 声明关联查询时是否启用延迟加载,属性值为(lazy/eager),默认为lazy(启用)

ofType ofType与javaType属性对应,它用于指定实体类对象中的集合类属性所包含的类型(如List< A >,ofType就为A)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

CurriculumDao.xml 部分如下:


select

cu.

, cu.id as curriculumId,

t.

name

as teacherName, t.id as teacherId

from lr_database_curriculum cu

left join lr_database_curriculum_class dcc on dcc.curriculum_id = cu.id

left join lr_database_teacher t on dcc.teacher_id = t.id

cu.name like concat(’%’,#{key},’%’)

and t.id = #{userId}

and cu.id = #{curriculumId}

group by cu.id



上述红色部分相对应,绿色部分对应collection标签中select属性中CurriculumClassDao中的getClassesById方法的参数,如下:

select

cl. , count(lds.id) as studentNums, cc.teacher_id as teacherId

from lr_database_class cl

left join lr_database_curriculum_class cc on cl.id = cc.class_id

left join lr_database_student lds on lds.class_id = cl.id

where cc.curriculum_id = #{curriculumId}

and cc.teacher_id = #{teacherId}

group by cl.id



版权声明:本文为weixin_41767509原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。