resultType和resultMap的区别
-
返回类型是
resultType
:Mybatis
会自动把对应的值赋给resultType
所指定的对象的属性 -
返回类型是
resultMap
:Mybatis
会将数据库中的列数据复制到对应的相应属性上。--->用于复制查询
resultTpe
和resultMap
不能同时使用
resultMap元素的构成
<resultMap id="" type="">
<constructor><!-- 类再实例化时用来注入结果到构造方法 -->
<idArg/><!-- ID参数,结果为ID -->
<arg/><!-- 注入到构造方法的一个普通结果 -->
</constructor>
<id/><!-- 用于表示哪个列是主键 --> <!-- 该元素有属性 -->
<result/><!-- 注入到字段或JavaBean属性的普通结果 --> <!-- 该元素有属性 -->
<association property=""/><!-- 用于一对一关联 -->
<collection property=""/><!-- 用于一对多、多对多关联 -->
<discriminator javaType=""><!-- 使用结果值来决定使用哪个结果映射 -->
<case value=""/><!-- 基于某些值的结果映射 -->
</discriminator>
</resultMap>
标签说明:
-
<resultMap>
标签的type
属性表示需要POJO
,id
属性是resultMap
的唯一标识 -
子元素
<constructor>
用于配置构造方法,POJO
没有无参构造方法时使用 -
子元素
<id>
表示哪个列是主键。允许多主键,多主键称为联合主键 -
子元素
<result>
表示POJO
和SQL
列名的映射关系 -
子元素
<association>
、<collection>
和<discriminator>
用于级联情况
id
和result
元素共有的属性:
元素 | 说明 |
---|---|
property | 映射到列结果的字段或属性。如果 POJO 的属性和 SQL 列名(column元素)是相同的,那么 MyBatis 就会映射到 POJO 上 |
column | 对应 SQL 列 |
javaType | 配置 Java 类型。可以是特定的类完全限定名或 MyBatis 上下文的别名 |
jdbcType | 配置数据库类型。这是 JDBC 类型,MyBatis 已经为我们做了限定,基本支持所有常用数据库类型 |
typeHandler | 类型处理器。允许你用特定的处理器来覆盖 MyBatis 默认的处理器。需要指定 jdbcType 和 javaType 相互转化的规则 |
什么是POJO
一条SQL
查询语句执行后返回结果集的一种存储方式。
通常有两种方式:
-
Map
存储 -
POJO
存储
使用Map存储结果集
Mybatis
配置:
<!--查询所有网站的信息存储到Map中-->
<select id="selectAllWebsite" resultType="map">
SELECT *
FROM javawebtest.website;
</select>
WebsiteMapper
配置:
/*使用Map存储结果集*/
List<Map<String, Object>> selectAllWebsite1();
Map 的 key 是 select 语句查询的字段名(必须完全一样),而 Map 的 value 是查询返回结果中字段对应的值,一条记录映射到一个 Map 对象中。
缺点:
可读性差
POJO存储结果集
Mybatis
有自动映射,如果需要复杂的映射或级联要使用select
元素的resultMap
属性配置映射集合
修改Website
类不提供get
和set
方法:
package com.junkingboy.bean;
import java.util.Date;
/**
* @description:website表的javabean对象
* @data: 2021/10/29 16:47
* @author: Lucifer
*/
public class Website {
private int id;
private String name;
private String url;
private int age;
private String country;
private Date createtime;
/* set和get方法 */
//重写toString方法
WebsiteMapper
自定义结果集:
<!-- 自定义结果集类型 -->
<resultMap id="com.junkingboy.bean.Website" type="myResult">
<!-- property是com.junkingboy.bean.Website类中的属性 -->
<!-- column是查询结果的列名,可以来自不同的表 -->
<id property="id" column="id" />
<result property="uname" column="name" />
</resultMap>
作用:
这个自定义结果集的作用用于再<select>
等标签下的resultMap
属性当中做值。语句返回的结果会封装到POJO对象的对应属性中
resultMap
元素属性:
-
id
代表resultMap
标识,type
标识需要映射的POJO
-
property
属性指定website
属性名称uname
,column
表示数据库中表的列名。将POJO
和SQL
的查询结果一 一对应。
WebsiteMapper的select
配置:
<!-- 使用结果集类型作为返回值的存储模型 -->
<select id="selectAllWebsiteMyResult" resultMap="myResult">
SELECT id, url
FROM javawebtest.website;
</select>