mybatis <resultMap>标签

上接:mybatis 表字段名与类属性名不完全相同时,select语句无法将结果封装成类对象

介绍

<resultMap>标签,可以将 查询结果的列名 映射到 实体类的属性

属性

  • id:名字,在当前mapper.xml中 唯一
  • type:实体类的全路径

子标签

<resultMap>的常用子标签如下:

  • <id>:配置主键
  • <result>:配置普通字段
  • <association>
  • <collection>

<id> 和 <result> 标签有以下属性:

属性 说明
column 数据库表的列名
property 需要映射到 JavaBean 的属性名称
javaType 一个完整的类名,或者是一个类型名。如果你匹配的是一个JavaBean,那 MyBatis 通常会自行检测到。如果你是要映射到一个 HashMap,那你需要指定 javaType 要达到的目的。
jdbcType 数据库表支持的类型。这个属性只在 insert,update 或delete 的时候针对允许空的列有用。JDBC 需要这项,但 MyBatis 不需要。如果你是直接针对 JDBC 编码,且有允许空的列,而你要指定这项。
typeHandler 使用这个属性可以覆写类型处理器。这项值可以是一个完整的类名,也可以是一个类型别名。

详细解释:

<resultMap id="唯一的标识" type="映射的pojo对象">

  <id column="表的主键字段,或者可以为查询语句中的别名字段" jdbcType="字段类型" property="映射pojo对象的主键属性" />

  <result column="表的一个字段(可以为任意表的一个字段)" jdbcType="字段类型" property="映射到pojo对象的一个属性(须为type定义的pojo对象中的一个属性)"/>

  <association property="pojo的一个对象属性" javaType="pojo关联的pojo对象">
    <id column="关联pojo对象对应表的主键字段" jdbcType="字段类型" property="关联pojo对象的主席属性"/>
    <result  column="任意表的字段" jdbcType="字段类型" property="关联pojo对象的属性"/>
  </association>

  <!-- 集合中的property须为oftype定义的pojo对象的属性-->
  <collection property="pojo的集合属性" ofType="集合中的pojo对象">
    <id column="集合中pojo对象对应的表的主键字段" jdbcType="字段类型" property="集合中pojo对象的主键属性" />
    <result column="可以为任意表的字段" jdbcType="字段类型" property="集合中的pojo对象的属性" />  
  </collection>

</resultMap>

如果collection标签是使用嵌套查询,格式如下:

<collection column="传递给嵌套查询语句的字段参数" property="pojo对象中集合属性" ofType="集合属性中的pojo对象" select="嵌套的查询语句" > 
</collection>

类型映射

JdbcType Oracle MySql
CHAR CHAR CHAR
VARCHAR VARCHAR VARCHAR
LONGVARCHAR LONG VARCHAR
CLOB CLOB TEXT
NCHAR NCHAR
NVARCHAR
NCLOB NCLOB
TINYINT TINYINT
SMALLINT SMALLINT SMALLINT
INTEGER INTEGER INTEGER
BIGINT BIGINT
DECIMAL DECIMAL DECIMAL
DOUBLE NUMBER DOUBLE
FLOAT FLOAT FLOAT
REAL REAL REAL
NUMERIC NUMERIC/NUMBER NUMERIC
DATE DATE DATE
TIME TIME
TIMESTAMP TIMESTAMP TIMESTAMP/DATETIME
BLOB BLOB BLOB
BIT BIT
BOOLEAN
CURSOR
BINARY
LONGVARBINARY
VARBINARY
ARRAY
STRUCT
OTHER
UNDEFINED
NULL

例子

修改 userMapper.xml

增加<resultMap>标签

<resultMap id="UserMap" type="org.malaoshi.entity.User">
    <!-- 配置主键 -->
    <id property="id" column="id" ></id>
    <result property="uername" column="uername"/>
    <result property="password" column="password"/>
    <result property="createTime" column="create_time"/>
<!--    <result property="createTime" column="create_time" javaType="java.util.Date" jdbcType="TIMESTAMP"/>-->
</resultMap>

修改查询

通过resultMap="UserMap"指定映射关系

<select id="selectAll" resultMap="UserMap">
    select id,username,password,create_time from user
</select>

完整代码

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- namespace名字必须与dao包路径接口名完全相同 -->
<mapper namespace="org.malaoshi.mapper.IUserMapper" >

    <resultMap id="UserMap" type="org.malaoshi.entity.User">
        <id property="id" column="id" ></id>
        <result property="uername" column="uername"/>
        <result property="password" column="password"/>
        <result property="createTime" column="create_time" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
    </resultMap>

    <select id="selectAll" resultMap="UserMap">
        select id,username,password,create_time from user
    </select>

</mapper>

执行查询

@Test
public void test() throws IOException {
    /*
     1. 读取  mybatis-config.xml 自定义命名的全局配置文件.
        getResourceAsStream 使用的资源路径
     */
    InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

    // 2. 使用sqlSession的工厂构造器来读入全局配置,再生成一个sqlSession工厂.
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//
//        // 3. 通过 sqlSession 工厂打开一个 sqlSession
    SqlSession sqlSession = sqlSessionFactory.openSession();
    try {
//            //4 使用SqlSession创建Dao接口的代理对象
        IUserMapper mapper = sqlSession.getMapper(IUserMapper.class);
        List<User> list=mapper.selectAll();
        for(User user:list){
            System.out.println(user.getUsername()+"--"+user.getCreateTime());
        }
    }finally{
        sqlSession.close();
        inputStream.close();
    }
}

user.getCreateTime()可以返回结果

感谢:
https://www.cnblogs.com/canger/p/9979606.html


原文出处:/show_1EF6MRaYPA4x.html