文章将讲述:

  • mybatis resultMap 标签的作用
  • resultMap 标签中 子标签 result 的使用分析
  • resultMap 标签中 主键标签 id 的使用分析
  • resultMap 中使用到的 jdbctype 与 java 数据类型映射关系



每日更新,欢迎关注接收提醒

【x1】点击查看提示

【x2】各种系列的教程


一个程序员的修炼日记


1 简述

resultMap标签是为了映射select查询出来结果的集合,它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中。

那么resultMap标签的主要作用是将实体类中的字段与数据库表中的字段进行关联映射。

2 基本使用

例如 我们使用 mybatis 根据 id 来查询一个用户的基本信息,最简单的单表查询

用户实体

/**
* 用户实体
*/
public class UserBean implements Serializable {

private int id;
private String userName;
private String realName;
private int age;

... ... get set 方法省略

}

对应的 mapper.xml

<?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">
<mapper namespace="com.example.demo.dao.UserDao">

<!--resultMap 映射-->
<resultMap id="userBean" type="com.example.demo.bean.UserBean">
<!--查询结果映射 -->
<!--property 为实体中的属性名称-->
<!--jdbcType 为属性对应的数据类型-->
<!--column 为select查询语句中查询对应的列名-->
<result property="id" jdbcType="INTEGER" column="id"/>
<!--例如这里的 UserBean 实体中的属性为 userName,是字符串类型,在数据库中对应的列是user_name-->
<result property="userName" jdbcType="VARCHAR" column="user_name"/>
<result property="age" jdbcType="INTEGER" column="age"/>
<result property="realName" jdbcType="VARCHAR" column="realname"/>
</resultMap>

<!--查询语句-->
<select id="selectUserFormId" resultMap="userBean">
select *
from tb_user
where id = #{id}
</select>

</mapper>

在这里 我们通过 resultMap 标签中的 result 子标签映射基本数据类型,通过 property 属性与 column 属性将 实体类与查询结果集关联在了一起

3 resultMap 标签的使用分析

3.1 resultMap 标签中的属性配制分析

  • id 可自定义,用来做对 对映数据实体类的唯一映射标识,例如在下面的 select 查询语句中,resultMap 指定的值就是对应实体类 resultMap 中设置的 id值
  • type 是指定当明 resultMap 要映射的数据结果对应的javabean 实体类的路径

如下图所示:

Mybatis中查询结果resultMap使用分析_数据

3.2 子标签 result 使用分析

result 用来配制 非主键的映射 ,如上图中写的的用户的基本数据,例如 实体UserBean中的userName属性与sql查询结果中的user_name,可通过配制如下实现数据映射,

其中 jdbcType 用来配制基本数据类型

<!--例如这里的 UserBean 实体中的属性为 userName,是字符串类型,在数据库中对应的列是user_name-->
<result property="userName" jdbcType="VARCHAR" column="user_name"/>

上面描述的是 一一对映的映射,分别指定 JavaBean 实体中的属性名与 查询结果集中的列名来实现数据映射 ,如果实体类中的属性名称与 查询结果集中的列名一至,那在这里不写 result 映射,mybatis 将会实现自动映射

关于 jdbcType 数据类型的详细映射​​可参考这里​

下面的表格(部分)内容就是摘自上面的文章

类别

JdbcType

Oracle

MySql

JavaType

JdbcType

ARRAY

JdbcType

BIGINT

BIGINT

long

JdbcType

BINARY

byte[]

JdbcType

BIT

BIT

boolean

JdbcType

BLOB

BLOB

BLOB

JdbcType

BOOLEAN

boolean

JdbcType

CHAR

CHAR

CHAR

String

JdbcType

CLOB

CLOB

修改为TEXT

JdbcType

CURSOR

JdbcType

DATE

DATE

DATE

java.sql.Date

JdbcType

DECIMAL

DECIMAL

DECIMAL

java.math.BigDecimal

JdbcType

DOUBLE

NUMBER

DOUBLE

double

JdbcType

FLOAT

FLOAT

FLOAT

float

JdbcType

INTEGER

INTEGER

INTEGER

int

JdbcType

LONGVARBINARY

byte[]

JdbcType

LONGVARCHAR

LONG

VARCHAR

JdbcType

NCHAR

NCHAR

JdbcType

NCLOB

NCLOB

JdbcType

NULL

JdbcType

NUMERIC

NUMERIC/NUMBER

NUMERIC

java.math.BigDecimal

JdbcType

NVARCHAR

JdbcType

OTHER

JdbcType

REA

L REAL

REAL

float

JdbcType

SMALLINT

SMALLINT

SMALLINT

short

JdbcType

STRUCT

JdbcType

TIME

TIME

java.sql.Time

JdbcType

TIMESTAMP

TIMESTAMP

TIMESTAMP/DATETIME

JdbcType

TINYINT

TINYINT

byte

JdbcType

UNDEFINED

JdbcType

VARBINARY

String

JdbcType

VARCHAR

VARCHAR

VARCHAR

String

也就是说在使用时最容易出错的是使用到的 Time 与 Date 的映射

3.3 子标签 id 使用分析

resultMap 标签中的子标签 id 用来标识出对象的唯一性,比如用户表的主键

Mybatis中查询结果resultMap使用分析_数据_02

它的用法与 result 标签的使用基本上一至,不同的是,id 标签必须写在result 标签上面,或者说是 resultMap 标签中的第一行。


每日更新,欢迎关注接收提醒

【x1】点击查看提示

【x2】各种系列的教程


一个程序员的修炼日记