延续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的一对多映射的更多相关文章

  1. Mybatis关联一对多映射不能查询出所有的数据的问题

    在使用Mybatis进行一对多查询时,如果返回的是一个对象的话,可以发现将一对多的数据全都取出来了,但是这样的缺点是有很多值为null,我们更喜欢将返回值设为Map的形式,这样可以去除那些多余null ...

  2. MyBatis之一对多映射查询sql配置文件。

    学生---文章的模型一对多模型 学生student.java类 package com.bjsxt.sxf.po; import java.util.Date; import java.util.Li ...

  3. 途牛java实习面试(失败)

    一进去让自己介绍.简单介绍了一下.然后让我自己说说框架.问题太大一紧张卡住了. 然后面试官开始问,让我介绍多线程,我就简单介绍了多线程.然后问我有没有做过多线程的项目,我说没有. 问了MySQL的锁和 ...

  4. 【Mybatis高级映射】一对一映射、一对多映射、多对多映射

    前言 当我们学习heribnate的时候,也就是SSH框架的网上商城的时候,我们就学习过它对应的高级映射,一对一映射,一对多映射,多对多映射.对于SSM的Mybatis来说,肯定也是差不多的.既然开了 ...

  5. mybatis动态sql片段与分页,排序,传参的使用与一对多映射与resultMap使用

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-/ ...

  6. MyBatis从入门到精通(十一):MyBatis高级结果映射之一对多映射

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解MyBatis中如何使 ...

  7. MyBatis结果集一对多映射

    MyBatis结果集一对多映射 需求:重画二维码配置类,根据sizeCode将查询出来的imageCode分组. DROP TABLE IF EXISTS `size_code`; CREATE TA ...

  8. MyBatis从入门到精通(第6章):MyBatis 高级查询->6.1.2高级结果映射之一对多映射

    jdk1.8.MyBatis3.4.6.MySQL数据库5.6.45.IntelliJ IDEA 2019.3.1 本章主要包含的内容为 MyBatis 的高级结果映射,主要处理数据库一对一.一对多的 ...

  9. MyBatis用嵌套ResultMap实现一对多映射

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3959451.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

随机推荐

  1. WPF 之 鼠标双击事件

    由于WPF中没有鼠标的双击事件,因而只能通过MouseDown事件来模拟.当连续的两次MouseDown事件的时间间隔,没有超过一个设定的时间阈值时,就计算为一个双击事件,并作相应的处理. 利用WPF ...

  2. 【转】详解spring事务属性

    转载自:http://blog.chinaunix.net/u1/55983/showart_2091761.html 7个传播行为,4个隔离级别, Spring事务的传播行为和隔离级别[transa ...

  3. solr安全-tomcat

    1.1. tomcat部署1 参考文档:solr安全机制 1.1.1. 加上安全机制的必要性 在前面有提到, Solr 本身是不加安全机制的, 所有的查詢.admin.update 這些指令都可以經由 ...

  4. iOS ----Pods-resources.sh Permission denied

    1:执行指令 chmod a+x "路径(Pods-resources.h文件所在的路径)" 2:cd 进如pods文件夹下面 3:执行指令 第一步: sudo chmod 777 ...

  5. Debian 中添加ppa

    在Debian8中默认没有"apt-add-repository"命令,所有也就没法安装ppa. 怎么破? sudo apt-get install software-proper ...

  6. 基于Jquery Validate 的表单验证

    基于Jquery Validate 的表单验证 jquery.validate.js是jquery下的一个验证插件,运用此插件我们可以很便捷的对表单元素进行格式验证. 在讲述基于Jquery Vali ...

  7. iframe跨域自适应高度

    思路: 现有主界面main在域a下,被嵌套页面B在域b下,被嵌套页面B又嵌套一个在域a下的中介页面A. 当用户打开浏览器访问mail.html的时候载入B,触发B的onload事件获取其自身高度,然后 ...

  8. mysql-DDL-创建数据库

    创建一个数据库 • 建立数据库操作: 语法: create database 数据库名 叙述:创建一个具有指定名称的数据库.如果要创建的 数据库已经存在,或者没有创建它的适当权限,则此 语句失败. 例 ...

  9. Shell学习笔记 - 循环语句

    一.for循环 1. 语法格式1 for 变量 in 值1 值2 值3 ... do 程序 done 说明:程序将遍历所有的值,赋值给变量,然后在执行程序.也就是说,后面接多少个值,程序就循环多少次. ...

  10. 转: 微博的多机房部署的实践(from infoq)

    转:  http://www.infoq.com/cn/articles/weibo-multi-idc-architecture 在国内网络环境下,单机房的可靠性无法满足大型互联网服务的要求,如机房 ...