mybatis中结果映射的几种情况的整理

对mybatis的结果映射做个整理,只针对resultType/resultMap讨论,忽略sql语句的实现
1.将查询出的单行单列结果映射到java对象中的字段
例1:查询总记录数,返回一个Integer类型的对象即可
mapper.xml中,resultType=“Integer”;
mapper接口中,返回值为Integer即可
例2:查询某个用户的用户名username,返回一个java类对象A
要求:A类中的属性名要与查询出的字段名一致,否则要使用resultMap来映射,这里假设A类中已存在属性username
mapper.xml中,resultType=“A”(未在sqlMapper.xml中设置别名的话,这里就要写全限定类名xxx.xxx.A)
mapper接口中,返回值为A对象即可

2.将查询出的单行结果映射成java对象
即查询出的结果字段都映射到一个java对象的属性中去,跟上面的例2一样。如果java对象中的属性名和查询出的字段的列名是对应的,就能直接映射到java对象的属性中去,如果不对应,就要使用resultMap。
resultMap:


		
		
		
	

type属性:要映射到的java对象的类名
id属性:这个resultMap的唯一标识(要被select标签引用)
id标签:查询出的主键字段
result标签:除了主键的其他字段
column:查询出的列名
property:要映射到的java对象中的属性名

	

意思是将查询出的列名是username的字段映射到A类中的name属性中去
在mapper.xml中:select标签的resultMap就引用上面resultMap的id


mapper接口中,返回值就是要映射到的A类对象

3.将查询出的结果集映射成java对象集合
规则与上面一致,如果java对象中的属性名和查询出的字段的列名是对应的,就能直接映射到java对象的属性中去,如果不对应,就要使用resultMap。
mapper.xml中:注意resultType还是要映射成的A类的全限定类名,而不是List
mapper接口中:返回值为List

4.将关联查询的结果映射到java类A及A中引用的java类B上(一对一查询)
A中持有B的引用,将查询到的字段一部分映射到A的属性中,一部分映射到B的属性中
(注:A表对应java类A,B表对应java类B)
在一些需求中,需要查询表A的字段以及A表关联的B表中的字段,并且要把查询出来的包含A表与B表的字段的信息都映射到同一个java对象A中去。这时候可以在A类中新增B类的属性,也可以在A类中持有B类的引用(如果B类的属性太多,那么使用后者会比较好)。A类中持有B类的引用的情况:
因为不是查询出的列名与属性名一一对应,所以也需要使用到resultMap


		
	  
	  

	  
		
		
		
	  
	

同样,resultMap中的type属性就是要映射到的java对象,在这里就是A类
Id标签和resule标签也跟上面介绍的一样
这里新出现的是标签,显然就是用来指定在A类中引用的B类了。
property属性:在A类中引用的B类的属性名(A类中声明成员变量:private B b;)
javaType属性:B类的全限定类名
下面的id标签和result标签与前面的同理。
接着在mapper.xml的select标签中引用这个resultMap即可:


mapper接口中:返回值为A类

5.将关联查询的结果映射到java类A及A中引用的对象集合B上(一对多查询)
A中持有B的集合的引用(List),A与B在数据库表中的关系是一对多,将查询到的字段的一部分映射到A的属性中,对应的一对多的B表的字段映射到集合B中。
与第4点中的情况类似,只不过现在A中持有的是一个B的集合的引用,而不是B的引用(A中的成员变量:private List list ;
同样使用resultMap:


		
			
			
			
		
	

这次要用到标签,显然就是指定A中持有的B的集合的引用。
collection标签的property属性就是A中引用的B集合的属性名,是list;ofType属性用来指定B类,同样写全限定类名(在association标签中,是javaType,这里是ofType,容易混)
id标签和result标签同理
这里在resultMap上使用了新的属性extends,表明这个resultMap继承了第一个resultMap。因为第一个resultMap中指定了A表查询出来的列名和A类中的属性名的对应关系,在这里直接继承即可,不用重复写。
mapper.xml中,一样引用这个resultMap
mapper接口中,返回值类型一样是A类

6.多对多查询:也是使用这些标签,根据需求来分析即可,需要嵌套这些标签。
7.小结:设计到复杂一点的映射时,就需要定义resultMap了,这样的好处是可以统一返回值,返回值都是一个A类对象,也方便取得值后的处理和数据在页面中的显示。

你可能感兴趣的:(ssm)