2.Mybatis动态sql的多表 *** 作 8.13

2.Mybatis动态sql的多表 *** 作 8.13,第1张

1.想要重用sql, 要先定义通用的sql,在之后的sql语句中调用通用的sql的ID就行

调用时注意各标签 

测试

2.多标签查询

表结构

2.1      一对一

bean:

接口:

配置文件:

如果查询语句中,列起别名的话,column要对应起别名之后的名字

测试:

单表 *** 作 的时候,除了用配置文件来完成sql,还有另一种方法,是在用spring的 注解 以后,可以用 注解 来完成。

不用在mapper下写映射文件,直接在接口的方法上写sql

拿elm的spring boot来举例

2.2    一对多 

bean:

接口:

配置:

测试:

结果为四条,在结果里

2.3    多对多

bean:

用户通过订单,订单通过明细,明细通过商品,来找到用户对应商品的关系

接口:

配置:

1.JavaType和ofType属性

JavaType和ofType都是用来指定对象类型的,但是 JavaType 是用来指定pojo中 属性的类型 ,而 ofType 指定的是映射到 list集合属性中pojo的类型 。

mybatis

一对多用collection

多对一用assocation

想象一下你在淘宝,在购买东西后会有个订单支付的页面,下单后用户和订单就关联起来了,同时订单有一个唯一的编号叫订单号。用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户

一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户

即 order对user是一对一的,反过来,user对order是一对多的

select * ,o.id oid from orders o,user u where o.uid=u.id

这个查询结果看起来很怪,有很多个id,不着急,后面我们在进行配置文件的配置的时候可以将id忽略。

User和以前一样

测试

或者通过

<association>标签配置user

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户

一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单

select *,o.id oid from user u,orders o where u.id = o.id

打印结果

再来假设一个场景,小明是一个学生,他同时是班干部和学生会的干部,而学生会干部可以有多个学生,这样学生和学生会干部表就构成了多对多的关系

用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用

多对多查询的需求:查询用户同时查询出该用户的所有角色

要实现这种多对多的关系,我们不仅需要role角色表,也需要一个中间表,用户和角色表之间的桥梁——用户id和角色id对应的表。

select u.*,r.*,r.id rid,u.id uid from user u left join user_role ur on u.id=ur.uid inner join role r on ur.rid=r.id

select * from user u,user_role ur,role r where u.id = ur.uid and ur.rid =r.id

User类添加

UserMapper接口添加

配置sqlMapperConfig.xml,给Role增加别名

这几年来注解开发越来越流行,Mybatis也可以使用注解开发方式,这样我们就可以减少编写Mapper映射文件了。

我们先围绕一些基本的CRUD来学习,再学习复杂映射多表 *** 作。

修改MyBatisTest.java,将公共 *** 作抽取出来

删除了之后,我们没有了配置文件了呀,那怎么做呢。

我们之前在sqlMapperConfig.xml里面配置了

删除了之后我们就得加载映射关系,指定接口所在的包

没有问题!说明可以运行。

实现复杂关系映射之前我们可以在映射文件中通过配置<resultMap>来实现,使用注解开发后,我们可以使用

@Results注解,@Result注解,@One注解,@Many注解

组合完成复杂关系的配置

前面我们用配置文件的方式实现了order和user的一对多查询,同样的我们也可以使用注解实现。

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户

一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户

对应的sql语句:

测试

两个都可以正常运行。

我们上面的查询方式是一次查两张表,但是我们也可以通过查order表获取uid,再通过uid去查user表,这种方法怎么实现呢?

不知道你还记不记得,前面我们使用了<association>进行order和user表的一对一查询的封装,前面图中提到了@One属性,就是它的一种替代

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户

一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单

可能这种方式用的比较多

对应的sql语句:

给OrderMapper.java增加一个查询方法

修改UserMapper.java

但是这种方法,其实是查到了所有的user,其中有些有orderList,原因在于这其实是一种按顺序的查询方式,先查了user表再查了order表

select *,o.id oid from user u,orders o where u.id = o.id 是不一样的

再来回顾一下多对多的查询

用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用

多对多查询的需求:查询用户同时查询出该用户的所有角色

对应的sql语句:

这样子,就有个很怪的问题,注解查询每次都返回了全部的user,我不需要这么多的user啊,我只想要和role关联的那几个user,这会是一个好的方法吗。

GitHub: github.com/hsowan/soms

Supermarket Orders Management System 超市订单管理系统

使用MyBatis

Refer: www.mybatis.org/mybatis-3/z…

类型别名是你的好帮手。使用它们,你就可以不用输入类的完全限定名称了。比如:

Refer: logging.apache.org/log4j/2.x/m…

Command + D

Refer: www.cnblogs.com/TankXiao/p/…

Shift + Command + F

MyBatis 核心配置

Refer: www.mybatis.org/mybatis-3/z…

Refer: www.mybatis.org/mybatis-3/z…

添加下面的插件到pom.xml中:

执行单元测试: mvn test

Refer: maven.apache.org/surefire/ma…

mvn install -DskipTests

Refer: maven.apache.org/surefire/ma…

Refer: my.oschina.net/u/3805464/b…

动态SQL

www.mybatis.org/mybatis-3/z…

改写UserMapper.xml:

改写单元测试 testListByUsername( 使用map进行传参 ):

执行结果:

添加单元测试 testListByUsernameUsingLimit:

执行结果:

修改UserMapper.xml:

修改单元测试 testListByUsername():

执行结果:

查询user表中id小于5的记录

使用in的查询执行计划(QEP):

使用的QEP:

使用between的QEP:

分析: 使用in作为查询条件时没有使用索引而进行了全表扫描(ALL), 使用和between作为查询条件时使用到主键索引以及索引范围扫描, 所以三者比较in的执行效率是最低的

www.mybatis.org/generator/c…

问题:

mybatis-generator-core:

mybatis-generator-maven-plugin:

Refer:

修改依赖版本(pom.xml):

修改驱动路径(db.properties):

github.com/hsowan/jwt-…

作者:K8sCat

链接:https://juejin.cn/post/7056040075947147295


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11887895.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-19
下一篇2023-05-19

发表评论

登录后才能评论

评论列表(0条)

    保存