关联查询映射

数据库结构

数据库表之间有外键关系的业务关系

(1)user和orders
user---->orders:一个用户可以创建多个订单,一对多关系。
orders---->user:一个订单只由一个用户创建,一对一关系。

(2)orders和orderdetail
orders---->orderdetail:一个订单可以包括多个订单明细,因为一个订单可以购买多个商品,每个商品的购买信息在orderdetail记录,一对多关系。
orderdetail---->orders:一个订单明细只能包括在一个订单中,一对一关系。

(3)orderdetail和items:
orderdetail---->items:一个订单明细只对应一个商品信息,一对一关系。
items---->orderdetail:一个商品可以包括在多个订单明细 ,一对多关系。

数据库表之间没有外键关系的业务关系

(1)orders和items
这两张表没有直接的外键关系,通过业务及数据库的间接关系分析出它们是多对多的关系。

orders –>orderdetail –>items:一个订单可以有多个订单明细,一个订单明细对应一个商品,所以一个订单对应多个商品。
items –>orderdetail –>orders:一个商品可以对应多个订单明细,一个订单明细对应一个订单,所以一个商品对应多个订单。

(2)user和items
这两张表没有直接的外键关系,通过业务及数据库的间接关系分析出它们是多对多的关系。

user –>orders –>orderdetail –>items:一个用户有多个订单,一个订单有多个订单明细、一个订单明细对应一个商品,所以一个用户对应多个商品。
items –>orderdetail –>orders –>user:一个商品对应多个订单明细,一个订单明细对应一个订单,一个订单对应一个用户,所以一个商品对应多个用户。

一对一映射

(1)需求
查询订单信息,关联查询创建订单的用户信息。

(2)SQL语句

selectorders.id,orders.user_id,orders.number,orders.createtime,orders.note,user.username,user.address
from orders,user
where orders.user_id = user.id

(3)resultType
复杂查询时,单表对应的POJO类已不能满足输出结果集的映射,所以要根据需求建立一个扩展类来作为resultType的类型。

POJO类

public class OrdersExt extends Orders {//添加用户属性private String username;private String address;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}
}

mapper接口

public interface OrdersMapper {//    进行订单信息查询,包括用户的名称和地址信息public List<OrdersExt> findOrdersUser();
}

映射文件

<mapper namespace="org.mapper.OrdersMapper"><!-- 定义查询订单表列名的SQL片段 --><sql id="select_orders">orders.id,orders.user_id,orders.number,orders.createtime,orders.note</sql><!-- 定义查询用户表列名的SQL片段 --><sql id="select_user">user.username,user.address</sql><!-- 进行订单信息查询,包括用户的名称和地址信息 --><select id="findOrdersUser" resultType="OrdersExt">select <include refid="select_orders" />,<include refid="select_user"></include>from orders,user where orders.user_id = user.id</select>
</mapper>

加载映射文件

<mappers><!-- 批量加载映射文件 --><package name="org.mapper" />
</mappers>

测试程序

@Test
public void testFindOrdersUser() {SqlSession sqlSession = sqlSessionFactory.openSession();OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);List<OrdersExt> list = ordersMapper.findOrdersUser();System.out.println(list);sqlSession.close();
}

(4)resultMap
使用resultMap来进行一对一结果映射,它是将关联对象添加到主信息的对象中,具体说是对象嵌套对象的一种映射方式。

修改POJO类

public class Orders {private Integer id;private Integer userId;private String number;private Date createtime;private String note;//用户信息private User user;//getters、setters、toString
}

mapper接口

public interface OrdersMapper {//    一对一之resultMappublic List<Orders> findOrdersUserRstMap();
}

映射文件

<mapper namespace="org.mapper.OrdersMapper"><!-- 一对一映射之resultMap --><select id="findOrdersUserRstMap" resultMap="OrdersUserRstMap">selectorders.id,orders.user_id,orders.number,orders.createtime,orders.note,user.username,user.addressfrom orders,userwhere orders.user_id = user.id</select><resultMap type="org.po.Orders" id="OrdersUserRstMap"><!-- 订单信息 --><!-- column="",column的值为上面select语句后面的列名 --><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:一对一关联映射 --><!-- id标签:指定关联对象结果集的唯一标识,很重要,不写不会报错,但是会影响性能 --><!-- property:指定关联对象要映射到Orders的哪个属性上  --><association property="user" javaType="org.po.User"><id column="user_id" property="id" /><result column="username" property="username" /><result column="address" property="address" /></association></resultMap></mapper>

测试代码

@Test
public void testFindOrdersUserRstMap() {SqlSession sqlSession = sqlSessionFactory.openSession();OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);List<Orders> list = ordersMapper.findOrdersUserRstMap();System.out.println(list);sqlSession.close();
}

