resultMap
? ? Mybatis中提供了resultMap功能,可以將數據庫查詢結果映射到Java對象,用于解決 字段名與屬性名不一致 或 復雜關系(如一對多)的映射問題。?
比如一個User類,在它的屬性里還有另一個子對象(或者多個),可以是個List或者其他實體類,這個時候就需要用到
? ? 格式:
<resultMap type="User" id="userOrderMap">
type:要映射的實體類;id:給該resultMap定義一個唯一標識符。
id、result標簽:用于映射指定的屬性(不包含除String外的實體類對象),這兩者的在映射上沒有太多不同。id可以用于標識對象的主鍵字段,提升性能(MyBatis用主鍵判斷對象是否重復)。
<resultMap id="" type=""><id column="" property=""></id><result column="" property=""></id>
</resultMap>
column:對應表的列名
property:java對象的屬性名
collection標簽:用于映射一對多的子對象,比如將多條數據映射到某個集合中(集合的元素類型是某種實體類)。如果有點暈,就記得:給集合、map等類型的屬性賦值,使用collection
<!-- 給list的屬性賦值-->
<collection property="" ofType=""><id column="" property=""></id><result column="" property=""></id>
</collection><!-- 給map屬性賦值-->
<collection property="" javaType="java.util.HashMap" <!-- 固定為某個Map,此處寫的是HashMap -->ofType="" keyColumn="" <!-- 指定作為Map鍵的列 -->keyProperty="" <!-- 鍵值對中,值對象中作為鍵的屬性 -->
><id column="" property=""/><result column="" property=""/>
</collection>
property:父對象中對應的子對象
ofType:子對象對應的數據類型,比如該子對象的數據類型是User類,那么此處就填寫User。如果是給Map元素賦值,那么該屬性的功能是指定 value 的數據類型
keyColumn:在映射Map類型數據時,用于指定key 的數據類型
給Map映射的內容,光描述比較抽象難懂,下面是個示例:
public class Order {private Long id;private String orderNumber;private Map<Long, OrderItem> itemMap; // 鍵為商品ID,值為OrderItem對象// Getters & Setters
}public class OrderItem {private Long id; // 與keyProperty="id"對應private String name;private Integer quantity;// Getters & Setters
}//映射后的數據結構order.getItemMap() = {1001: OrderItem(id=1001, name="商品A", quantity=2),1002: OrderItem(id=1002, name="商品B", quantity=5)
}
?<association>標簽:
? ? 與使用collection標簽映射List用法一致,只是將collection改成association即可。區別在于,collection是給集合中多個元素的屬性進行賦值,association是給父對象的某一個子對象元素中的屬性進行賦值。
示例:
<association property="user" javaType="User"><id column="id" property="id"/> <result column="username" property="name"/> <result column="sex" property="sex"/> <!-- 其他字段映射... -->
</association>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?