多表进行添加-一对多和一对一

多表添加,包括中间表

我们在编写功能代码的时候,经常会遇到各种各样的需求。其中就包括多表添加。多表可能是三张表,两张主表和一张中间表;也可能是三张主表和两张中间表。总之多表进行添加,对于我来说还是有些难度的!今天我就把自己个人进行功能接口编写的心理路程给大家写一下。

多表添加

编写的是一个书籍的添加功能,包括这一级分类表,二级分类表,书籍信息表,二级分类和书籍信息中间表,一级分类和二级分类中间表。这五张表同时进行添加。

说实话之前只是进行过一张表信息的添加(课程中学习的)!
拿到需求时,心里慌的一批,但是经过自己在脑海里不断推断其添加的逻辑和表与表之间的关系,不难发现这个接口算是容易写的。

第一次尝试

第一次尝试:我准备把这五张表中的数据同时进行封装到一个vo类中,之后通过各自表的添加,添加到各自的表中。

  • 刚开始还认为,每张表的id是需要用户手写的,或者自动增长。但是数据库的表中id的字段是char类型,以为没有方法。所以就自己手写id。但是发现封装的vo类中需要填写的数据太多。
  • 并且没有办法实现添加后,表和表之间的关系。

第二次尝试

第二次尝试:我准备把三张主表,每个主表写一个添加的接口。最后的一个接口把三个接口串联起来,并且添加上表与表之间的关系。

  • 但是在测试的时候,由于最后一张表中封装的@RequestBody太多,造成报io流错误。
    在这里插入图片描述

解决方法
是由于我们一个接口中传入的前端封装的数据太多,写了三个封装的注解。所以造成io错误,从而流关闭,无法写入。

解决1:把三个封装的注解类,一起搞到一个封装的vo类,减少@RequestBody注解的个数,尽量保持到一个:

@Data
@Accessors(chain = true)
public class BookAllInfo {

    @ApiModelProperty(value = "书籍list集合")
    private Book book;

    @ApiModelProperty(value = "小类list集合")
    private BookSubtitle bookSubtitle;

    @ApiModelProperty(value = "大类list集合")
    private BookHeadline bookHeadline;
}

解决2:通过Map集合接收多个参数。

  • 总结:
  • 要想解决所报的java.io.IOException错误,就需要我们去减少在参数列表中使用@RequestBody注解的使用。总之我们需要把@RequestBody注解的个数保持到一个。

第三次尝试

通过把三张表的实体类,封装成一个实体类后,通过@RequestBody注解去封装接收前端传回来的数据。再通过逻辑代码同时把两张中间表也添加上数据。

封装三张表的实体类:
@Data
@Accessors(chain = true)
public class BookAllInfo {

    @ApiModelProperty(value = "书籍list集合")
    private Book book;

    @ApiModelProperty(value = "小类list集合")
    private BookSubtitle bookSubtitle;

    @ApiModelProperty(value = "大类list集合")
    private BookHeadline bookHeadline;
}
编写controller层的接口:
    @Autowired
    private BookService bookService;

    //书籍入库
    @ApiOperation(value = "书籍入库")
    @PostMapping("bookAllInfoSave")
    public R bookAllInfoSave(@RequestBody BookAllInfo bookAllInfo){
        bookService.bookAllInfoSave(bookAllInfo);
        return R.ok();
    }

编写service层的实现类代码:

    @Autowired
    private BookMiddleService bookMiddleService;

    @Autowired
    private ClassMiddleService classMiddleService;

    @Autowired
    private BookHeadlineService bookHeadlineService;

    @Autowired
    private BookSubtitleService bookSubtitleService;

 @Override
    public void bookAllInfoSave(BookAllInfo bookAllInfo) {
        Book book = bookAllInfo.getBook();
        BookSubtitle bookSubtitle = bookAllInfo.getBookSubtitle();
        BookHeadline bookHeadline = bookAllInfo.getBookHeadline();

        baseMapper.insert(book);
        bookSubtitleService.save(bookSubtitle);
        bookHeadlineService.save(bookHeadline);


        String bookId = book.getId();
        String bookSubtitleId = bookSubtitle.getId();
        String bookHeadlineId = bookHeadline.getId();
        //创建书籍和小类之间的中间表对象,并且放入到中间表中
        BookMiddle bookMiddle = new BookMiddle();
        bookMiddle.setBookId(bookId);
        bookMiddle.setSubtitleId(bookSubtitleId);
        bookMiddleService.save(bookMiddle);

        //创建小类和大类之间的中间表对象,并放入到中间表中
        ClassMiddle classMiddle = new ClassMiddle();
        classMiddle.setSubtitleId(bookSubtitleId);
        classMiddle.setHeadlineId(bookHeadlineId);
        classMiddleService.save(classMiddle);
    }

⚠️注意
我们再编写逻辑代码的时候,一定要按照好逻辑从上向下去写逻辑。代码的编译是自上向下的。
例如:我们是先把三张主表的数据添加完后,才能从主表中获取各表的id,从而填入到与之相关的中间表中。而非现填入中间表,再填入主表【逻辑不成立】。
总结:
所有功能的逻辑实现,其实根本上是我们通过mq已经封装好的方法,去写sql语句。从而改变表里的数据。


拓展:

对于我们使用UUID的时候,获取的UUID值是128比特位,相当于是数据库表中char属性的30个字节。
总之:char属性的最大值是255。并且改变完表的结构后需要进行保存。如果保存失败,就需要重新改变表结构,直至保存成功。


以上就是今天的全部内容!喜欢的欢迎一键三连!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值