MyBatis实体类关联查询@注解的方式

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);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值