mybatis连表查询

1.背景介绍

什么是mybatis

mybatis是一个优秀的持久层框架,他对jdbc操作数据库的过程进行了封装,使开发着只用关注sql本身,不用去关注例如注册驱动,加载链接,得到statement,处理结果集等复杂的过程。 mybatis通过xml或者注解的方式,将要执行的各种sql语句配置起来,并通过Java对象和statement中的sql语句映射生成最终的sql语句,最后由mybatis框架执行sql语句,并将结果映射成Java对象返回。

mybatis工作原理

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

2.知识剖析

ResultMap的高级映射

1、association标签:一对一

2、collection 标签:一对多

MyBatis使用两种方式来加载联合查询:

1、Nested Select(嵌套查询):通过执行另一个返回预期复杂类型的映射SQL语句(即引用外部定义好的SQL语句块)。

2、Nested Results(嵌套结果):通过嵌套结果映射来处理联接结果集(joined results)的重复子集。

association主要属性介绍:

1、property:映射数据库列的字段或属性。如果JavaBean 的属性与给定的名称匹配,就会使用匹配的名字。否则,MyBatis 将搜索给定名称的字段。

2、column:数据库的列名或者列标签别名。

注意: 在处理组合键时,可以使用column= “{prop1=col1,prop2=col2}”这样的语法,设置多个列名传入到嵌套查询语句。这就会把prop1和prop2设置到目标嵌套选择语句的参数对象中。

3、javaType:完整java类名或别名(参考上面的内置别名列表)。如果映射到一个JavaBean,那MyBatis 通常会自行检测到。然而,如果映射到一个HashMap,那您应该明确指定javaType 来确保所需行为。

4、select(联合嵌套选择):通过这个属性,通过ID引用另一个加载复杂类型的映射语句。从指定列属性中返回的值,将作为参数设置给目标select 语句。

3.常见问题

4.解决方案

5.编码实战

6.扩展思考

7.参考文献

百度、维基、CSDN

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中的配置,进行结果的转换,构建需要的对象。

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


今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

你可能感兴趣的:(mybatis连表查询)