Mybatis 连表查询

1.背景介绍

什么是mybatis

mybatis是一个优秀的持久层框架,他对jdbc操作数据库的过程进行了封装,使开发着只用关注sql本身,不用去关注例如注册驱动,加载链接,得到statement,处理结果集等复杂的过程。 

mybatis通过xml或者注解的方式,将要执行的各种sql语句配置起来,并通过Java对象和statement中的sql语句映射生成最终的sql语句,最后由mybatis框架执行sql语句,并将结果映射成Java对象返回。
 

什么是高级映射

       对于数据库中对表的增删改查操作,我们知道增删改都涉及的是单表,而只有查询操作既可以设计到单表操作又可以涉及到多表操作,
    所以对于输入映射parameterType而言是没有所谓的高级映射的,也就是说高级映射只针对于输出映射(因为高级映射设计到多张表)。
 

2.知识剖析

mybatis工作原理

        mybatis通过配置文件创建sqlsessionFactory,sqlsessionFactory根据配置文件,配置文件来源于两个方面:一个是xml,一个是Java中的注解,获取sqlSession。
         SQLSession包含了执行sql语句的所有方法,可以通过SQLSession直接运行映射的sql语句,完成对数据的增删改查和事物的提交工作,用完之后关闭SQLSession。

mybatis解决的问题

     1.使用数据库连接池管理链接,避免了频繁创建了、关闭链接,浪费资源,影响性能的问题。
     2.用xml管理sql语句,让Java代码和sql语句分离,使得代码更易维护。
     3.解决了sql语句参数不定的问题。xml中可以通过where条件决定sql语句的条件参数。mybatis将Java对象映射到sql语句,通过statement的parameterType定义输入参数的类型。
     4.mybatis自动将结果集封装成Java对象, 通过statement的resultType定义输出的类型。避免了因sql变化,对结果集处理麻烦的问题。
 

扫描二维码关注公众号,回复: 2695052 查看本文章

3.常见问题

什么是外键?

mybatis多表联查用什么类型接收?

4.解决办法

     1.A表中的一个字段,是B表的主键,那他就可以是A表的外键。表的外键是另一表的主键, 外键可以有重复的, 可以是空值
     2.resultType和resultMapl类型
            resultType:要自定义pojo 保证sql查询列和pojo的属性对应,这种方法相对较简单,所以应用广泛。
           resultMap:使用association完成一对一映射需要配置一个resultMap标签,过程有点复杂,如果要实现延迟加载就只能             用resultMap实现 ,如果为了方便对关联信息进行解析,也可以用association将关联信息映射到pojo中方便解析。
 

5.编码实战

6.扩展思考

一对一查询:用assocation

一对多查询:collection

7.参考文献

外键关联

https://blog.csdn.net/ccsuxwz/article/details/70157911

师兄PPT

Mybatis高级映射

http://codingxiaxw.cn/2016/11/09/37-mybatis%E5%AE%9E%E7%8E%B0%E9%AB%98%E7%BA%A7%E6%98%A0%E5%B0%84/

更多问题:

1)mybatis解决的问题

1)使用数据库连接池管理链接,避免了频繁创建了、关闭链接,浪费资源,影响性能的问题。

2)用xml管理sql语句,让Java代码和sql语句分离,使得代码更易维护。

3)解决了sql语句参数不定的问题。xml中可以通过where条件决定sql语句的条件参数。mybatis将Java对象映射到sql语句,通过statement的parameterType定义输入参数的类型。

4)mybatis自动将结果集封装成Java对象, 通过statement的resultType定义输出的类型。避免了因sql变化,对结果集处理麻烦的问题。

(2)mybatis多表联查用什么类型接收?

有两种方式:1.通过自定义resultMap接收; 2.通过resultType=java.util.Map接收;

(3)嵌套查询的N+1问题?

尽管嵌套查询大量的简化了存在关联关系的查询,但它的弊端也比较明显:即所谓的N+1问题。关联的嵌套查询显示得到一个结果集,然后根据这个结果集的每一条记录进行关联查询。

假设嵌套查询就一个(即resultMap 内部就一个association标签),现查询的结果集返回条数为N,那么关联查询语句将会被执行N次,加上自身返回结果集查询1次,共需要访问数据库N+1次。如果N比较大的话,这样的数据库访问消耗是非常大的。所以使用这种嵌套语句查询应确保N值不会很大。

(4)嵌套结果查询与嵌套查询的区别?

嵌套语句的查询会导致数据库访问次数不定,进而有可能影响到性能。嵌套结果的查询:即对于一对多,多对多,多对一的情况的查询,Mybatis通过联合查询,将结果从数据库内一次性查出来,然后根据其一对多,多对一,多对多的关系和ResultMap中的配置,进行结果的转换,构建需要的对象。

对于关联结果的查询,只需要查询数据库一次,然后对结果的整合和组装全部放在了内存中

                                                                                                                                                                 鸣谢

                                                                                                                                                  感谢观看,如有出错,恳请指正

                                                                                                                                                                            BY : 白晨松

猜你喜欢

转载自blog.csdn.net/qq_39691226/article/details/81479760