所谓的一对一查询,就是说我们在查询一个表的数据的时候,需要关联查询其他表的数据。

 需求

    首先说一个使用一对一查询的小需求吧:假设我们在查询某一个订单的信息的时候,需要关联查询出创建这个订单对应的用户信息。表模型如下(

    

 ResultType

  sql语句的书写

    首先,我们要对我们的需求进行分析。1.我们需要确定这个需求需要涉及到哪两张表,其中哪个是主表,哪个是关联表。具体怎么确定,还是看需求——我们的需求是说,在查询订单的时候,顺带着查出创建这个订单的用户。那么,已经很显然了。我们的主表是订单表(orders)。而我们的关联表则是用户表(user)。

    这个时候,我们就可以写出来如下sql语句了:

    select * from orders

    这个时候,我们就应该考虑这个问题了:我们在关联查询的时候应该使用内链接?还是外链接?对于搞不清内链接外链接的区别的同学,我这里先简单的介绍一下,等以后有时间了,再详细写一篇博客说明:内连接是只显示满足条件的。外链接分为左外和右外链接:左连接显示左边全部的再加上右边与左边相同的;右连接显示右边全部的和左边与右边相同的。

  我们的需求是通过订单去关联用户,而由于在orders表中有一个外键(userId)。通过外键的去查关联表user表的数据时,userId是user表的主键。这时,只能查到一条user的信息,而这条记录不会导致我们的主查询结果发生改变。所以,我们选择内链接查询。这时候,我们的sql语句是这样的:

  select * from orders,user where orders.user_id = user.id

    查询完成后,出现结果如下:

    

    这时,问题来了,我们发现,这个时候出现了两个id,这就会导致我们的数据在输出的时候封装到对象时会出现问题。而且,User_id 这一列和我们的用户id数据是重复的。我们需要改造我们的sql。怎么改造呢?

    因为我们的主表数据是要全部查询的,而用户表我们只需要username,sex,adress这三个信息(这里是假设,没必要纠结需要的是啥信息)。那么我们就需要手动指定我们的sql语句的查询字段了:

    

 SELECT
orders.*,
USER.username,
USER.sex,
USER.address
FROM
orders,
USER
WHERE orders.user_id = user.id

最终的sql语句

    前面的这些都是在我们的sql链接工具上进行查询的,当可以显示我们需要的数据库后,我们的sql语句就确定了。这时我们该开始下一步了:

  创建pojo

    我们需要将查询到的结果,通过mybatis框架将数据封装到对应的对象。那么,问题来了,这个查询到的数据由谁来接收?我们如果要将上边sql查询的结果映射到pojo中,pojo中必须包括所有查询列名。但是不管是原来的Orders类还是User类,都没有办法映射全部的字段。这时,我们有一个很简单的解决办法:根据返回的字段,专门写一个类,让它包含所有的查询结果,然后让这个类去接收这个返回的结果集。

    这时有个小技巧,我们的新的pojo中,不需要将所有的字段全部都写上,我们可以让新pojo去继承我们的包含结果集中查询字段较多的一个类,然后将其他需要的数据写到这个子类中即可。

    

    创建pojo完成后,我们就需要根据规范去创建我们的映射文件和写对应的接口中的方法:

    mapper.xml

    

    mapper.java中的接口:

    

 ResultMap

    sql语句上,resultType 和resuleMap实现的方式一样,这里就直接跳过了。

  使用resultMap映射的思路

    我们知道,使用pojo的时候,我们可以将一些数据封装到pojo的对象属性中,他的属性可以是简单类型,也可以是另外一个pojo。这时,我们可以这么做:

    使用resultMap将查询结果中的订单信息映射到Orders对象中,在orders类中添加User属性,将关联查询出来的用户信息映射到orders对象中的user属性中。

    Orders类中添加user属性

    

  mapper.xml

    用resultMap的方法将结果集进行映射的时候,我们需要进行两个操作,一个是定义resultMap,设置每个查到的结果集中的列相对应的对象的属性。这个比较麻烦但是不难。二就是定义我们的statement。

   resultMap

    resultMap实现的基本思路我们刚才已经说了。而且也在orders的pojo类中增加了相应的属性了。接下啦,就是写一个resultMap,将整个查询的结果映射到Orders中在这里面,首先是order订单的映射。就是直接用id 和result标签将两者相互对应即可。然后就是,关联的用户信息的映射,这时候需要用到一个association的标签,将在orders类中的user字段与User类进行映射,然后在其内部还是用id和result标签,将查询的数据和User的属性相映射。

    具体代码如下:

    

 <!-- 订单查询关联用户的resultMap
将整个查询的结果映射到cn.mybatis.po.Orders中
-->
<resultMap type="cn.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中哪个属性
-->
<association property="user" javaType="cn.mybatis.po.User">
<!-- id:关联查询用户的唯 一标识
column:指定唯 一标识用户信息的列
javaType:映射到user的哪个属性
-->
<id column="user_id" property="id"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/> </association>
</resultMap>

resultMap代码

   statement

    statement比较简单,就是将返回结果集的映射方式改成resultMap。然后将返回类型只想我们刚完成的resultMap就可以了。

    

  mapper.java

    

 两者的区别

    实现一对一查询的方法说完了,接下来分析下它们的不同之处,和优劣之处。

    首先,都需要对pojo进行修改,一个是增加一个pojo类另外一个则是修改pojo的字段。个人感觉,根据设计模式中的开闭原则。resultType要比resultMap更好一些。

    其次,简易程度上来说,使用resultType实现较为简单。从这点讲,resultType也要比resultMap更好一些。

    不过resultMap可以实现延迟加载,resultType无法实现延迟加载。这方面resultType就不如resultMap更好了。

    所以:建议大家,如果没有查询结果的特殊要求的话使用resultType。

mybatis进阶--一对一查询的更多相关文章

  1. Mybatis实现一对一查询 对ResultType和ResultMap分析

    实现一对一查询: ResultMap:使用ResultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加 列名对应的属性,即可完成映射. 如果没有查询结果的特殊要求建议使用Resul ...

  2. mybatis处理一对一查询

    有班级表,老师表,要求给定班级id查出班级信息和班级对应的老师信息 1.使用嵌套结果方式 sql语句: <select id="findClasses" parameterT ...

  3. Mybatis进阶学习笔记——关系查询——一对一查询

    用户和订单的需求 通过查询订单,查询用户,就是一对一查询 (1)自定义JavaBean(常用,推荐使用) <select id="queryOrderUser" result ...

  4. mybatis进阶案例之多表查询

    mybatis进阶案例之多表查询 一.mybatis中表之间的关系 在数据库中,实体型之间的关系主要有如下几种: 1.一对一 如果对于实体集A中的每一个实体,实体集B中至多有一个(也可以没有)实体与之 ...

  5. Mybatis高级查询之一对一查询的四种方法

    目录 1. 一对一查询 1.1 一对一嵌套结果查询 1.2 使用resultMap配置一对一映射 1.3 使用resultMap的association标签配置一对一映射 1.4 associatio ...

  6. mybatis进阶--一对多查询

    首先,我们还是先给出一个需求:根据订单id查询订单明细——我们知道,一个订单里面可以有多个订单的明细(需求不明确的同学,请留言或者去淘宝网上的订单处点一下就知道了).这个时候,一个订单,对应多个订单的 ...

  7. MyBatis:一对一关联查询

    MyBatis从入门到放弃三:一对一关联查询 前言 简单来说在mybatis.xml中实现关联查询实在是有些麻烦,正是因为起框架本质是实现orm的半自动化. 那么mybatis实现一对一的关联查询则是 ...

  8. mybatis的一对一,一对多查询,延迟加载,缓存介绍

    一对一查询 需求 查询订单信息关联查询用户信息 sql语句 /*通过orders关联查询用户使用user_id一个外键,只能关联查询出一条用户记录就可以使用内连接*/ SELECT orders.*, ...

  9. MyBatis一对一查询

    ---------------------siwuxie095                                 MyBatis 一对一查询         以订单和用户为例,即 相对订 ...

随机推荐

  1. 内层div的margin-top影响外层div——引出外边距合并Collapsing margins

    内层div的margin-top影响外层div——引出外边距合并Collapsing margins 作者:zccst 今天才算是了解边距合并.正如一位前辈所言,每一个CSS的坑,都让你学到不少知识. ...

  2. 在GitHub上创建上传下载开源项目代码

    1.注册GitHub帐号,创建GitHub项目代码仓库 1.1.注册GitHub帐号 在使GitHub之前,需要先登录其官网注册一个免费使用的账号.登录 https://github.com/join ...

  3. 微信小程序之----video视频播放

    vidao 我现在看到的官方文档是不带danmu(弹幕)属性的,之前是有的,不过现在这个属性还可以生效.控制视频的状态可以根据video标签的唯一id得到一个对象实例.video组件并不具备actio ...

  4. access 随机选取数据

    access随机读取数时 用order  by  rnd(id)   发现每次获取的数据顺序都是一致的,必须要加上随机数才可以,如下: Random r = new Random();         ...

  5. Python3基础 用 while循环实现 斐波那契数列

    镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...

  6. 让win7安装时出现版本选项

    win7有几种版本,win7旗舰版包含各大版本,修改一下ISO,让安装时出现版本选项窗口: 1.准备好一个官方win7旗舰版安装包IOS光盘镜像. 2.用UltraISO打开光盘镜像并删除source ...

  7. vim列编辑

    命令模式下:ctrl + v(我在gvim,win7中是ctrl +shift + q)进入列编辑模,选中要编辑的行(j 上,k下) 输入 “I” (大写的 I,光标定位到选中的第一行),输入要编辑的 ...

  8. violin 结构介绍

    参考:http://www.iqiyi.com/w_19rt9yvv9p.html 主要结构有:琴身.指板.腮托.琴马.琴弦.琴轴

  9. iOS 之 Strong与Weak,_unsafe _unretained与weak区别

    1. 在ARC中 strong(强引用) 相当于retain, weak(弱引用) 相当于assign.ARC下,strong告诉编译器自动插入retain.但是在ARC下,代理协议的属性依然用ass ...

  10. hcharts中文网 一个js图表库

    http://www.bossidc.com/info/gongju/2013/0717/2133.html   hcharts源码包下载 http://www.hcharts.cn/demo/hig ...