Mybatis基础(二)
关联查询映射
数据库结构
数据库表之间有外键关系的业务关系
(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基础(二)相关推荐
- java mybatis基础
java mybatis基础 1.1 什么是mybatis? mybatis是一个优秀的持久层框架. 避免几乎所有的JDBC代码和手动设置参数以及获取结果集的过程. 可以使用简单的xml或者注解来配置 ...
- 大数据WEB阶段Mybatis(二)
Mybatis(二) 零.目录 Mybatis接口形式 Mybatis整合Spring Mybatis的缓存机制 手动封装结果集 一对一表操作 一对多表操作 多对多表操作 SpringMVC . Sp ...
- javaweb实训第六天下午——Mybatis基础
Mybatis基础 1.课程介绍 2.为什么需要Mybatis 3.初识Mybatis 3.1.Mybatis是什么 3.1.1.什么是框架 3.1.2.什么叫数据库持久化 3.1.3.什么是ORM ...
- MyBatis基础篇
MyBatis基础篇 简介 注意:本篇文章主讲语法,jar包导入大家可以在网上搜索(有问题一定要学会利用搜索引擎解决!!!),全程代码会写到文章中. 1. MyBatis是一个半自动ORM框架(作为解 ...
- Mybatis基础学习之一级缓存和二级缓存的简单使用
前言: 小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师. 这个Mybatis ...
- 蓝鸥Unity开发基础二——课时20 接口
蓝鸥Unity开发基础二--课时20 接口 一.接口 使用interface关键字定义接口 接口定义一组成员单不直接实现它们 二.实现接口 实现接口的任何类都必须实现其所有的成员方法 接口不能直接实例 ...
- MyBatis基础入门《九》ResultMap自动匹配
MyBatis基础入门<九>ResultMap自动匹配 描述: Mybatis执行select查询后,使用ResultMap接收查询的数据结果. 实体类:TblClient.java 接口 ...
- shell基础二十篇 一些笔记
shell基础二十篇 转自 http://bbs.chinaunix.net/thread-452942-1-1.html 研讨:Bash 内建命令 read (read命令更具体的说明见博客收藏的一 ...
- Mybatis基础:增删改查、模糊查询、多条件查询
Mybatis基础:增删改查.模糊查询.多条件查询http://www.bieryun.com/3132.html 1.新建测试数据库,根据实体类属性创建 2.实体类 [java] view plai ...
- Bootstrap基础二十七 多媒体对象(Media Object)
Bootstrap<基础二十七> 多媒体对象(Media Object) 原文:Bootstrap<基础二十七> 多媒体对象(Media Object) Bootstrap 中 ...
最新文章
- Intel 6系列芯片组设计缺陷 全球出货暂停
- [BTS]BizTalk学习之Functoid篇(ID Cross-References)
- 困难样本挖掘(Online Hard Sample Mining)
- BZOJ1021 [SHOI2008]循环的债务
- GIT学习笔记二(本地项目发布到GIT)
- centos linux 系统日常管理4 scp,rsync,md5sum,sha1sum,strace ,find Rsync 常见错误及解决方法 第十七节课...
- 【Tensorflow】Tensor的比较运算
- 补遗篇之volatile
- python加减乘除符号_Python项目如何合理组织规避import天坑
- UPUPW数据库密码的修改
- GhostNet 解读及代码实验(附代码、超参、日志和预训练模型)
- 做一款仿映客的直播App
- 一个萌新关于电脑安装软件错误提示“1402”的应对方法
- 大数据开发离线计算框架知识点总结
- 从0开始使用腾讯云GPU服务器
- table 表格边框线去重
- N级台阶(比如100级),每次可走1步,2步,3步,求总共有多少种走法?
- 如何使用unirest
- PhotoShop CC2015(64位)下载链接和破解教程
- Python学习之绕圈圈题
热门文章
- Bootstrap 警告(Alerts)
- (脑肿瘤分割笔记:四十三)用于脑胶质瘤分割的上下文感知网络
- c语言编程求弧度值,求弧度计算方法.编程方面,弧度计算公式
- Sublime Text 3安装,使用技巧及快捷键笔记
- 微信公众号前后端分离项目网页授权登录问题
- 《the cave》攻略及感悟
- ECharts 学习
- http://s22.app1105796624.qqopenapp.com/
- @Linux Centos系统优化与内核参数优化详解
- vc 6 中使用 attach to process