1.实现映射
Mybatis的最大魅力就在于它的语句映射。实现映射一般有一下三种方法:
当我们在数据库的列名和java中的属性名完全相同时,mybatis会自动映射并将查询结果封装。
对于由多个单词组成的名字时(例如studentgender),在java中使用标准驼峰命名(studentGender),在数据库中使用下划线连接命名(student_gender)。然后在mybatis的全局配置文件里面的settings即设置标签里面开启驼峰命名映射,也可以实现自动映射。
而有些情况需要在映射文件里面配置resultMap标签实现手动映射:
比如在多表关联的时候,往往就需要用该标签来实现。在这里主要讨论它的两个子标签的区别。 该标签里面有两个子标签:association(一个复杂类型的关联) 和 collection (一个复杂类型的集合)。
association标签主要用于多对一或者一对一的情况,collection主要用在一对多或者多对多的情况。
比如查询一个学生的信息,我们想知道他住的宿舍的一些相关信息,首先要明确一个学生肯定是在一个宿舍住着,也就是一对一的关系,那么我们查询一个学生的结果里面就包含一个宿舍类,这种情况就用association标签。
如果查询一个宿舍以及该宿舍里面的学生的一些相关信息,因为一个宿舍里面肯定是有多个学生的,也就是一对多的关系,那么我们查询一个宿舍的结果里面就包含一个泛型为学生的集合类,这个集合里面就包含该宿舍的每个学生的信息。这种情况就用collection标签。
2.一次查询和嵌套查询
在查询过程中,我们可以分为一次查询和嵌套查询两种。
一次查询:
sql语句只有一条,它直接通过sql语句把表关联起来然后拿到需要的数据。然后在resultMap标签里面把不同的数据封装到对应的对象里面。association标签只需属性property和javaType(这里用association标签举例说明)。
如图:假设查询一个学生的id,学号,姓名,性别,所在宿舍的宿舍号以及宿舍是几人间,还有对应的管理员帐户。
嵌套查询:
将一个多表关联查询拆分为多次查询,先查询主表数据,然后查询关联表数据。
sql语句有多条;association标签还需要添加select和column两个属性。锁定该标签对应的查询和外键。
如图:上述例子对应的嵌套查询
在进行宿舍的综合查询时,很明显地感觉到两者之间的一些差异,在日志里面可以看到一次查询就是直观地把sql语句执行的结果体现出来。而嵌套查询已经进行了一些封装。
假设有两个学生住在同一个宿舍,如果使用一次查询,在日志里面显示就是两条记录。但是嵌套查询会将这两个学生封装到一个宿舍的学生集合里面,这样在日志里面就是一条记录。也就是说如果使用嵌套查询,通过控制台的日志就可以看出是否达到我们想要的效果。
如图:这是在mysql中查询的语句和结果(这里只是普通的关联,没有使用分组)。可以看到总共有五条记录。但实际上老一和老三应该在一个宿舍里面,老二和老五应该在一个宿舍里面,所以应该是3条记录。
使用一次查询:
控制台显示的日志如图:
可以看到共有5条记录。
结果如图:
很明显看到,在同一个宿舍的同学被封装到一个集合里面,这样就成了三条记录。
使用嵌套查询:
控制台的日志如图:
此时已经将在同一个宿舍的学生封装在一个宿舍的集合类里面
结果如图:
可以看到,和一次查询得到的结果完全一样。