1、商品与商品分类的关联:(一对一)
首先在Mapper层进行根据id搜索商品:
代码:
@Mapper public interface SkuDao extends BaseMapper<SkuEntity> { @Results(id = "skuMap", value = {@Result(column = "sku_id",property = "skuId",id = true), @Result(column = "class_id",property = "classId"), @Result(column = "class_id",property = "skuClass",one = @One(select = "com.lkd.dao.SkuClassDao.selectById")), }) @Select("select * from tb_sku where sku_id=#{skuId} limit 1") SkuEntity getById(long skuId); }
代码分析:
1.1使用MyBatis注解实现
@Results注解,skuMap是起名随便起名,不要重复
value = {@Result(column = "sku_id",property = "skuId",id = true)里下面的可以不用写,只要符合驼峰命名就可以省略。
@Result(column = "class_id",property = "skuClass",one = @One(select = "com.lkd.dao.SkuClassDao.selectById"))这里首先说column = "class_id",指的是你关联的id通过他去查询。property = "skuClass",skuClass是商品里实体类里一个属性,将查询的分类映射到这个属性里。
one = @One(select = "com.lkd.dao.SkuClassDao.selectById"),这个通过class_id去指定路径Mapper下一个查询方法,通过它进行查询。
1.2如何通过MyBatis-Plus自己的查询实现映射:
在需要映射的实体类加上:
@TableName(value = "tb_sku",autoResultMap = true,resultMap = "skuMap")
使用MyBatis里自带的查询需要指定哪个注解的id = "skuMap"才行。
例:
@Data @TableName(value = "tb_sku",autoResultMap = true,resultMap = "skuMap") public class SkuEntity extends AbstractEntity implements Serializable{ @TableId(value = "sku_id",type = IdType.ASSIGN_ID) private Long skuId;//sku_id @TableField(value = "sku_name") private String skuName;//商品名称 @TableField(value = "sku_image") private String skuImage;//商品图片 @TableField(value = "price") private Integer price;//基础价格 @TableField(value = "class_id") private Integer classId;//商品类别Id @TableField(value = "is_discount") private boolean discount;//是否打折促销 @TableField(value = "unit") private String unit;//净含量 @TableField(value = "brand_name") private String brandName;//商品品牌 @TableField(exist = false) private SkuClassEntity skuClass;//商品类别 }
测试:
1.1、如果测试路径与测试模块的路径不相同
例:
1.2解决方法有两种:
1:将包名修改一直。
2:需要在测试实体类的@SpringBootTest注解指定哪个服务或包下
2.1:classes = VmsServiceApplication.class指定启动的.class
2.2: 这种事指定路径
@SpringBootTest(classes = VmsServiceApplication.class) public class skuTest { @Test void test() { } }
1.2:传统查询:
需要将先查询商品,其次通过商品里分类id查询商品的分类。
@SpringBootTest(classes = VmsServiceApplication.class) public class skuTest { @Autowired private SkuDao skuDao; @Autowired private SkuClassDao skuClassDao; @Test void test() { SkuEntity sku = skuDao.selectById(1L); Integer classId = sku.getClassId(); SkuClassEntity skuClassEntity = skuClassDao.selectById(classId); sku.setSkuClass(skuClassEntity); System.out.println(sku); } }
1.3通过MyBatis实现的关联查询:
1.3.1:直接调用自定义的方法查询商品,他会根据自己定义的注解去查询商品归属于那一个分类。
1.3.2:还可以直接通过MyBatis原有的查询,原理也是走的注解的形式查询分类。
自定义方法: @Test void test1() { SkuEntity sku = skuDao.getById(1L); System.out.println(sku); }
通过MyBatis-plus原有的查询:
@Test void test1() { SkuEntity sku = skuDao.selectById(1L); System.out.println(sku); }
2、商品分类与商品的关联:(一对多)
分析:首先在分类的Mapper里使用注解的方式,先查询分类,其次在通过注解的形式,指定去哪个包下查询商品,去商品Mqpper里查询商品,再将商品映射到分类实体类的list商品集合里,就可以获取分类下商品的集合。
2.1在分类商品Mapper里使用注解:
@Mapper public interface SkuClassDao extends BaseMapper<SkuClassEntity> { @Results(id = "skuClassMap", value = {@Result(column = "class_id",property = "classId",id = true), @Result(column = "class_name",property = "className"), @Result(column = "parent_id",property = "parentId"), @Result(column = "class_id",property = "skuClassList",many = @Many(select = "com.lkd.dao.SkuDao.getByClassId")), }) @Select("select * from tb_sku_class where class_id=#{classId} limit 1") SkuClassEntity getByClassId(Integer classId); }
2.2:指定查询商品集合里SQL查询:
代码:
@Mapper public interface SkuDao extends BaseMapper<SkuEntity> { @Results(id = "skuMap", value = {@Result(column = "sku_id",property = "skuId",id = true), @Result(column = "class_id",property = "classId"), @Result(column = "class_id",property = "skuClass",one = @One(select = "com.lkd.dao.SkuClassDao.selectById")), }) @Select("select * from tb_sku where sku_id=#{skuId} limit 1") SkuEntity getById(long skuId); @Select("select * from tb_sku where class_id=#{classId}") List<SkuEntity> getByClassId(long skuId); }
2.3:在分类实体里加一个List商品集合属性:
代码:
@Data @TableName(value = "tb_sku_class",autoResultMap = true,resultMap = "skuClassMap") public class SkuClassEntity implements Serializable{ @TableId(value = "class_id",type = IdType.AUTO) private Integer classId;//id @TableField(value = "class_name") private String className;//类别名称 @TableField(value = "parent_id") private Integer parentId;//上级id @TableField(exist = false) private List<SkuEntity> skuClassList; }
2.4:测试:
2.4.1:通过查询指定方法查询分类及分类下的商品。
2.4.2:通过MyBatisPlus也可已查询,在实体类上加个注解实习那映射。
@Test void test2() { SkuClassEntity skuClassEntity = skuClassDao.selectById(1); List<SkuEntity> skuClassList = skuClassEntity.getSkuClassList(); System.out.println(skuClassList); }