前端传来的数据,有level,content,child,index四个属性,是分级别的,数组里嵌套多个对象,对象的child属性有嵌套多个数组,以此类推,后端springboot框架怎么接收并存储到数据库中,请用代码实现增删查操作
时间: 2023-12-04 16:03:24 浏览: 87
手把手实现Spingboot前后端分离项目-简单的增删改查-外调用SQL数据库
5星 · 资源好评率100%
假设前端传来的数据结构如下:
```javascript
[
{
level: 0,
content: 'Level 0 content',
child: [
{
level: 1,
content: 'Level 1 content',
child: [
{
level: 2,
content: 'Level 2 content',
child: [],
index: 0
}
],
index: 0
},
{
level: 1,
content: 'Level 1 content',
child: [
{
level: 2,
content: 'Level 2 content',
child: [],
index: 0
},
{
level: 2,
content: 'Level 2 content',
child: [],
index: 1
}
],
index: 1
}
],
index: 0
},
{
level: 0,
content: 'Level 0 content',
child: [],
index: 1
}
]
```
首先,我们需要定义数据库表的结构,假设我们将每个对象存储在一个名为 `tree_node` 的表中,表结构如下:
```sql
CREATE TABLE tree_node (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
level INT NOT NULL,
content TEXT NOT NULL,
parent_id BIGINT UNSIGNED DEFAULT NULL,
index_in_parent INT NOT NULL,
PRIMARY KEY (id),
CONSTRAINT fk_tree_node_parent FOREIGN KEY (parent_id) REFERENCES tree_node(id) ON DELETE CASCADE
);
```
其中,`id` 是自增主键,`level` 表示节点的层级,`content` 存储节点的内容,`parent_id` 表示父节点的 `id`,`index_in_parent` 表示节点在父节点中的顺序。
接下来,我们可以通过 `@RequestBody` 注解将前端传来的数据转换成一个 `List`,然后通过 `JpaRepository` 进行增删查操作。假设我们将新增操作放在 `TreeNodeController` 中,代码如下:
```java
@RestController
@RequestMapping("/treeNode")
public class TreeNodeController {
@Autowired
private TreeNodeRepository treeNodeRepository;
@PostMapping("/")
public String addTreeNode(@RequestBody List<TreeNode> treeNodes) {
for (TreeNode treeNode : treeNodes) {
saveTreeNode(treeNode, null);
}
return "success";
}
private void saveTreeNode(TreeNode treeNode, Long parentId) {
TreeNode savedNode = new TreeNode();
savedNode.setLevel(treeNode.getLevel());
savedNode.setContent(treeNode.getContent());
savedNode.setParentId(parentId);
savedNode.setIndexInParent(treeNode.getIndex());
savedNode = treeNodeRepository.save(savedNode);
for (TreeNode childNode : treeNode.getChild()) {
saveTreeNode(childNode, savedNode.getId());
}
}
@DeleteMapping("/{id}")
public String deleteTreeNode(@PathVariable Long id) {
treeNodeRepository.deleteById(id);
return "success";
}
@GetMapping("/")
public List<TreeNode> getAllTreeNodes() {
return treeNodeRepository.findAll();
}
@GetMapping("/{id}")
public TreeNode getTreeNodeById(@PathVariable Long id) {
return treeNodeRepository.findById(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));
}
}
```
其中,`TreeNodeRepository` 是一个继承自 `JpaRepository` 的接口,用于对 `tree_node` 表进行操作。`addTreeNode` 方法将前端传来的数据转换成 `TreeNode` 对象,并通过递归方式将每个节点存储到数据库中。`deleteTreeNode` 方法根据 `id` 删除节点,`getAllTreeNodes` 方法返回所有节点,`getTreeNodeById` 方法返回指定 `id` 的节点。
以上代码仅供参考,具体实现可能需要根据实际情况进行调整。
阅读全文