一:引言
在学习完前面的mybatis基本语法后,大家都有个认知,这个Mybatis太强大了,比之前使用JDBC写方便多了,但是你们当初在使用原生JDBC写SQL查询的时候有没有遇到过多表查询呢?肯定大部分人都遇到过,我刚学JDBC的时候遇到多表查询我懵了,不知道如何应对,所以我就默默的执行2条SQL语句,分别查询不同的表,然后对这2个查询出来的数据通过java代码控制,使封装到对象中,这个简直要崩溃的感觉,但是学完Mybatis多表查询后,你会爱上Mybatis的
准备工作:我已经准备好了一对一、一对多、多对多的数据表以及基本的Mybatis的搭建,后面的一些操作我会围绕这上面的数据表开展讲解,希望可以理解
二:Mybatis的高级映射
在前面的Mybatis基本使用中映射做过了初步的解释,但是在这我要把Mybatis的映射的参数做个详细的介绍,其实高级映射是通过resultMap标签完成的,而且也是最重要的部分,是为多表查询做个铺垫,所以搞懂Mybatis高级映射是很有必要的!
其实resultMap元素有很多子元素和一个值得讨论的结构。下面是 resultMap 元素的概念视图
constructor – 类在实例化时,用来注入结果到构造方法中
idArg – ID 参数;标记结果作为 ID 可以帮助提高整体效能
arg – 注入到构造方法的一个普通结果
id – 一个 ID 结果;标记结果作为 ID 可以帮助提高整体效能
result – 注入到字段或 JavaBean 属性的普通结果
association – 一个复杂的类型关联;许多结果将包成这种类型嵌入结果映射 – 结果映射自身的关联,或者参考一个
collection – 复杂类型的集,嵌入结果映射 – 结果映射自身的集,或者参考一个
discriminator – 使用结果值来决定使用哪个结果映射
case – 基于某些值的结果映射,嵌入结果映射 – 这种情形结果也映射它本身,因此可以包含很多相同的元素,或者它可以参照一个外部的结果映射。
1:id和result
<id column="sid" property="id"></id>
<result column="sname" property="name"></result>
这些是结果映射最基本内容。id 和 result 都映射一个单独列的值到简单数据类型(字符串,整型,双精度浮点数,日期等)的单独属性或字段。
这两者之间的唯一不同是 id 表示的结果将是当比较对象实例时用到的标识属性。这帮助来改进整体表现,特别是缓存和嵌入结果映射(也就是联合映射)。
1 ①:property 2 映射到列结果的字段或属性。如果匹配的是存在的,和给定名称相同 3 的 JavaBeans 的属性,那么就会使用。否则 MyBatis 将会寻找给定名称 4 的字段。这两种情形你可以使用通常点式的复杂属性导航。比如,你 5 可以这样映射一些东西:“username” 6 ②:column 7 从数据库中得到的列名,或者是列名的重命名标签。这也是通常和会 8 传递给 resultSet.getString(columnName)方法参数中相同的字符串。 9 ③:javaType 10 一个 Java 类的全限定名,或一个类型别名(参加上面内建类型别名 11 的列表)。如果你映射到一个 JavaBean,MyBatis 通常可以断定类型。 12 然而,如果你映射到的是 HashMap,那么你应该明确地指定 javaType 13 来保证所需的行为。 14 ③:jdbcType 15 在这个后会列出所支持的 JDBC 类型列表中的类型。JDBC 类型是仅 16 仅需要对插入,更新和删除操作可能为空的列进行处理。这是 JDBC 17 的需要,而不是 MyBatis 的。如果你直接使用 JDBC 编程,你需要指定 18 这个类型-但仅仅对可能为空的值。 19 ④:typeHandler 20 我们在前面讨论过默认的类型处理器。使用这个属性,你可以覆盖默 21 认的类型处理器。这个属性值是类的完全限定名或者是一个类型处理 22 器的实现,或者是类型别名