(5)小结
在一对一结果映射时,使用resultType更加简单方便,如果有特殊要求(对象嵌套对象)时,需要使用resultMap进行映射,比如:查询订单列表,然后在点击列表中的查看订单明细按钮ÿ

Mybatis基础(二)相关推荐

  1. java mybatis基础

    java mybatis基础 1.1 什么是mybatis? mybatis是一个优秀的持久层框架. 避免几乎所有的JDBC代码和手动设置参数以及获取结果集的过程. 可以使用简单的xml或者注解来配置 ...

  2. 大数据WEB阶段Mybatis(二)

    Mybatis(二) 零.目录 Mybatis接口形式 Mybatis整合Spring Mybatis的缓存机制 手动封装结果集 一对一表操作 一对多表操作 多对多表操作 SpringMVC . Sp ...

  3. javaweb实训第六天下午——Mybatis基础

    Mybatis基础 1.课程介绍 2.为什么需要Mybatis 3.初识Mybatis 3.1.Mybatis是什么 3.1.1.什么是框架 3.1.2.什么叫数据库持久化 3.1.3.什么是ORM ...

  4. MyBatis基础篇

    MyBatis基础篇 简介 注意:本篇文章主讲语法,jar包导入大家可以在网上搜索(有问题一定要学会利用搜索引擎解决!!!),全程代码会写到文章中. 1. MyBatis是一个半自动ORM框架(作为解 ...

  5. Mybatis基础学习之一级缓存和二级缓存的简单使用

    前言: 小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师. 这个Mybatis ...

  6. 蓝鸥Unity开发基础二——课时20 接口

    蓝鸥Unity开发基础二--课时20 接口 一.接口 使用interface关键字定义接口 接口定义一组成员单不直接实现它们 二.实现接口 实现接口的任何类都必须实现其所有的成员方法 接口不能直接实例 ...

  7. MyBatis基础入门《九》ResultMap自动匹配

    MyBatis基础入门<九>ResultMap自动匹配 描述: Mybatis执行select查询后,使用ResultMap接收查询的数据结果. 实体类:TblClient.java 接口 ...

  8. shell基础二十篇 一些笔记

    shell基础二十篇 转自 http://bbs.chinaunix.net/thread-452942-1-1.html 研讨:Bash 内建命令 read (read命令更具体的说明见博客收藏的一 ...

  9. Mybatis基础:增删改查、模糊查询、多条件查询

    Mybatis基础:增删改查.模糊查询.多条件查询http://www.bieryun.com/3132.html 1.新建测试数据库,根据实体类属性创建 2.实体类 [java] view plai ...

  10. Bootstrap基础二十七 多媒体对象(Media Object)

    Bootstrap<基础二十七> 多媒体对象(Media Object) 原文:Bootstrap<基础二十七> 多媒体对象(Media Object) Bootstrap 中 ...

最新文章

  1. Intel 6系列芯片组设计缺陷 全球出货暂停
  2. [BTS]BizTalk学习之Functoid篇(ID Cross-References)
  3. 困难样本挖掘(Online Hard Sample Mining)
  4. BZOJ1021 [SHOI2008]循环的债务
  5. GIT学习笔记二(本地项目发布到GIT)
  6. centos linux 系统日常管理4 scp,rsync,md5sum,sha1sum,strace ,find Rsync 常见错误及解决方法 第十七节课...
  7. 【Tensorflow】Tensor的比较运算
  8. 补遗篇之volatile
  9. python加减乘除符号_Python项目如何合理组织规避import天坑
  10. UPUPW数据库密码的修改
  11. GhostNet 解读及代码实验(附代码、超参、日志和预训练模型)
  12. 做一款仿映客的直播App
  13. 一个萌新关于电脑安装软件错误提示“1402”的应对方法
  14. 大数据开发离线计算框架知识点总结
  15. 从0开始使用腾讯云GPU服务器
  16. table 表格边框线去重
  17. N级台阶(比如100级),每次可走1步,2步,3步,求总共有多少种走法?
  18. 如何使用unirest
  19. PhotoShop CC2015(64位)下载链接和破解教程
  20. Python学习之绕圈圈题

热门文章

  1. Bootstrap 警告(Alerts)
  2. (脑肿瘤分割笔记:四十三)用于脑胶质瘤分割的上下文感知网络
  3. c语言编程求弧度值,求弧度计算方法.编程方面,弧度计算公式
  4. Sublime Text 3安装,使用技巧及快捷键笔记
  5. 微信公众号前后端分离项目网页授权登录问题
  6. 《the cave》攻略及感悟
  7. ECharts 学习
  8. http://s22.app1105796624.qqopenapp.com/
  9. @Linux Centos系统优化与内核参数优化详解
  10. vc 6 中使用 attach to process