映射文件之select操作返回list与map

文章详细解释了在MyBatis中使用select标签进行查询时,如何设置resultType属性以返回list或map集合。当返回list时,resultType应为JavaBean类型;返回map时,若以属性值为key,则需使用@MapKey注解,并且resultType为map或JavaBean类型。文章探讨了不同情况下resultType的取值,包括多条记录和单条记录的情况。
摘要由CSDN通过智能技术生成

映射文件之select操作返回list与map

select标签来定义查询操作:

属性:

  1. id : 唯一标识符
    • 用来引用这条sql语句, 需要和定义的接口的方法名一致
  2. parameterType : 参数类型
    • parameterType的值可以不用填写, 我们可以根据TypeHandler自动推断出parameterType的值
    • parameterType的默认值为unset
  3. resultType: 返回值类型
    • 别名或者全类名, 如果返回的是集合, 那么resultType的值就是集合中填充的元素的类型
      • 注意: resultType不能和resultMap同时使用
select操作返回list集合:

如果我们的dao接口中方法返回值是一个list< Javabean >类型, 那么resultType的值不是list, 而是JavaBean类型

select操作返回map集合:
  1. 返回一条记录并且封装为map
    • resultType值为map
      • 这个时候我们是将我们查询的结果集中的属性名以及属性值作为键值对来封装为一个Map集合
  2. 返回多条记录并且封装为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的
    • 这个时候又会分为两种情况:
      1. 这个时候当我们没有使用@MapKey注解的时候: 这个时候是以属性名和属性值作为键和值封装为了一个Map集合
      2. 当还使用了@MapKey注解的时候: 这个时候就是以@MapKey注解对应的列中的值作为key, 以1情况中封住的Map集合为值, 最终会封装成为一个值为Map的双重Map集合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值