mybatis in查询怎么写_Java学习之——MyBatis多表关联查询

cb0f61454eafd409286017cbeacae3c5.png

要求,我们要从下面的两张表中,查找信息(这里返回的信息是两张表的, 怎么办?之前我们都是一张表):

班级表:

89e4094cea75a07f3b57a0f2fed92964.png

学生表:

5f44221c8d1cd15eebf5e144121f9170.png

定义两个Java中的类:

班级类:

954389a7ae81b0190a069be2887aaa15.png

学生类:

fb60e77cdf874d84af304dfac155fa1e.png

1、我们要查找学生的信息,注意上面的图,学生信息里面还封装了班级的信息,我们怎么办?

1、)我们可以使用业务装配方式

提取业务到业务层,关键代码如下:

e2b033b9ad21a1598f56d38a2ac6f622.png

分别在班级mapper和学生mapper里面写

24f924687bdaa9802ed07121158790fc.png

8e06d7d7725669c39e2eae987e4d2ff0.png

运行效果:

e3a91a54a0c984f2eb602700cec8102e.png

实际上,就相当于是我们先查询学生表t_student,然后遍历查询到得到学生集合,通过传学生的cid去查课程表信息

2、多表关联查询resultMap_单个对象——N+1方式实现

我们在学生的StudentMapper.xml中,这样配置

b52adb15de964dfd61925ca4aedb4c3f.png

这里解释一下:本来select标签的resultType是自动映射,这里我们使用的是resultMap,resultMap中关联(association)另外一个对象的语句,(没有自动映射了)

37bcbb673b041ba0f5c074ce59379107.png

37c6518544e8c84286f368787d8b9692.png

测试结果:

f3a854dfa6d8c4cd83ca383ddb9dc820.png

什么是N+1,因为这里只查询了一次学生表,查询了N次班级表,所以叫做N+1模式

3、我们这里也可以不使用N+1模式,只查询一次那就得让查询语句变一下就好了

cda5659883c229e7ec49600514437876.png

我们看到,SQL语句变为了两表连接查询,得到的返回结果是一个student对象,但是这里注意,每个学生对象里面还有一个班级的信息,这里使用了association标签

通过<resultMap>定义映射关系, 并通过<association>指定对象属性的映射关系. 可以把<association>看成一个<resultMap>使用. javaType 属性表示当前对象, 可以写全限定路径或别名.

40362848f23e143307586a84997e3b28.png

运行结果:

dc5fdfd76fe9adf4dc8c225a75786598.png

2、我们现在要查询班级的信息,注意了,这次班级里面包含有学生的信息,和前面的换了,看类:

班级类:

ac44363bc682704a2c71bffe5de1b0e6.png

学生类:

a3b4a81df7db381eabd8095a9ffa870a.png

学生类中已经没有了班级信息了

2.1首先肯定是N+1模式查询班级的信息

ClassMapper.xml配置文件:

e5689347dcf7b933ad726e0e793ff74f.png

它返回值类型还是resultMap,它引用了StudentMapper.xml中的查询

28bc021b2aa82ae5ee5aca96dce9d307.png

运行结果:

84a17697be2c9e16698c778fcc257d79.png

查询了一次班级信息,再根据班级的cid去查找对应班级的学生生息,所以也是N+1

但是这里注意了,之前我们查询学生的时候,一个学生对应一个班级,我们使用association标签,它就是对应一个对象的,这里一个班级对应多个学生,这里的是集合,我们得用collecttion标签

2、1现在我们也可以使用多表联查

b42714981433d2f5cf81334f6eb8853b.png

注意colletion标签

3、我们也可以使用Auto-Mapping配合别名实现

cf37b11e07d31b3db0f45b9f4f6bf28b.png

fabce652009352d6c99faf70ab2b82c2.png

我们不用那么复杂,直接这样写就可以了

092387a66943562cf9f80595f1adddf4.png

说明:ResultType是自动映射的,

a) 通过 MyBatis 的 Auto-Mapping 机制及数据库查询时的别名结合, 可以方便的实现多表查询.

b) SQL 语句中, 别名出现特殊符号时, 必须进行处理. MySQL可以使用(``)符号(左上角1数字旁边那个键), Oracle 可以使用("")符号.

总结:

associattion 是关系 一个学生对象中包含有一个班级对象

collection 是集合 一个班级对象包含有多个学生对象

ResultType 自动映射

ResultMap 手动映射

MyBatis多表联查练习​pan.baidu.com

提取码:ur2z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值