Java中新增主子表数据各层写法和更新时思路
在Java应用开发中,处理数据库中的主子表关系是一个常见的任务。这种关系通常涉及一对多或多对多的数据模型,如订单与订单项、用户与角色等。为了有效地管理这种关系,并在各层次间实现数据的顺畅交互,开发者需要遵循一定的编写规范和设计原则。
在Java应用中,处理新增主子表数据通常涉及实体层、数据访问层、服务层和控制层等多个层次。在这篇博客中,我们将深入探讨如何在Java应用的各个层次中实现新增主子表数据的操作。我们将从实体层的数据模型定义开始,逐步过渡到数据访问层的数据库操作,再到服务层的业务逻辑处理,最后到达控制层的请求处理。通过这个过程,我们将展示如何在各层次之间协同工作,以确保数据的正确性和一致性,并提高代码的可维护性和可重用性。
返回的数据结构示例
// 新增页面数据格式
{
rq: '', // 日期
xm: '', // 姓名 (内码)
// 子表 (可能有多条)
zb: [
{
mc: '', // 名称
cj: '', // 成绩
}
],
bz: '', // 备注
}
在数据库中数据存储实例如下:
父表(FB):
id | xm | rq | bz |
---|---|---|---|
123 | 木头 | 2024-01-01 | 无 |
1234 | 林林 | 2024-02-01 | 优秀 |
子表(ZB):
id | pid | mc | cj |
---|---|---|---|
12 | 123 | 语文 | 66 |
13 | 123 | 数学 | 88 |
14 | 1234 | 语文 | 90 |
15 | 1234 | 数学 | 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时子表也可直接更新。