mybatis的一对多映射
延续mybatis的一对一问题,如果一个用户有多个作品怎么办?这就涉及到了一对多的问题。同样的,mybatis一对多依然可以分为两种方式来解决。
一、使用内嵌的ResultMap实现一对多映射
1)实体
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public class User implements Serializable{ private static final long serialVersionUID = 112596782083832677L; private Integer id; //编号 private String email; //邮箱 private String realName; //真实姓名 private String telephone; //电话号码 private List<WorksInfo> worksInfos; //作品 //get,set方法 ...}public class WorksInfo implements Serializable{ private Integer id; private Integer userId; private Date uploadDate; //上传时间 private Date updateDate; //更新时间 //get,set方法 ...} |
2)dao接口省略...
3)mapper映射文件
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<resultMap type="com.tarena.djs.entity.WorksInfo" id="worksInfoResultMap"> <id column="id" property="id" /> <result column="uploadDate" property="uploadDate" /> <result column="updateDate" property="updateDate" /></resultMap><resultMap type="com.tarena.djs.entity.User" id="UserResult"> <id column="id" property="id" /> <result column="email" property="email" /> <result column="telephone" property="telephone" /> <result column="realName" property="realName"/> <collection property="worksInfos" resultMap="worksInfoResultMap" /></resultMap><select id="findTutorById" parameterType="int" resultMap="UserResult"> select u.*,w.* from user u left join worksInfo w on u.id = w.userId where u.id = #{id} </select> |
4)测试省略
二、嵌套查询方式实现一对多
1)实体类如上
2)dao层接口省略
3)mapper文件映射
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<resultMap type="com.tarena.djs.entity.WorksInfo" id="worksInfoResultMap"> <id column="id" url="http://www.errenzhuan.cc" /> <result column="uploadDate" property="uploadDate" /> <result column="updateDate" property="updateDate" /></resultMap><select id="findWorksInfoByUserId" parameterType="int" resultMap="worksInfoResultMap"> select * from worksInfo where userId = #{userId}</select><resultMap type="com.tarena.djs.entity.User" id="UserResult"> <id column="id" property="id" /> <result column="email" property="email" /> <result column="telephone" property="telephone" /> <result column="realName" property="realName"/> <collection property="worksInfos" columns="id" select="findWorksInfoByUserId" /></resultMap><select id="findUserByUserId" parameterType="int" resultMap="UserResult"> select * from user where id = #{id}</select> |
4)测试方法忽略
注意:collention元素里的column属性,即主表中要传递给副表做查询的条件,例如本例中:
|
1
|
<span style="background-color: rgb(255, 255, 0);"><collection property="worksInfos" columns="id" select="findWorksInfoByUserId" /><br></span> |
及时将user表中的id字段传递给findWorksInfoByUserId方法做参数使用的,对应worksInfo表中的userId字段。除此之外,嵌套select语句会导致N+1的问题。首先,主查询将会执行(1 次) ,对于主
查询返回的每一行,另外一个查询将会被执行(主查询 N 行,则此查询 N 次) 。对于
大型数据库而言,这会导致很差的性能问题。
mybatis的一对多映射的更多相关文章
- Mybatis关联一对多映射不能查询出所有的数据的问题
在使用Mybatis进行一对多查询时,如果返回的是一个对象的话,可以发现将一对多的数据全都取出来了,但是这样的缺点是有很多值为null,我们更喜欢将返回值设为Map的形式,这样可以去除那些多余null ...
- MyBatis之一对多映射查询sql配置文件。
学生---文章的模型一对多模型 学生student.java类 package com.bjsxt.sxf.po; import java.util.Date; import java.util.Li ...
- 途牛java实习面试(失败)
一进去让自己介绍.简单介绍了一下.然后让我自己说说框架.问题太大一紧张卡住了. 然后面试官开始问,让我介绍多线程,我就简单介绍了多线程.然后问我有没有做过多线程的项目,我说没有. 问了MySQL的锁和 ...
- 【Mybatis高级映射】一对一映射、一对多映射、多对多映射
前言 当我们学习heribnate的时候,也就是SSH框架的网上商城的时候,我们就学习过它对应的高级映射,一对一映射,一对多映射,多对多映射.对于SSM的Mybatis来说,肯定也是差不多的.既然开了 ...
- mybatis动态sql片段与分页,排序,传参的使用与一对多映射与resultMap使用
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-/ ...
- MyBatis从入门到精通(十一):MyBatis高级结果映射之一对多映射
最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解MyBatis中如何使 ...
- MyBatis结果集一对多映射
MyBatis结果集一对多映射 需求:重画二维码配置类,根据sizeCode将查询出来的imageCode分组. DROP TABLE IF EXISTS `size_code`; CREATE TA ...
- MyBatis从入门到精通(第6章):MyBatis 高级查询->6.1.2高级结果映射之一对多映射
jdk1.8.MyBatis3.4.6.MySQL数据库5.6.45.IntelliJ IDEA 2019.3.1 本章主要包含的内容为 MyBatis 的高级结果映射,主要处理数据库一对一.一对多的 ...
- MyBatis用嵌套ResultMap实现一对多映射
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3959451.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...
随机推荐
- WPF 之 鼠标双击事件
由于WPF中没有鼠标的双击事件,因而只能通过MouseDown事件来模拟.当连续的两次MouseDown事件的时间间隔,没有超过一个设定的时间阈值时,就计算为一个双击事件,并作相应的处理. 利用WPF ...
- 【转】详解spring事务属性
转载自:http://blog.chinaunix.net/u1/55983/showart_2091761.html 7个传播行为,4个隔离级别, Spring事务的传播行为和隔离级别[transa ...
- solr安全-tomcat
1.1. tomcat部署1 参考文档:solr安全机制 1.1.1. 加上安全机制的必要性 在前面有提到, Solr 本身是不加安全机制的, 所有的查詢.admin.update 這些指令都可以經由 ...
- iOS ----Pods-resources.sh Permission denied
1:执行指令 chmod a+x "路径(Pods-resources.h文件所在的路径)" 2:cd 进如pods文件夹下面 3:执行指令 第一步: sudo chmod 777 ...
- Debian 中添加ppa
在Debian8中默认没有"apt-add-repository"命令,所有也就没法安装ppa. 怎么破? sudo apt-get install software-proper ...
- 基于Jquery Validate 的表单验证
基于Jquery Validate 的表单验证 jquery.validate.js是jquery下的一个验证插件,运用此插件我们可以很便捷的对表单元素进行格式验证. 在讲述基于Jquery Vali ...
- iframe跨域自适应高度
思路: 现有主界面main在域a下,被嵌套页面B在域b下,被嵌套页面B又嵌套一个在域a下的中介页面A. 当用户打开浏览器访问mail.html的时候载入B,触发B的onload事件获取其自身高度,然后 ...
- mysql-DDL-创建数据库
创建一个数据库 • 建立数据库操作: 语法: create database 数据库名 叙述:创建一个具有指定名称的数据库.如果要创建的 数据库已经存在,或者没有创建它的适当权限,则此 语句失败. 例 ...
- Shell学习笔记 - 循环语句
一.for循环 1. 语法格式1 for 变量 in 值1 值2 值3 ... do 程序 done 说明:程序将遍历所有的值,赋值给变量,然后在执行程序.也就是说,后面接多少个值,程序就循环多少次. ...
- 转: 微博的多机房部署的实践(from infoq)
转: http://www.infoq.com/cn/articles/weibo-multi-idc-architecture 在国内网络环境下,单机房的可靠性无法满足大型互联网服务的要求,如机房 ...