上接: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