映射文件之select操作返回list与map
select标签来定义查询操作:
属性:
- id : 唯一标识符
- 用来引用这条sql语句, 需要和定义的接口的方法名一致
- parameterType : 参数类型
- parameterType的值可以不用填写, 我们可以根据TypeHandler自动推断出parameterType的值
- parameterType的默认值为unset
- resultType: 返回值类型
- 别名或者全类名, 如果返回的是集合, 那么resultType的值就是集合中填充的元素的类型
- 注意: resultType不能和resultMap同时使用
- 别名或者全类名, 如果返回的是集合, 那么resultType的值就是集合中填充的元素的类型
select操作返回list集合:
如果我们的dao接口中方法返回值是一个list< Javabean >类型, 那么resultType的值不是list, 而是JavaBean类型
select操作返回map集合:
- 返回一条记录并且封装为map
- resultType值为map
- 这个时候我们是将我们查询的结果集中的属性名以及属性值作为键值对来封装为一个Map集合
- resultType值为map
- 返回多条记录并且封装为Map, 并且以某个属性值作为key, 以记录封装之后的JavaBean作为value
- 注意: 由于我们最终是要封装为Map, 所以键肯定是不可重复的, 所以作为键的字段值一定是不可重复的, 也就是必须要是唯一键
- resultType值为最终Map中存储的数据的类型
- 那么我们如何指定是哪个字段值作为键(key)?
- => 我们需要在对应dao层接口中的对应方法上使用@MapKey注解来指明使用哪个字段作为key(@MapKey注解中的value属性就是对应要作为键的字段名)
对于select操作返回Map集合情况下的resultType属性取值的深入分析(前提: 查询的记录对应到Java中的实体类为Employee.class):
情况一(查询的结果集中记录一共有x条(x>1)):
dao层:
@MapKey(“id”)
public Map<Integer,Employee> find();
映射文件中:
select标签中的resultType属性值为"Employee"
-
这里映射文件中select标签中的resultType属性值为什么是Employee?
-
此时我们底层查询的时候是执行查询操作时候返回一个结果集, 然后将结果集中的数据一条一条拿出来(这一条一条记录最终会封装为一个一个的Employee类实例), 而这些封装的Employee类实例最终会作为Map集合的值, 而结果集中的id属性值最终作为Map集合的键(因为@MapKey注解的value属性值为"id", —> 因为最终是将一个一个的Employee实例封装为了Map集合的值, 所以resultType属性值为Employee
情况二(查询的结果集中记录只有1条,并且没有加@MapKey注解):
dao层:
public Map<String, Object> find();
映射文件:
select标签中resultType属性值为"map"
-
这里映射文件中select标签中resultType属性值为什么是map?
-
此时我们底层查询的时候是执行查询操作的时候返回一个结果集, 但是结果集中只有一条记录, 这一条记录最终不会被封装为Employee类的实例, 我们最终会通过该结果集调用getMetaDate()方法获取到结果集的元数据, 最终我们通过结果集调用getXxx()方法 [xxx为字段名],获取到对应的字段值作为Map的value, 而通过结果集的元数据中调用getColumnName()方法获取对应的字段名称, 以字段名称称作为key, —> 因为最终是一个个字段值作为Map集合的值, 所以resultType属性值为map, 而不是Employee
情况三(查询的结果集中记录只有1条, 并且加@MapKey注解):
dao层:
@MapKey(“id”)
public Map<Integer, Object> find();
映射文件:
select标签中resultType属性值为"map"
-
这里映射文件中select标签中resultType属性值为什么是map?
-
此时我们底层查询的时候先执行查询操作返回对应的结果集, 结果集中只有一条记录, 这一条记录最终不会被封装为Employee类的实例, 最终也是先使用结果集中的唯一一条记录的字段名作为键, 字段值作为值封装为一个Map集合, 然后使用封装成的Map集合作为值, 然后使用唯一一条记录的id属性值作为键再次封装为一个Map集合, —> 因为最终是内层Map最终外层Map集合的值, 所以resultType属性值为map
小结:
我们可以发现: 不管是封装为一个list或者是封装为一个Map的时候,最终我们的resultType属性值的取值取决于最终封装为List集合中数据类型或者Map集合的value值的类型
- 但是其实我们是可以发现的, 如果是封装为一个map的时候, 如果这个时候只是返回一条记录, 那么我们的resultType是可以指定为是map的
- 这个时候又会分为两种情况:
- 这个时候当我们没有使用@MapKey注解的时候: 这个时候是以属性名和属性值作为键和值封装为了一个Map集合
- 当还使用了@MapKey注解的时候: 这个时候就是以@MapKey注解对应的列中的值作为key, 以1情况中封住的Map集合为值, 最终会封装成为一个值为Map的双重Map集合
- 这个时候又会分为两种情况: