MyBatis 教程

resultMap 标签

本章节将介绍怎样使用 <resultMap> 标签映射结果集。<resultMap> 标签需要 <id>、<result> 标签进行配合,<constructor>、<association>、<collection> 和 <discriminator> 标签将在后续章节逐一详细介绍。

下面通过一个实例了解 <resultMap> 标签的用法,示例如下:

<resultMap id="RESULT_MAP" type="com.hxstrive.mybatis.resultmap.demo1.UserBean">
    <id column="user_id" jdbcType="INTEGER" property="userId" />
    <result column="name" jdbcType="VARCHAR" property="name" />
    <result column="sex" jdbcType="VARCHAR" property="sex" />
    <result column="age" jdbcType="INTEGER" property="age" />
</resultMap>

上面实例将 Java 类型 com.hxstrive.mybatis.resultmap.demo1.UserBean 映射成 RESULT_MAP,其中:

  • <id>:该标签用于映射数据表的主键ID

  • <result>:该标签用于映射数据表的普通列

    • column属性:用来指定我们需要将那一列进行和 JavaBean 属性映射,如:user_id、name

    • jdbcType属性:用来指定当前列的 JDBC 类型,如:VARCHAR、INTEGER

    • property属性:用来指定与 column 指定的列进行映射的 JavaBean 成员变量名称,如:name、sex

然后,我们就可以在 <select> 标签的 resultMap 中使用。示例如下:

<select id="findAll" resultMap="RESULT_MAP">
   select `user_id`, `name`, `sex`, `age` from `user`
</select>

结果映射(resultMap)

  • constructor - 用于在实例化类时,注入结果到构造方法中

    • idArg - ID 参数;标记出作为 ID 的结果可以帮助提高整体性能

    • arg - 将被注入到构造方法的一个普通结果

  • id – 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能

  • result – 注入到字段或 JavaBean 属性的普通结果

  • association – 一个复杂类型的关联;许多结果将包装成这种类型

    • 嵌套结果映射 – 关联可以是 resultMap 元素,或是对其它结果映射的引用

  • collection – 一个复杂类型的集合

    • 嵌套结果映射 – 集合可以是 resultMap 元素,或是对其它结果映射的引用

  • discriminator – 使用结果值来决定使用哪个 resultMap

    • case – 基于某些值的结果映射

      • 嵌套结果映射 – case 也是一个结果映射,因此具有相同的结构和元素;或者引用其它的结果映射

ResultMap 的属性列表:

属性描述
id当前命名空间中的一个唯一标识,用于标识一个结果映射。
type类的完全限定名, 或者一个类型别名(关于内置的类型别名,可以参考上面的表格)。
autoMapping如果设置这个属性,MyBatis 将会为本结果映射开启或者关闭自动映射。这个属性会覆盖全局的属性 autoMappingBehavior。默认值:未设置(unset)。               

最佳实践

最好逐步建立结果映射。单元测试可以在这个过程中起到很大帮助。 如果你尝试一次性创建像上面示例那么巨大的结果映射,不仅容易出错,难度也会直线上升。 所以,从最简单的形态开始,逐步迭代。而且别忘了单元测试! 有时候,框架的行为像是一个黑盒子(无论是否开源)。因此,为了确保实现的行为与你的期望相一致,最好编写单元测试。 并且单元测试在提交 bug 时也能起到很大的作用。

完整示例

(1)MyBatis 配置文件 mybatis-cfg.xml 内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <properties resource="database.properties"/>
    <environments default="MySqlDatabase" >
        <environment id="MySqlDatabase" >
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com\hxstrive\mybatis\resultmap\demo1\UserMapper.xml" />
    </mappers>
</configuration>

(2)定义 Mapper 接口,UserMapper.java 文件内容如下:

package com.hxstrive.mybatis.resultmap.demo1;

import java.util.List;

public interface UserMapper {

   /** 查询所有用户信息 */
   List<UserBean> findAll();

}

(3)编写 Mapper XML 文件,UserMapper.xml 文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
   "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hxstrive.mybatis.resultmap.demo1.UserMapper">

   <!-- 显示结果集映射 -->
   <resultMap id="RESULT_MAP" type="com.hxstrive.mybatis.resultmap.demo1.UserBean">
      <id column="user_id" jdbcType="INTEGER" property="userId" />
      <result column="name" jdbcType="VARCHAR" property="name" />
      <result column="sex" jdbcType="VARCHAR" property="sex" />
      <result column="age" jdbcType="INTEGER" property="age" />
   </resultMap>
   
   <!-- 查询所有用户信息 -->
   <select id="findAll" resultMap="RESULT_MAP">
      select `user_id`, `name`, `sex`, `age` from `user`
   </select>

</mapper>

(4)定义 UserBean,内容如下:

package com.hxstrive.mybatis.resultmap.demo1;

public class UserBean {
   private Integer userId;
   private String name;
   private String sex;
   private Integer age;

   // 忽略 getter 和 setter

   @Override
   public String toString() {
      return "UserBean{" +
            "userId=" + userId +
            ", name='" + name + '\'' +
            ", sex='" + sex + '\'' +
            ", age=" + age +
            '}';
   }
}

(5)客户端,代码如下:

package com.hxstrive.mybatis.resultmap.demo1;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
import java.util.List;

public class ResultMapDemo1 {

   public static void main(String[] args) throws Exception {
      // 获取 Mapper 对象
      String cfgName = "com/hxstrive/mybatis/resultmap/demo1/mybatis-cfg.xml";
      InputStream input = Resources.getResourceAsStream(cfgName);
      SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
      SqlSessionFactory sqlFactory = factoryBuilder.build(input);
      SqlSession sqlSession = sqlFactory.openSession(true);
      UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

      List<UserBean> userBeanList = userMapper.findAll();
      for(UserBean userBean : userBeanList) {
         System.out.println("结果:" + userBean);
      }
   }

}
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号