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