1. 多表关系回顾
- 在项目开发当中一对一关系的表不常见,因为一对一关系的两张表通常会合并为一张表。
2. 一对一查询
一张表对应一个实体类,一个实体类对应一个Mapper接口。
例如:查询菜品,同时查询出该菜品所属的分类。
分析:查询菜品是主查询,因此将结果封装到菜品当中,直接在菜品类的属性当中声明一个菜品分类的对象。
Mybatis多表查询的难点是难在于怎样进行查询数据的封装!
Dish
package com.gch.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.time.LocalDateTime;/*** 菜品表*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dish {/** 主键ID */private Integer id;/** 菜品名称 */private String name;/** 菜品分类ID */private Integer categoryId;/** 菜品图片 */private String image;/** 描述信息 */private String description;/** 状态:0停售,1起售 */private Short status;/** 创建时间 */private LocalDateTime createTime;/** 更新时间 */private LocalDateTime updateTime;/** 记录当前菜品所属的分类信息 */private Category category;
}
Category
package com.gch.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.time.LocalDateTime;/*** 分类表*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Category {/** 主键ID */private Integer id;/** 分类名称 */private String name;/** 类型 1-菜品分类 2-套餐分类*/private Short type;/** 顺序 */private Integer sort;/** 状态 0-禁用 1-启用 */private Short status;/** 创建时间 */private LocalDateTime createTime;/** 更新时间 */private LocalDateTime updateTime;
}
DishMapper
package com.gch.mapper;import com.gch.pojo.Dish;
import org.apache.ibatis.annotations.Mapper;import java.util.List;@Mapper
public interface DishMapper {/*** 查询菜品,同时查询出该菜品所属的分类* @return 将查询出来的多条结果封装到List集合当中*/public List<Dish> findAllDishWithCategory();
}
DishMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gch.mapper.DishMapper"><!--查询菜品,同时查询出该菜品所属的分类--><select id="findAllDishWithCategory" resultType="com.gch.pojo.Dish">select dish.*,c.id,c.name as 分类名称,c.type 类型,c.sort 顺序,c.status 状态,c.create_time 创建时间,c.update_time 更新时间from dishleft join category c on dish.category_id = c.id</select>
</mapper>
注意:记得在配置文件当中来更新数据库的连接
测试类:
@Autowiredprivate DishMapper dishMapper;@Testpublic void testFindAllDishWithCategory() {List<Dish> dishList = dishMapper.findAllDishWithCategory();dishList.forEach(s ->{System.out.println(s);});}
运行测试类,看控制台输出:
可以看到catrgory为null,说明查询出来的菜品所属的分类信息没有被正确封装!
既然默认的规则{实体类类名与表中字段名相同}不能给我们自动封装上,那我们就需要手动封装!
这里要用到一个标签 - <resultMap>,Map是映射的意思,resultMap - 结果映射!