一、ResultType與ResultMap的差別:
1、ResultType:實作查詢時,需要自定義pojo,pojo的屬性名與sql查詢列名要一緻。個人覺得相對簡單,友善使用。
2、ResultMap:将sql查詢的結果資訊中部分屬性映射到一個pojo中,這裡需要進行映射配置。如果查詢需要使用mybatis的延遲加載,則必須使用ResultMap。
二、資料庫表的關系
food(食品)表中foodType_id字段為外鍵,對應了foodtype(食品類别)表的id,在food表中,與foodtype屬于一對一關系,一個食品對應一個分類。
三、使用ResultType一對一查詢
1、建構po類:
public class Food {
private int id;// INT PRIMARY KEY AUTO_INCREMENT, -- 主鍵
private String foodName;// VARCHAR(20), -- 菜名稱
private int foodType_id;// INT, -- 所屬菜系, 外鍵字段
private double price;// DOUBLE, -- 價格
private double mprice;// DOUBLE, -- 會員價格
private String remark;// VARCHAR(200), -- 簡介
private String img;// VARCHAR(100) -- 圖檔
public class FoodType {
private Integer id;//菜類的ID 主鍵
private String typename;//菜類的名字 唯一,不為空
private String typedescribe;//菜類的描述
因為使用ResultType,這裡需要再定義一份po,并繼承food類
public class FoodTypeOrFood extends Food {
private String typename;
2、mapper.xml(sql語句):
這裡傳回的類型為自定義的po類,我這裡使用了别名
<select id="findAllFood" resultType="foodTypeOrFood">
select food.*,foodtype.id,foodtype.typename
from food,foodtype where food.foodType_id=foodtype.id
</select>
3、mapper.java:
List<Food> findAllFood();
4、結果:
這裡我使用了mybatis的一個分頁插件,是以結果看起來比較别扭,但是不難看出typename已經查出來了。
三、使用ResultMap查詢:
1、建構po類:
在上面的food類中加入foodType屬性,并且FoodTypeOrFood 可以删除:
public class Food {
private int id;// INT PRIMARY KEY AUTO_INCREMENT, -- 主鍵
private String foodName;// VARCHAR(20), -- 菜名稱
private int foodType_id;// INT, -- 所屬菜系, 外鍵字段
private double price;// DOUBLE, -- 價格
private double mprice;// DOUBLE, -- 會員價格
private String remark;// VARCHAR(200), -- 簡介
private String img;// VARCHAR(100) -- 圖檔
private FoodType foodType;//所屬菜系
2、定義結果映射:
<!-- 菜品與菜系的映射 -->
<resultMap type="food" id="re_food-type">
<!-- id:食品資訊的唯 一限制 如果由多個字段決定一條唯 一記錄,id标簽需要定義多個 -->
<id column="id" property="id"/>
<result column="foodName" property="foodName"/>
<result column="price" property="price"/>
<result column="mprice" property="mprice"/>
<result column="img" property="img"/>
<result column="foodType_id" property="foodType_id"/>
<result column="remark" property="remark"/>
<!-- 配置分類映射資訊 将sql查詢的分類資訊映射到food中的FoodType屬性中
association:用于單個關聯對象的映射
property:将關聯資訊映射到food的哪個屬性
javaType:映射屬性的類型 -->
<association property="foodType" javaType="com.wqh.hotel.domain.FoodType">
<id column="t_id" property="id"/>
<result column="t_typename" property="typename"/>
<result column="t_typedescribe" property="typedescribe"/>
</association>
</resultMap>
3、sql語句:
<select id="findAllFood" resultMap="re_food-type">
select food.*,foodtype.id as t_id,foodtype.typename as t_typename,foodtype.typedescribe as t_typedescribe from food,foodtype where food.foodType_id=foodtype.id
</select>
可以看出,這裡以及查詢出foodType的資訊,并且foodType中的與foodType_id是一樣的。