mybatis连表查询

大家好,我是IT修真院武汉分院第14期的学员,一枚正直纯洁善良的JAVA程序员

1.背景介绍

什么是mybatis
MyBatis是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。 MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java对象)映射成数据库中的记录。 每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。 SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。 用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpath resource), 但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。MyBatis有一个实用类----Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。

2.知识剖析

mybatis的特点 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习, 易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。 通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。 解除sql与程序代码的耦合:通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。 提供映射标签,支持对象与数据库的orm字段关系映射 提供对象关系映射标签,支持对象关系组建维护 提供xml标签,支持编写动态sql。

3.常见问题

1)连表查询用什么类型接收?

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

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

4.解决方案

1.通过自定义resultMap接收; 通过resultType=java.util.HashMap接收

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

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

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

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

5.编码实战

6.扩展思考

自定义resultMap和hashmap的优劣

在自定义的resultMap中第一列通常是主键id,那么id 和result有什么区别呢?

id和result都是映射单列值到一个属性或字段的简单数据类型。

唯一不同是。id是作为唯一标识的,当和其他对象实例对比的时候,这个id很有用,尤其是应用到缓存和内嵌的结果映射。

property: 映射数据库列的字段或属性,如果JavaBean的属性与给定的名称匹配,就会使用匹配的名字,否则MyBatis将搜索给定名称的字段,两种情况下你都可以使用逗点的属性形式,比如,你可以映射到“”username:,也可以映射到“address.street.number”

column:数据库的列名或者列标签别名,与传递个resultSet.getString(columnName)的参数名称相同。

javaType:完整java类名或者别名,如果映射到一个JavaBean,那么MyBatis通常会自行监测到。然而如果映射到一个HashMap,那应该明确指定javaType来确保所需行为。

jdbcType;支持的jdbc类型,这个属性只在insert,update,delete的时候针对允许空的列有用,JDBC需要这项,但Mybatis不需要,如果直接编写JDBC代码,在允许为空值的情况下需要指定这个类型。

7.参考文献

参考一:http://blog.csdn.net/woshixuye/article/details/27521071

8.更多讨论
欢迎大家交流和讨论

鸣谢
感谢大家观看

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