mybatis一对一查询功能

发布时间 - 2026-01-10 23:08:18    点击率:

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

 需求

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

 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语句就确定了。这时我们该开始下一步了:

   创建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>

   statement

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

  mapper.java    

 两者的区别

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

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

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

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

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

以上所述是小编给大家介绍的mybatis一对一查询功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# mybatis  # 一对一查询  # 关于mybatis一对一查询一对多查询遇到的问题  # Mybatis一对一延迟加载实现过程解析  # mybatis 一对一、一对多和多对多查询实例代码  # mybatis实现一对一关联映射实例代码  # Mybatis 中的一对一  # 一对多  # 多对多的配置原则示例代码  # Mybatis中的高级映射一对一、一对多、多对多  # MyBatis一对一映射初识教程  # MyBatis图文并茂讲解注解开发一对一查询  # 类中  # 查询结果  # 我们可以  # 这个时候  # 要将  # 来了  # 多个  # 则是  # 是说  # 要比  # 另外一个  # 小编  # 就可以  # 象中  # 的是  # 这时候  # 加载  # 这一  # 完成后  # 好了 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  济南网站建设制作公司,室内设计网站一般都有哪些功能?  如何快速搭建高效WAP手机网站?  如何用腾讯建站主机快速创建免费网站?  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  长沙企业网站制作哪家好,长沙水业集团官方网站?  如何快速生成专业多端适配建站电话?  如何在腾讯云免费申请建站?  如何在景安云服务器上绑定域名并配置虚拟主机?  桂林网站制作公司有哪些,桂林马拉松怎么报名?  如何挑选高效建站主机与优质域名?  网站建设要注意的标准 促进网站用户好感度!  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  进行网站优化必须要坚持的四大原则  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  如何在Ubuntu系统下快速搭建WordPress个人网站?  JavaScript如何实现错误处理_try...catch如何捕获异常?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  JavaScript如何实现音频处理_Web Audio API如何工作?  EditPlus中的正则表达式实战(5)  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  怎么用AI帮你设计一套个性化的手机App图标?  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  如何为不同团队 ID 动态生成多个独立按钮  如何在IIS中新建站点并解决端口绑定冲突?  JavaScript常见的五种数组去重的方式  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  如何快速生成凡客建站的专业级图册?  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  Laravel怎么连接多个数据库_Laravel多数据库连接配置  Thinkphp 中 distinct 的用法解析  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  Swift中循环语句中的转移语句 break 和 continue  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  如何在搬瓦工VPS快速搭建网站?  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  如何在Windows服务器上快速搭建网站?  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  网站建设保证美观性,需要考虑的几点问题!  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  如何基于云服务器快速搭建网站及云盘系统?  使用Dockerfile构建java web环境