SSM之MyBatis_02_06关联查询——实现一对一_扩展类的方式_(包含 super.toString( )的使用、怎么在子类里面调用父类的toString方法)

时间:2022-05-10 01:16:50


MyBatis_02_01关联查询——实现一对一

文章目录

  • MyBatis_02_01关联查询——实现一对一
  • 前言
  • 一对一 的实现 —— resultType方式实现
  • 第一步:写个订单的扩展类
  • 第二步 订单单接口和配套的映射文件
  • 第三步:加载映射文件
  • 第五步:测试
  • 一对一 的实现 —— resultMap的方式实现
  • 总结

前言

mybatis里面实现上一篇文章讲的关联查询的 一对一

一对一 的实现 —— resultType方式实现

SSM之MyBatis_02_06关联查询——实现一对一_扩展类的方式_(包含 super.toString( )的使用、怎么在子类里面调用父类的toString方法)


我们使用mybatis的时候,怎么把这个数据查出来呢

我们先不要在模型里面套模型,先写个订单的扩展类

理解为什么一定要使用扩展类,因为是联合查询,没有任何一个标准的model会有这么多字段

(标准model是跟数据库的某一张表相对应的),

它是多个表联合查出来的

复杂查询时,单表对应的po(即model类)类已不能满足输出结果集的映射。所以要根据需求建立一个扩展类来作为resultType的类型
#查找某个定单id的信息,包括用户名字和地址
SELECT o.*,u.username,u.address FROM orders o,user u
WHERE o.user_id = u.id AND o.id = 3

第一步:写个订单的扩展类

SSM之MyBatis_02_06关联查询——实现一对一_扩展类的方式_(包含 super.toString( )的使用、怎么在子类里面调用父类的toString方法)


下面我们具体写写,注意代码是活的,按照上面文档写也可以,

只要思路的对的就可以。就好像变量命名,不要求完全一致的,只要编程思想的对的即可

把之前测试的order 改个名字orders,或者新建一个model 命名为 orders

SSM之MyBatis_02_06关联查询——实现一对一_扩展类的方式_(包含 super.toString( )的使用、怎么在子类里面调用父类的toString方法)

SSM之MyBatis_02_06关联查询——实现一对一_扩展类的方式_(包含 super.toString( )的使用、怎么在子类里面调用父类的toString方法)


注意不仅要提供set/set方法 也要提供toString方法

SSM之MyBatis_02_06关联查询——实现一对一_扩展类的方式_(包含 super.toString( )的使用、怎么在子类里面调用父类的toString方法)


然后让它去继承Orders就好了,这样它就有所有的Orders的属性了,

然后我们再根据查询出来的sql 在扩展类里面添加应该新加的属性即可

SSM之MyBatis_02_06关联查询——实现一对一_扩展类的方式_(包含 super.toString( )的使用、怎么在子类里面调用父类的toString方法)


注意根据需求来

SSM之MyBatis_02_06关联查询——实现一对一_扩展类的方式_(包含 super.toString( )的使用、怎么在子类里面调用父类的toString方法)


根据需求只要加这两个就行了

SSM之MyBatis_02_06关联查询——实现一对一_扩展类的方式_(包含 super.toString( )的使用、怎么在子类里面调用父类的toString方法)


不仅要提供get./set,为了后面方便调试,还要提供toString

SSM之MyBatis_02_06关联查询——实现一对一_扩展类的方式_(包含 super.toString( )的使用、怎么在子类里面调用父类的toString方法)


super.toString( )很实用

下一步是啥?
映射文件不要忘记了

第二步 订单单接口和配套的映射文件

文档内容

SSM之MyBatis_02_06关联查询——实现一对一_扩展类的方式_(包含 super.toString( )的使用、怎么在子类里面调用父类的toString方法)


SSM之MyBatis_02_06关联查询——实现一对一_扩展类的方式_(包含 super.toString( )的使用、怎么在子类里面调用父类的toString方法)


