MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的(对应着我们的model对象中的实体),而resultMap则是对外部ResultMap的引用(提前定义了db和model之间的隐射key-->value关系),但是resultType跟resultMap不能同时存在。
在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。
①当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。
②当提供的返回类型是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用
有关这两个问题,很多开发者如果长时间不用Myatis,很容易就会发生这种低级错误。
示例说明
数据库结构
| 字段 | 类型 |
|---|---|
| id | varchar(40) |
| order_id | varchar(40) |
| user_id | varchar(40) |
| price | double |
| receipt_include | tinyint(1) |
| delivery_cost_include | tinyint(1) |
| admin_and_replication_costInclude | tinyint(1) |
| remark | varchar(255) |
| status | int(11) |
| create_date | timestamp |
| update_date | timestamp |
Java类模型
public class EnquiryApply {
private String id;
private String orderId; // 订单ID
private String userId; // 应征者用户Id
private Double price; // 价格
private boolean receiptInclude; // 是否包含发票
private boolean deliveryCostInclude; // 是否包含快递费
private boolean adminAndReplicationCostInclude; // 是否包含行政收费及复印收费
private String remark; // 报价说明
private int status; // 应征状态, 1 - 应征中,2 - 应征成功, 3 - 应征失败
private Date createDate; // 创建时间
private Date updateDate; // 更新时间
...
}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.wusong.firefly.dao.mysql.firefly.EnquiryApplyMapper">
<resultMap id="BaseResultMap" type="com.wusong.firefly.domain.firefly.EnquiryApply">
<id property="id" column="id"/>
<result property="orderId" column="order_id"/>
<result property="userId" column="user_id"/>
<result property="price" column="price"/>
<result property="receiptInclude" column="receipt_include"/>
<result property="deliveryCostInclude" column="delivery_cost_include"/>
<result property="adminAndReplicationCostInclude" column="admin_and_replication_costInclude"/>
<result property="remark" column="remark"/>
<result property="status" column="status"/>
<result property="createDate" column="create_date"/>
<result property="updateDate" column="update_date"/>
</resultMap>
<sql id="Base_Column_List">
id, order_id, user_id, price, receipt_include, delivery_cost_include, admin_and_replication_costInclude, remark, status, create_date, update_date
</sql>
<select id="selectById" resultMap="BaseResultMap" parameterType="java.lang.String">
select
<include refid="Base_Column_List"/>
from enquiry_apply
where id = #{id}
</select>
<select id="selectByOrderId" resultMap="com.wusong.firefly.domain.firefly.EnquiryApply" parameterType="java.lang.String">
select
<include refid="Base_Column_List"/>
from enquiry_apply
where order_id = #{orderId}
</select>
</mapper>Mapper.java
public interface EnquiryApplyMapper {
EnquiryApply selectById(String id);
List<EnquiryApply> selectByOrderId(String orderId);
}从上面的配置结构测试,最终的分析结果是
selectById 在查询数据库时候,能够完整的将数据和JavaBean上。
selectByOrderId 在查询数据库时候,不能完整的将数据对应到JavaBean上。除非你的JavaBean到属性和数据库字段完全一样。
未经允许请勿转载:程序喵 » MyBatis中关于resultType和resultMap的区别
程序喵