一、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是一样的。