在 MyBaits 的 Mapper 映射文件中,sql 语句查询后返回的结果,会映射到配置标签的输出映射属性对应的 Java 类型中。Mapper 的输出映射有两种配置,分别是 resultType 和 resultMap。
resultType 支持基本的数据类型、数据包装类和自定义的 JavaBean 包装类。当从数据库查询出来的列名与包装类中的属性名全都不一致,则不会创建包装类对象,如果数据库查询出来的列名与包装类中的属性名至少有一个一致,那么就会创建包装类对象。
先来看两个 sql 映射配置示例:
<select id="findUserById" parameterType="int" resultType="cn.com.mybatis.pojo.User">
select * from user where id=#{id}
select>
<select id="findUserNameById" parameterType="int" resultType="java.lang.String">
select username from user where id=#{id}
select>
当查询结果只有一行一列时,使用的是基本数据类型或者基本数据包装类。而当查询结果不止一行一列时,需要使用自定义包装类来接受结果集。
再来看两个 sql 映射配置示例:
<select id="findUserById" parameterType="int" resultType="cn.com.mybatis.pojo.User">
select * from user where id=#{id}
select>
<select id="findAllUser" parameterType="java.lang.String" resultType="cn.com.mybatis.pojo.User">
select username from user where gender=#{gender}
select>
以上示例,其中一个是带条件查询,以主键 id 为条件,查询出的结果一定是唯一的一条数据。而第二条是以性别为查询条件,查出的一定是多条数据。但是 resultType 都是只配置了 User 类。
这说明,在 MyBatis 中,不管输出的是 JavaBean 单个对象还是一个列表(list 中包含 JavaBean),在 Mapper 映射文件中 resultType 指定的类型是一样的。
但是在相应的 Mapper 方法中,加载该 sql 配置时,如果输出单个对象,则方法返回值是单个 JavaBean 对象类型,如果输出一个列表,则方法的返回值为 List。后期使用动态代理对象进行增删改查操作时,代理对象会根据 mapper 方法的返回值类型确定调用 selectOne(返回单个对象调用)还是 selectList(返回集合对象调用)。
最后,如果没有合适的 JavaBean 接受结果集数据,resultType 还可以输出 HashMap 类型的数据,将输出的字段名称作为 map 的 key,value 为字段值。如果是集合,那是因为 list 里面嵌套了 HashMap。
如果在 sql 映射文件中配置的 sql 语句返回的结果为多个值,且没有一个完全与返回结果值一一匹配的封装类去接收,或者此时寄希望于使用一个容器接收结果数据,到业务层再按情况处理它们。为此,MyBatis 提供了一种 sql 结果集输出映射类型,即 resultMap。可以通过定义一个 resultMap 在列名和 Java 包装类属性名之间创建映射关系。
使用 resultMap 可以定义一个结果集配置,该配置声明了 sql 查询结果集中的每一个字段与 type 中指定的 java 实体类的哪个属性名对应,以及该配置最终生成的类型格式。
例如以下 resultMap 示例:
"cn.com.mybatis.pojo.User" id="userResultMap">
"_id" property="id"/>
"_username" property="username"/>
<select id="findUserByResultMap" parameterType="int" resultMap="userResultMap">
select id _id,username _username from user where id=#{value}
select>
这里对于 select 配置,使用 resultMap 进行输出映射,其中 userResultMap 就是一个 resultMap 配置的 id,表明该 sql 配置的结果集要指向那个 resultMap 配置。如果 resultMap 在其他的 Mapper 配置文件中,则需要在 id 前面加那个 Mapper 配置文件的 namespace。
使用 id 为 userResultMap 的 resultMap 配置将 select id id_,username _username from user 和 User 类中的属性进行映射。id 属性是 resultMap 的唯一标识,而 type 是最终所映射的 java 对象类型,可以使用别名。在 resultMap 标签对中,id 标签指的是查询结果集中的唯一标识(例如 User 的唯一标识就是 id),result 标签指的是对普通列的定义(User 类中的其他非主键属性),其 column 指的是查询出的列名(如这里的_id 和_username 别名),然后对应的 property 是 type 所指定的 java 包装类中的属性名,最终 resultMap 会对 coloumn 和 property 进行映射(对应关系),这样最终就会拿到一个填充了查询结果的 User 类。
在 Myapper 映射文件中,sql 语句查询后返回结果,会映射到配置标签的输出映射属性对应的 java 类型中。其中有两种配置,一种是 resultType,一种是 resultMap。其中 resultType 可以映射基本的数据类型、基本数据包装类以及自定义包装类。而当 sql 语句返回结果为多个值,且没有一个完全与返回结果值一一匹配的封装类去接收时,则需用 resultMap 在列名和 java 包装类属性名之间创建映射关系。
公众号回复数字“8”领取CIS加固全套手册。
微 信:fageweiketang,朋友圈不定期干货分享,欢迎讨论。
公众号:发哥微课堂,专注于代码审计、WEB渗透、网络安全。