【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】前端
八个方面深度解析前端知识/技能,本篇分享的是:java
【mybatis连表查询 】程序员
你们好,我是IT修真院武汉分院的15期学员,一枚正直纯洁善良的JAVA程序员。 本次为你们带来关于深度思考的一个问题,咱们为何要使用mybatis连表查询?sql
(1)背景介绍数据库
什么是mybatis mybatis是一个优秀的持久层框架,他对jdbc操做数据库的过程进行了封装,使开发着只用关注sql自己,不用去关注例如注册驱动,加载连接,获得statement,处理结果集等复杂的过程。 mybatis经过xml或者注解的方式,将要执行的各类sql语句配置起来,并经过Java对象和statement中的sql语句映射生成最终的sql语句,最后由mybatis框架执行sql语句,并将结果映射成Java对象返回。 什么是高级映射 对于数据库中对表的增删改查操做,咱们知道增删改都涉及的是单表,而只有查询操做既能够设计到单表操做又能够涉及到多表操做, 因此对于输入映射parameterType而言是没有所谓的高级映射的,也就是说高级映射只针对于输出映射(由于高级映射设计到多张表)。 session
(2).知识剖析 mybatis
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变化,对结果集处理麻烦的问题。 框架
(3).常见问题 什么是外键? mybatis多表联查用什么类型接收?性能
(4).解决办法 编码
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... 师兄PPT
Mybatis高级映射 http://codingxiaxw.cn/2016/11...
(8)更多问题:
(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中的配置,进行结果的转换,构建须要的对象。 对于关联结果的查询,只须要查询数据库一次,而后对结果的整合和组装所有放在了内存中
鸣谢感谢观看,若有出错,恳请指正