高级映射之一对一、一对多、多对多
数据模型分析思路
- 每张表记录的数据内容
- 分模块对每张表记录内容进行熟悉,相当于你学习系统需求的过程
- 每张表重要的字段
- 非空字段,外键字段
- 外键所在的表称为子表,对应的表称为父表
- 数据库级别表与表之间的关系
- 外键关系
- 表与表之间的业务关系
- 在分析表与表之间的业务关系的时候一定要建立在某个业务意义的基础上去分析
一对多
- 创建数据库表格添加数据:
- t_customer表:
- t_ticket表:
- t_customer表:
- 定义实体类
- Customer类:
- Ticket类:
- Customer类:
- 使用mapper方式映射
- 规范:
- ==mapper接口和mapper文件的名字必须相同==
- ==必须在相同的路径下==
- ==mapper配置文件的namespace属性必须是mapper接口的全限定名字==
- 定义映射配置文件CustomerMapper.xml
- 使用resultMap的collection对关联的多条记录映射到一个list集合属性中
- 根据映射配置文件定义mapper接口
- 规范:
- mybatis全局配置文件
- 测试代码:
- 结果:
一对一
- 使用mapper映射方式
- 定义映射文件mapper.xml
- 使用resultMap的association实现一对一映射
- mapper接口
- 定义映射文件mapper.xml
- 测试代码:
结果:
-
总结:
- resultType:使用resultType实现简单,如果pojo中没有包含查询出来的列名,需要增加对应的属性,即可完成映射,如果没有特殊的要求,这中方式很方便
- resultMap:需要单独定义resultMap,实现有点麻烦,如果有特殊的要求,建议使用resultMap
- resultType不可以实现延迟加载,resultMap可以实现延迟加载
多对多
- 和一对多相似,只是mepper接口的定义的方法返回值不在是一个对象,而是一个集合
- 测试代码
总结
- MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap
- resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。
- 在MyBatis进行查询映射的时候,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。当提供的返回类型属性是resultType的时候,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。
- 所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当我们提供的返回类型属性是resultType的时候,MyBatis对自动的给我们把对应的值赋给resultType所指定对象的属性,而当我们提供的返回类型是resultMap的时候,因为Map不能很好表示领域模型,我们就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。