原文:https://blog.csdn.net/m0_37787069/article/details/79247321

1、一对一
关键字:association
作用:针对pojo对象属性的映射
      property:pojo的属性名
      javaType:pojo类名
(1) 嵌套结果: 使用嵌套结果映射来处理重复的联合结果的子集

<resultMap type="com.gec.domain.Person" id="basePersonResultMap">
<id column="id" property="personId"/>
<result column="name" property="name"/>
<result column="sex" property="sex"/>
<result column="age" property="age"/> <association property="card" javaType="com.gec.domain.Card">
<!-- 、构造器注入
<constructor>
<idArg column="id" javaType="int"/>
<arg column="code" javaType="string"/>
</constructor>
-->
<!-- 、setter注入 -->
<result column="id" property="cardId"/>
<result column="code" property="code"/>
</association>
</resultMap>
<select id="queryUserList" resultMap="basePersonResultMap">
select p.id as personId,p.name,p.sex,p.age,c.*
from tbl_person p,tbl_card c where p.card_id=c.id;
</select>

(2) 嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型
    column="引入执行另外定制sql方法的参数值(外键)"
    select="执行定制sql方法名"
PersonMapper2.xml

<resultMap type="com.gec.domain.Person" id="basePersonResultMap">
<id column="id" property="personId"/>
<result column="name" property="name"/>
<result column="sex" property="sex"/>
<result column="age" property="age"/>
<association property="card"
javaType="com.gec.domain.Card"
column="card_id"
select="com.gec.mapper.CardMapper.queryCardById">
</association>
</resultMap>
<select id="queryUserList" resultMap="basePersonResultMap">
select * from tbl_person;
</select>

CardMapper.xml

<resultMap type="com.gec.domain.Card" id="baseCardResultMap">
<id column="card_id" property="cardId"/>
<result column="code" property="code"/>
</resultMap>
<select id="queryCardById" resultMap="baseCardResultMap">
select c.id as card_id,c.code from tbl_card c
where c.id=#{id};
</select>
<resultMap type="com.gec.domain.Card" id="queryCardResultMap" extends="baseCardResultMap">
<association property="person" javaType="com.gec.domain.Person">
<id column="card_id" property="personId"/>
<result column="name" property="name"/>
<result column="sex" property="sex"/>
<result column="age" property="age"/>
</association>
</resultMap>
<select id="queryCardList" resultMap="queryCardResultMap">
SELECT c.id AS card_id, c.code, p.*
FROM tbl_card c,tbl_person p WHERE c.id=p.card_id;
</select>

2 、一对多
mybatis如何实现一对多的实现?(学生与班级)
(1) 嵌套结果:
ClazzMapper.xml

<resultMap type="com.gec.domain.Clazz" id="baseClazzResultMap">
<id column="id" property="clazzId"/>
<result column="clazz_name" property="clazzName"/>
<result column="code" property="code"/>
</resultMap>
<resultMap type="com.gec.domain.Clazz" id="queryClazzList2ResultMap" extends="baseClazzResultMap">
<collection property="studentList" javaType="ArrayList" ofType="com.gec.domain.Student">
<id column="stu_id" property="studentId"/>
<result column="name" property="name"/>
<result column="sex" property="sex"/>
<result column="age" property="age"/>
</collection>
</resultMap>
<select id="queryClazzList2" resultMap="queryClazzList2ResultMap">
SELECT c.*, s.id AS stu_id,s.name,s.sex,s.age
FROM tbl_clazz c LEFT JOIN tbl_student s
ON c.id=s.clazz_id;
</select>

StudentMapper.xml

<resultMap type="com.gec.domain.Student" id="baseStudentResultMap">
<id column="id" property="studentId"/>
<result column="name" property="name"/>
<result column="sex" property="sex"/>
<result column="age" property="age"/>
</resultMap>
<resultMap type="com.gec.domain.Student" id="queryStudentListResultMap" extends="baseStudentResultMap">
<association property="clazz" javaType="com.gec.domain.Clazz">
<id column="cls_id" property="clazzId"/>
<result column="clazz_name" property="clazzName"/>
<result column="code" property="code"/>
</association>
</resultMap>
<select id="queryStudentList" resultMap="queryStudentListResultMap">
SELECT s.*,c.id AS cls_id,c.clazz_name,c.code
FROM tbl_student s,tbl_clazz c WHERE s.clazz_id=c.id;
</select>

