Java中新增主子表数据各层写法和更新时思路

本文详细介绍了Java应用开发中处理主子表关系的方法,包括从实体层的数据模型到数据库操作,以及在服务层和控制层的实现。重点讲解了新增和更新数据时的策略,确保数据正确性和代码可维护性。
摘要由CSDN通过智能技术生成

Java中新增主子表数据各层写法和更新时思路

在Java应用开发中,处理数据库中的主子表关系是一个常见的任务。这种关系通常涉及一对多或多对多的数据模型,如订单与订单项、用户与角色等。为了有效地管理这种关系,并在各层次间实现数据的顺畅交互,开发者需要遵循一定的编写规范和设计原则。
在Java应用中,处理新增主子表数据通常涉及实体层、数据访问层、服务层和控制层等多个层次。在这篇博客中,我们将深入探讨如何在Java应用的各个层次中实现新增主子表数据的操作。我们将从实体层的数据模型定义开始,逐步过渡到数据访问层的数据库操作,再到服务层的业务逻辑处理,最后到达控制层的请求处理。通过这个过程,我们将展示如何在各层次之间协同工作,以确保数据的正确性和一致性,并提高代码的可维护性和可重用性。

返回的数据结构示例

// 新增页面数据格式
{
    rq: '', // 日期
   	xm: '', // 姓名 (内码)
    // 子表 (可能有多条)
	zb: [
        {
            mc: '', // 名称 
            cj: '', // 成绩
        }
    ]bz: '', // 备注
}

在数据库中数据存储实例如下:
父表(FB):

idxmrqbz
123木头2024-01-01
1234林林2024-02-01优秀

子表(ZB):

idpidmccj
12123语文66
13123数学88
141234语文90
151234数学96

子表通过pid与主表id相关联。

dto层

主表实体类:

@Data
public class FbDto {
    private String id;
    private String rq; // 日期
    private String xm; // 姓名    
    private List<ZbDto> zb; // 子表
    private String bz; // 备注
}

子表实体类:

@Data
public class ZbDto {
    private String id;
    private String pid;
    private String mc; // 名称
    private String cj; // 成绩
}
Mapper层

主表插入:

@Mapper
public interface FbMapper {
    @Insert("INSERT INTO FB(id,rq, xm, bz,)VALUES (#{id},#{rq}, #{xm},  #{bz})")
    int insertFb(FbDto fbDto);
}

子表插入

@Mapper
public interface ZbMapper {
    @Insert("INSERT INTO ZB(id,pid, mc, cj) VALUES (#{id},#{pid}, #{mc}, #{cj})")
    int insertZb(ZbDto ZbDto);
}
service层
@Service
public class InsertService {
    @Autowired
    private FbMapper fbMapper;
    @Autowired
    private ZbMapper zbMapper;

    public int insert(FbDto fbDto) {
        fbDto.setId(UUID.randomUUID().toString());//自动生成主表id
        int fbNu = fbMapper.insertFb(fbDto);
        for (ZbDto zb : fbDto.getZb()) {
            zb.setId(UUID.randomUUID().toString());//自动生成子表id
            zb.setPid(fbDto.getId());//获取父表id作为子表的pid
            zbMapper.insertZb(zb);
        }
        return fbNu;
    }
}
controller层
@Api(tags = "成绩")
@RestController
@RequestMapping("cj")
public class InsertController {
    @Autowired
    private InsertService insertService;

    @PostMapping("/add")
    @ApiOperation(value = "新增")
    public ResponseEntity<?> addSxrwnlpd(@RequestBody FbDto fbDto) {
        int id = insertService.insert(fbDto);
        return ResponseEntity.ok().body(id);
    }

}

这个函数执行以下操作:
接收并处理一个JSON格式的请求体(通过@RequestBody注解绑定到FbDto对象)。
调用insertService.insert方法将DTO对象的数据插入数据库,并返回新插入记录的条数。
使用ResponseEntity创建一个HTTP响应,其中:
.ok() 方法表示HTTP状态码为200(即“OK”),表明请求成功完成。
.body(id) 方法设置HTTP响应的主体内容为刚才插入记录得到的ID值。
因此,该函数的主要功能是接收前端发送的创建或更新请求,处理后将数据保存到数据库,并向客户端返回一个HTTP 200响应,响应体包含新生成记录的标识符(ID)。

主子表数据更新思路

主表可以直接进行更新(需要传主表id),子表可以通过主表的id先删除所有对应pid的数据,然后再插入,此思路适合于前端传数据时无法只传子表需要更新的数据(需要子表id)时的思路。若前端可以知晓前端修改的子表数据并可以返回对应子表数据id时子表也可直接更新。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值