Mybatis学习总结五
来源:互联网 发布:linux更改文件权限777 编辑:程序博客网 时间:2024/06/04 18:23
一对多映射
在模型设计总存在很多一对多的关系,例如一个角色可能对应多个职位等。mybatis对于一对多的映射关系通过collection来实现。
我们可以先设计2张数据库表,一个是教师(班主任 teacher 表)一个是教师所对应的管理的班级(class table),在现实中有可能存在一个教师管理多个班级的情况。
teacher表中存在比较简单的2个字段,id和name。在class中存在3个字段id,name,teacherid。
在mapper文件中配置 对应的teacher和class resultMap,利用collection关联2个resultMap
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.company.TeacherMapper"> <resultMap id="Teacher" type="com.company.Teacher"> <id property="id" column="id"/> <result column="name" property="name"/> <collection property="classes" select="getClasses" column="id"/> </resultMap> <select id="getTeacher" resultMap="Teacher"> SELECT id,name from teacher </select> <resultMap id="Class" type="com.company.ClassModel"> <id property="id" column="id"/> <result column="name" property="name"/> <result column="teacherid" property="teacherid"/> </resultMap> <select id="getClasses" resultMap="Class" parameterType="Int"> SELECT id,name,teacherid from class WHERE teacherid = #{id} </select> </mapper>
定义ClassModel
package com.company;public class ClassModel { private int id; private String name; private int teacherid; public int getId(){ return id; } public void setId(int value){ id = value; } public String getName(){ return name; } public void setName(String value){ name =value; } public int getTeacherid(){ return teacherid; } public void setTeacherid(int value){ teacherid = value; }}
定义Teacher,在其中定义一个List属性
package com.company;import java.util.List;public class Teacher { private int id; private String name; private List<ClassModel> classes; public int getId(){ return id; } public void setId(int value){ id=value; } public String getName(){ return name; } public void setName(String value){ name = value; } public List<ClassModel> getClasses(){ return classes; } public void setClasses(List<ClassModel> value){ classes = value; }}
这样执行程序即可实现teacher对class的一对多关联。
但由于嵌套select语句会导致N+1选择问题,即对于主查询返回n行结果集另外一个查询会被执行(主查询n行,则此查询会执行n次)。对于大型数据库,这样会导致性能问题。
另一种实现方式是用sql的表关联查询实现
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.company.TeacherMapper"> <resultMap id="Teacher" type="com.company.Teacher"> <id property="id" column="id"/> <result column="name" property="name"/> <collection property="classes" resultMap="Class"/> </resultMap> <select id="getTeacher" resultMap="Teacher"> SELECT t.id as id,t.name as name,c.id as classid ,c.name as classname from teacher as t LEFT JOIN class as c on c.teacherid = t.id </select> <resultMap id="Class" type="com.company.ClassModel"> <id property="id" column="classid"/> <result column="classname" property="name"/> <result column="id" property="teacherid"/> </resultMap> </mapper>
在这里通过left join将teacher和class表关联起来进行查询。
0 0
- Mybatis学习总结五
- Mybatis学习总结(五).动态SQL与Mybatis缓存
- MyBatis学习总结(五)——实现关联表查询
- MyBatis学习总结(五)——实现关联表查询
- MyBatis学习总结(五)——实现关联表查询
- MyBatis学习总结(五)——实现关联表查询
- MyBatis学习总结(五)——实现关联表查询
- MyBatis学习总结(五)——实现关联表查询
- MyBatis学习总结(五)——实现关联表查询
- MyBatis学习总结(五)——实现关联表查询
- MyBatis学习总结(五)——实现关联表查询
- MyBatis学习总结(五)——实现关联表查询
- MyBatis学习总结(五)——实现关联表…
- MyBatis学习总结(五)——实现关联表查询
- MyBatis学习总结(五)——实现关联表查询
- MyBatis学习总结(五)——实现关联表查询
- MyBatis学习总结(五)——实现关联表查询
- MyBatis学习总结(五)——实现关联表查询
- linux下tar.gz、tar、bz2、zip等解压缩、压缩命令小结
- 对比 Matlab 和 Octave 的运行速度
- altium designer 去掉PCB的所有连线
- 迷宫寻路
- 利用header下载图片等文件
- Mybatis学习总结五
- java图片开源框架tesseract调用OCR实现图片文件识别代码下载
- POJ 2226 二分图最小覆盖
- KMP算法
- 分析RunTime执行命令以及得到返回值
- Linux下 PostgreSQL 编译安装
- Ubuntu12.04 root 用户登录设置
- Hadoop学习笔记 压缩
- 解决问题:onreadystatechange只触发一次