(2) 嵌套查询:
ClazzMapper.xml

<resultMap type="com.gec.domain.Clazz" id="baseClazzResultMap">
<id column="id" property="clazzId"/>
<result column="clazz_name" property="clazzName"/>
<result column="code" property="code"/>
</resultMap>
<resultMap type="com.gec.domain.Clazz" id="queryClazzListResultMap" extends="baseClazzResultMap">
<collection property="studentList" javaType="ArrayList"
column="id" ofType="com.gec.domain.Student"
select="com.gec.mapper.StudentMapper.queryStudentByClazzId"
>
</collection>
</resultMap>
<select id="queryClazzList" resultMap="queryClazzListResultMap">
select * from tbl_clazz;
</select>

StudentMapper.xml

<resultMap type="com.gec.domain.Student" id="baseStudentResultMap">
<id column="id" property="studentId"/>
<result column="name" property="name"/>
<result column="sex" property="sex"/>
<result column="age" property="age"/>
</resultMap>
<resultMap type="com.gec.domain.Student" id="queryStudentListResultMap" extends="baseStudentResultMap">
<association property="clazz" javaType="com.gec.domain.Clazz">
<id column="cls_id" property="clazzId"/>
<result column="clazz_name" property="clazzName"/>
<result column="code" property="code"/>
</association>
</resultMap>
<select id="queryStudentList" resultMap="queryStudentListResultMap">
SELECT s.*,c.id AS cls_id,c.clazz_name,c.code
FROM tbl_student s,tbl_clazz c WHERE s.clazz_id=c.id;
</select>
<!-- 根据班级的id,获取学生列表 -->
<select id="queryStudentByClazzId" resultMap="baseStudentResultMap">
select * from tbl_student where clazz_id=#{id};
</select>

3、多对多
商品表、订单表之间就是以多对多关联
商品与订单的关系表
描述多对多的数据表实现
(1)商品pojo:
Article.java

public class Article implements Serializable {
private Integer articleId;
private String name;
private Double price;
private String remark;
private List<Order> orders;
省略setter/gettera方法
}

