1. 一对一查询

需求:查询订单信息,关联查询创建订单的用户信息

1.1 使用resultType实现

1.1.1 sql语句

   确定查询的主表:订单表
       确定查询的关联表:用户表
       关联查询:使用外连接,还是内连接??

        --由于orders表中有一个外键(user_id),通过外键关联查询用户表只能查询出一条记录,可以使用内连接

select t.*,
u.username, u.sex, u.address
from orders t, user u
where t.user_id = u.id

1.1.2 创建pojo

     将上边sql查询结果映射到pojo中,pojo中必须包含所有查询列名。
         原始的Orders不能映射全部字段,需要新创建pojo。创建一个pojo继承包括查询字段较多的po类。

//通过此类映射订单和用户和用户查询的结果,让此类继承包括字段较多的pojo类
public class OrdersCustom extends Orders{
//添加用户属性
//u.username, u.sex, u.address
private String username;
private String sex;
private String address;
}

1.1.3 mapper.xml

<!-- 查询订单,关联查询用户信息 -->
<select id="findOrderUser" resultType="cn.itcast.mybatis.po.OrdersCustom">
select t.*, u.username, u.sex, u.address
from orders t, user u
where t.user_id = u.id
</select>

1.1.4 mapper.java

public List<OrdersCustom> findOrderUser() throws Exception;

1.2 使用resultMap实现
1.2.1 sql语句
      同resultType实现的sql
1.2.2 使用resultType映射的思路
    使用resultType将查询结果中的订单信息映射到Orders对象中,在Orders对象中添加user属性,将关联查询出来的用户信息映射到Orders对象中user属性中。
    需要Orders类中添加user属性。

public class Orders{

     private Integer id;
private Integer userId;
private String number;
private Date createTime;
private String note; //用户信息
private User user;
}

1.2.3 mapper.xml   定义resultMap(一对一使用association来映射用户信息)

    <!-- 订单查询关联查询用户信息 的 resultMap
将整个查询的结果映射到cn.itcast.mybatis.po.Orders中
-->
<resultMap type="cn.itcast.mybatis.po.Orders" id="ordersUserResultMap">
<!-- 配置映射的订单信息-->
<!-- id: 指定查询列中的唯一标识,订单信息中的唯一标识,如果有多个列组成唯一标识,配置多个id
column: 订单信息中的唯一标识列
property:订单信息中的唯一标识列所映射到Orders中的哪个属性-->
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="number" property="number"/>
<result column="createTime" property="createTime"/>
<result column="note" property="note"/> <!-- 配置映射的关联的用户信息
association: 用于映射关联查询单个对象的信息
property: 要将关联查询的用户信息映射到Orders中哪个属性
javaType: 指定映射到关联用户的pojo类型中-->
<association property="user" javaType="cn.itcast.mybatis.po.User">
<!-- id: 关联查询用户的唯一标识
column: 指定唯一标识用户信息的列
property:映射到user的哪个属性-->
<id column="user_id" property="id"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/>
</association>
</resultMap>

1.2.4 mapper.xml   statement

<!-- 查询订单,关联查询用户信息 -->
<select id="findOrdersUserResultMap" resultMap="ordersUserResultMap">
select t.*, u.username, u.sex, u.address
from orders t, user u
where t.user_id = u.id
</select>

1.2.5 mapper.java

public List<Orders> findOrdersUserResultMap() throws Exception;

1.3 resultType 和 resultMap 实现一对一查询小结
      resultType: 使用resultType较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。
                 如果没有查询结果的特殊要求,建议使用resultType。
      resultMap:   需要单独定义resultMap,实现有点麻烦,如果对查询结果有特殊的要求,使用resultMap可以完成关联查询映射到pojo属性中。
                 resultMap可以实现延时加载。而resultType无法实现延时加载。

  

    

