mybatis查询(一对一查询)

一、ResultType与ResultMap的区别:

1、ResultType:实现查询时,需要自定义pojo,pojo的属性名与sql查询列名要一致。个人觉得相对简单,方便使用。
2、ResultMap:将sql查询的结果信息中部分属性映射到一个pojo中,这里需要进行映射配置。如果查询需要使用mybatis的延迟加载,则必须使用ResultMap。

二、数据库表的关系

food和foodtype表的结构
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是一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值