(2)商品表映射:
ArticleMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<mapper namespace="com.gec.mapper.ArticleMapper">
<resultMap type="article" id="baseArticleResultMap">
<id column="id" property="articleId"/>
<result column="NAME" property="name"/>
<result column="price" property="price"/>
<result column="remark" property="remark"/>
</resultMap>
<resultMap type="article" id="findArtcleByIdResultMap" extends="baseArticleResultMap">
<collection property="orders" javaType="ArrayList"
ofType="com.gec.domain.Article" column="id"
select="com.gec.mapper.OrderMapper.findOrderByArticleId"
>
</collection>
</resultMap>
<!-- 根据订单id查询商品 -->
<select id="findArtcleByOrderId" resultMap="baseArticleResultMap">
select * from tb_article where id
in (select article_id from tb_item where order_id=#{id})
</select>
<select id="findArtcleById" resultMap="findArtcleByIdResultMap">
select * from tb_article where id=#{id}
</select>
</mapper>

(3)订单pojo:
Order.java

public class Order {
private Integer orderid;
private String code;
private Double total;
private List<Article> articles;
省略setter/getter方法
}

(4)订单表映射:
OrderMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<mapper namespace="com.gec.mapper.OrderMapper">
<resultMap type="order" id="baseOrderResultMap">
<id column="orderId" property="orderid"/>
<result column="CODE" property="code"/>
<result column="total" property="total"/>
</resultMap>
<resultMap type="order" id="queryOrderByUserIdRsultMap" extends="baseOrderResultMap">
<collection property="articles" javaType="ArrayList"
ofType="article" column="orderId"
select="com.gec.mapper.ArticleMapper.findArtcleByOrderId">
</collection>
</resultMap>
<!-- 根据商品id查询订单 -->
<select id="findOrderByArticleId" resultMap="baseOrderResultMap">
select * from tb_order where id
in (select order_id from tb_item where article_id=#{id})
</select>
</mapper>

mybatis实现多表一对一,一对多,多对多关联查询的更多相关文章

  1. MyBatis 一对多,多对一关联查询的时候Mapper的顺序

    要先写association,然后写collection:这是由DTD决定的: <resultMap ...> <association ...> </associati ...

  2. Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作

    Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: ​ ​ ​  ​ ​ 由于如果只使用一张表存储所有的数据,就会操作数 ...

  3. mybatis 一对一 一对多 多对多

    一对一 一对多 多对多

  4. mybatis实战教程二:多对一关联查询(一对多)

    多对一关联查询 一.数据库关系.article表和user表示多对一的关系 CREATE TABLE `article` ( `id` ) NOT NULL AUTO_INCREMENT, `user ...

  5. JPA级联(一对一 一对多 多对多)注解【实际项目中摘取的】并非自己实际应用

    下面把项目中的用户类中有个:一对一  一对多  多对多的注解对应关系列取出来用于学习      说明:项目运行正常 问题类:一对多.一对一.多对多 ============一对多 一方的设置 @One ...

  6. mybatis 14: 多对一关联查询

    业务背景 根据订单id查询订单的信息,以及该订单所属的客户的基本信息(不包括该客户自己的订单信息) 两张数据表 客户表 订单表 实体类 客户实体类:Customer private Integer i ...

  7. NHibernate教程(11)--多对多关联查询

    本节内容 多对多关系引入 多对多映射关系 多对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 多对多关系引入 让我们再次回顾在第二篇中建立的数据模型 ...

  8. [NHibernate]一对多关系(关联查询)

    目录 写在前面 文档与系列文章 一对多查询 总结 写在前面 上篇文章介绍了nhibernate的一对多关系如何配置,以及级联删除,级联添加数据的内容.这篇文章我们将学习nhibernate中的一对多关 ...

  9. Python--day64--找到作者关联的所有书籍对象、ORM多对多关联查询的原理

    找到当前作者关联的所有书籍对象: ORM多对多关联查询的原理: 编辑作者:

随机推荐

  1. CF861D

    题目链接:http://codeforces.com/contest/861/problem/D 解题思路: 优雅的暴力. 对于输入的每一个号码,从短到长找出它的所有子串,用 vector 保存每个号 ...

  2. 控制层技术:Servlet+reflection、Struts2、Spring MVC三者之间的比较学习

    Servlet Struts2 Spring MVC 处理用户提交的数据 基于MVC设计模式的Web应用程序 是一个框架 是MVC框架 导入servlet包,配置web.xml文件 web.xml & ...

  3. Poj2965 冰箱的开关

    #include<iostream> using namespace std; int flag; int step; ][]; ] = { }; ] = { }; void turn(i ...

  4. C语言数据类型整理

    基本类型: 它们是算术类型,包括两种类型:整数类型和浮点类型. 枚举类型: 它们也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量. void 类型: 类型说明符 void 表明没有可用 ...

  5. layui 数据表格使用

    //第一个实例 table.render({ elem: '#demo' ,height: 400 ,url: '/My_NewsTest/LookServlet' //数据接口 ,page: tru ...

  6. Unity 游戏框架搭建 2019 (四十八/四十九) MonoBehaviourSimplify 中的消息策略完善&关于发送事件的简单封装

    MonoBehaviourSimplify 中的消息策略完善 在上一篇,笔者说,MonoBehaviourSimplify 中的消息策略还有一些小问题.我们在这篇试着解决一下. 先贴出来代码: usi ...

  7. 使用 IdentityService4 集成小程序登录一种尝试

    1 场景介绍 主要业务是通过 App 承载,在 App 中可以注册和登录,为了更好的发展业务引入了微信小程序,于是如何让这两个入口的用户互通便成了需要解决的问题. 看了一下其它 App 大致地思路是两 ...

  8. debug PHP程序(xdebug、IntelliJ IDEA)

    之前写PHP程序的都是echo调试,今天感觉太麻烦了就想起研究一下IntelliJ IDEA如何调试PHP程序. 从网上查找了很多资料,大部分都提到在IDE里开启服务,一下就懵了,怎么启这么多服务呢. ...

  9. raw_input和input

    昨天在OJ上做CTF的题目,发现有道python的题目很有意思,让我知道了raw_input和input的区别,并且能干一些别的事情. 官方文档上说,input()相当于eval(raw_input( ...

  10. 01 . Mysql简介及部署

    Mysql数据库简介 什么是数据? ​ 数据(data)是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的原始素材,数据是信息的表现形式和载体,可以是符号,文字,数字,语音,图 ...