mybatis3.2.7应用_高级映射(一对一、一对多、多对多)的更多相关文章

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

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

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

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

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

    一对一 一对多 多对多

  4. 【mybatis深度历险系列】mybatis中的高级映射一对一、一对多、多对多

    学习hibernate的时候,小编已经接触多各种映射,mybatis中映射有到底是如何运转的,今天这篇博文,小编主要来简单的介绍一下mybatis中的高级映射,包括一对一.一对多.多对多,希望多有需要 ...

  5. mybatis入门基础(六)----高级映射(一对一,一对多,多对多)

    一:订单商品数据模型 1.数据库执行脚本 创建数据库表代码: CREATE TABLE items ( id INT NOT NULL AUTO_INCREMENT, itemsname ) NOT ...

  6. Mybatis实现高级映射一对一、一对多查询

    终于把论文写得差不多了,系统也不急着完成,可以抽出点时间来完成这个系列的博客了.在写本博客之前我是惶恐不安的,高级映射一贯是持久层框架里的重中之重,小到自己开发小系统,大到企业级开发,表的存在从来就不 ...

  7. Mybatis学习总结(六)——高级映射(一对一,一对多,多对多)

    一.订单商品数据模型 1.数据库执行脚本 创建数据库表代码: /*Table structure for table `t_user` */ CREATE TABLE t_user ( id INT ...

  8. mybatis入门基础----高级映射(一对一,一对多,多对多)

    阅读目录 一:订单商品数据模型 二.一对一查询 三.一对多查询 四.多对多查询 回到顶部 一:订单商品数据模型 1.数据库执行脚本 创建数据库表代码: CREATE TABLE items ( id ...

  9. 使用NHibernate(7)-- 一对一 && 一对多 && 多对多

    1, 一对一. 对于数据量比较大的时候,考虑查询的性能,肯能会把一个对象的属性分到两个表中存放:比如用户和用户资料,经常使用的一般是Id和用户名,用户资料(学校,籍贯等)是不经常被查询的,所以就会分成 ...

随机推荐

  1. Java volatile修饰字段

     一.关键字volatile修饰字段: 使用特殊域变量(volatile)实现线程同步 volatile:不稳定的:反复无常的:易挥发的: 1.volatile关键字为域变量的访问提供了一种免锁机制, ...

  2. LitePal

      Litepal采用的是对象关系映射(ORM)模式   LitePal的配置工作. 1.添加依赖  compile 'org.litepal.android:core:1.3.2' 2.配置lite ...

  3. JMeter接口测试-计数器

    前言 在测试注册接口的时候,需要批量注册账号时,每注册一个并且需要随时去修改数据,比较繁琐,除了使用随机函数生成账号,我们还可以使用计数器来进行批量注册. 一:添加配置元件-计数器 二:注册10个账号 ...

  4. 探究 Go 语言 defer 语句的三种机制

    Golang 的 1.13 版本 与 1.14 版本对 defer 进行了两次优化,使得 defer 的性能开销在大部分场景下都得到大幅降低,其中到底经历了什么原理? 这是因为这两个版本对 defer ...

  5. 聊聊RabbitMQ那一些事儿之一基础应用

    聊聊RabbitMQ那一些事儿之一基础应用 Hi,各位热爱技术的小伙伴您们好,今年的疫情害人啊,真心祝愿您和您的家人大家都平平安安,健健康康.年前到现在一直没有总结点东西,写点东西,不然久了自己感觉自 ...

  6. 【Art】抗疫路上,温暖相伴

    2020年3月. 本应是春暖花开的时节,武汉却是寒冷的,整个中国也是寒冷的. 疫情将人们逼得退无可退,只能待在家里看着电视新闻与手机上一个个数字不断跳动,等待着它们背后前线的无数命悬一线的战士的胜利讯 ...

  7. Manjaro 19.01 kde下Tim sogou软件安装问题及解决

    我的系统配置 首先第一个问题是,在manjaro下Tim Thunderspeed这种deepin-wine的软件.今天我在装这些软件的时候,安装之后不能打开,闪退.苦恼了我好一会儿.终于找到了解决的 ...

  8. 用nodejs+express搭建前端测试服务端

    平时开发前端应用,如果没有现成的后端接口调试,又要保证前端进度,该怎么办呢,当然办法还是很多的,很多大牛都分享过很多经验,我也来说说我常用的方法. 请求本地数据文件 把本地数据放到程序指定目录,发起h ...

  9. 与Nexus为Maven搭建私服

    目录 Nexus 的概述 Nexus 安装与部署 Nexus 在 Windows 上安装与使用 安装 使用 Nexus 在 Linux 上安装与使用 Nexus 的概述 引用百度百科一段话 Nexus ...

  10. Python学习之布尔和数字

    布尔有True和Flase两种值 数字0.None,以及元素为空的容器类对象都可视为False,反之为Ture.