详细讲解:

我们肯定不能还在之前的UserMapper里面去写东西

新建好OrderMapp和OrderMapp.xml

SSM之MyBatis_02_06关联查询——实现一对一_扩展类的方式_(包含 super.toString( )的使用、怎么在子类里面调用父类的toString方法)


SSM之MyBatis_02_06关联查询——实现一对一_扩展类的方式_(包含 super.toString( )的使用、怎么在子类里面调用父类的toString方法)

SSM之MyBatis_02_06关联查询——实现一对一_扩展类的方式_(包含 super.toString( )的使用、怎么在子类里面调用父类的toString方法)


SSM之MyBatis_02_06关联查询——实现一对一_扩展类的方式_(包含 super.toString( )的使用、怎么在子类里面调用父类的toString方法)

第三步:加载映射文件

SSM之MyBatis_02_06关联查询——实现一对一_扩展类的方式_(包含 super.toString( )的使用、怎么在子类里面调用父类的toString方法)


详细讲解

注意,如果别名里面已经配置了包名就不需要再配置具体的xml文件了(这块知识在前面)

SSM之MyBatis_02_06关联查询——实现一对一_扩展类的方式_(包含 super.toString( )的使用、怎么在子类里面调用父类的toString方法)

第五步:测试

SSM之MyBatis_02_06关联查询——实现一对一_扩展类的方式_(包含 super.toString( )的使用、怎么在子类里面调用父类的toString方法)


详细讲解

SSM之MyBatis_02_06关联查询——实现一对一_扩展类的方式_(包含 super.toString( )的使用、怎么在子类里面调用父类的toString方法)


SSM之MyBatis_02_06关联查询——实现一对一_扩展类的方式_(包含 super.toString( )的使用、怎么在子类里面调用父类的toString方法)


这样就实现了

这种使用扩展类的方式当然没有问题
但是我们可能会更倾向于使用下一篇文章所讲的
模型里面嵌套模型的方式

即这种方式

SSM之MyBatis_02_06关联查询——实现一对一_扩展类的方式_(包含 super.toString( )的使用、怎么在子类里面调用父类的toString方法)


下一篇文章探讨一下模型里面嵌套模型的方式

一对一 的实现 —— resultMap的方式实现

掌握association的使用

1、OrdersMapper.java添加一个方法

SSM之MyBatis_02_06关联查询——实现一对一_扩展类的方式_(包含 super.toString( )的使用、怎么在子类里面调用父类的toString方法)


2、OrdersMapper.xml

SSM之MyBatis_02_06关联查询——实现一对一_扩展类的方式_(包含 super.toString( )的使用、怎么在子类里面调用父类的toString方法)


测试

SSM之MyBatis_02_06关联查询——实现一对一_扩展类的方式_(包含 super.toString( )的使用、怎么在子类里面调用父类的toString方法)


这样就完成了

需要注意的是,resultMap还需要扩展类吗?

其实不需要了

因为

SSM之MyBatis_02_06关联查询——实现一对一_扩展类的方式_(包含 super.toString( )的使用、怎么在子类里面调用父类的toString方法)


需要改成

SSM之MyBatis_02_06关联查询——实现一对一_扩展类的方式_(包含 super.toString( )的使用、怎么在子类里面调用父类的toString方法)


我们运行项目 是死活都是报错的,看来文档没有说得很明白,留了个坑

SSM之MyBatis_02_06关联查询——实现一对一_扩展类的方式_(包含 super.toString( )的使用、怎么在子类里面调用父类的toString方法)


一对一 的实现 —— resultMap的方式实现 具体实现看下一篇文章,
这里只把疑问提出来,这样也许印象会更深刻
从来就没有一帆风顺的人生,下一篇填坑应该不算过分

总结

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

resultMap:
需要单独定义resultMap,实现有点麻烦,如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射pojo的对象属性中

resultMap可以实现延迟加载,resultType无法实现延迟加载