MyBatis中关于resultType和resultMap的区别

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到属性和数据库字段完全一样。


赞(52) 打赏
未经允许不得转载:优客志 » JAVA开发
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