如何使用 spring 引导在数据库中找到现有对象 ID?
How would I find the existing objects id in the database using spring boot?
该应用程序有 2 个功能,我可以在其中创建一个新的脚本文件,还可以编辑现有的脚本文件。我对创建和编辑的逻辑基本上是相同的,唯一的主要区别是编辑而不是创建新脚本,我将必须找到现有脚本并覆盖它。我不确定我应该如何在 spring boot.
中通过 id 找到脚本
这是我的创建脚本功能:
控制器Class:
@Controller
@RequestMapping("/api/auth/")
public class TestServerController {
@Autowired
ScriptsRepository scriptsRepository;
@Autowired
LineItemRepository lineItemRepository;
@Autowired
LineItemDataRepository lineItemDataRepository;
public TestServerController() {
}
@CrossOrigin(origins = "*")
@RequestMapping(value = "createScript")
public ResponseEntity<?> createScript(@RequestBody String body, @RequestParam String name) throws Exception {
JSONArray script = new JSONArray(body);
Scripts new_script = new Scripts(name);
scriptsRepository.save(new_script);
for (int i = 0;i<script.length();i++) {
JSONObject current_line_item = (JSONObject) script.get(i);
if(!current_line_item.has("keyword") ){
return ResponseEntity
.badRequest()
.body(new MessageResponse("Invalid Json Object"));
}
String keyword = current_line_item.getString("keyword");
LineItem new_li = new LineItem(keyword,i);
new_li.setSid(new_script);
lineItemRepository.save(new_li);
int order = 0;
var keys = current_line_item.keys();
for (Iterator<String> it = keys; it.hasNext(); ) {
var key = it.next();
if(key.equals("keyword")){
continue;
}
var value = current_line_item.getString(key);
// we will need to do something about this if the column values arent strings
LineItemData vb = new LineItemData(key,value,order);
vb.setLid(new_li);
lineItemDataRepository.save(vb);
order++;
}
}
return ResponseEntity.ok(new MessageResponse("Script Uploaded Successfully"));
}
对于编辑脚本,我想删除 Scripts new_script = new Scripts(name);
并使用 findbyId 在数据库中查找脚本并将其传递到 scriptsRepository.save(new_script);
而不是 new_script,我只需要使用 id 的脚本文件。这对我没有用,我遇到了错误。还有其他方法吗?
当您使用 scriptsRepository.save(script) 时,它会将脚本保存在您的数据库中。但是,如果您在数据库中已有一个脚本,其 ID 与您通过参数传递的脚本的 ID 相同,则它不会创建一个新脚本,而只是使用您要保存的脚本的信息更新它。
遵循 REST API 设计的脚本控制器(仅使用更新方法)将是这样的:
@RestController
@RequestMapping("/scripts")
public class ScriptController {
@Autowired
ScriptRepository scriptRepository;
@PutMapping("/{id}")
@ResponseStatus(HttpStatus.OK)
public Script update(@RequestBody Script script, @PathVariable long id) {
if (scriptRepository.findById(id).isEmpty()) {
throw new RecordNotFoundException();
}
script.setId(id);
return scriptRepository.save(script);
}
}
要访问它,您需要使用端点 localhost:8080/scripts/{id}(如果您使用默认 Spring Boot localhost:8080).
您不需要抛出异常,但如果您需要,您需要像这样创建一个简单的 class:
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;
@ResponseStatus(HttpStatus.NOT_FOUND)
public class RecordNotFoundException extends RuntimeException {
}
该应用程序有 2 个功能,我可以在其中创建一个新的脚本文件,还可以编辑现有的脚本文件。我对创建和编辑的逻辑基本上是相同的,唯一的主要区别是编辑而不是创建新脚本,我将必须找到现有脚本并覆盖它。我不确定我应该如何在 spring boot.
中通过 id 找到脚本这是我的创建脚本功能:
控制器Class:
@Controller
@RequestMapping("/api/auth/")
public class TestServerController {
@Autowired
ScriptsRepository scriptsRepository;
@Autowired
LineItemRepository lineItemRepository;
@Autowired
LineItemDataRepository lineItemDataRepository;
public TestServerController() {
}
@CrossOrigin(origins = "*")
@RequestMapping(value = "createScript")
public ResponseEntity<?> createScript(@RequestBody String body, @RequestParam String name) throws Exception {
JSONArray script = new JSONArray(body);
Scripts new_script = new Scripts(name);
scriptsRepository.save(new_script);
for (int i = 0;i<script.length();i++) {
JSONObject current_line_item = (JSONObject) script.get(i);
if(!current_line_item.has("keyword") ){
return ResponseEntity
.badRequest()
.body(new MessageResponse("Invalid Json Object"));
}
String keyword = current_line_item.getString("keyword");
LineItem new_li = new LineItem(keyword,i);
new_li.setSid(new_script);
lineItemRepository.save(new_li);
int order = 0;
var keys = current_line_item.keys();
for (Iterator<String> it = keys; it.hasNext(); ) {
var key = it.next();
if(key.equals("keyword")){
continue;
}
var value = current_line_item.getString(key);
// we will need to do something about this if the column values arent strings
LineItemData vb = new LineItemData(key,value,order);
vb.setLid(new_li);
lineItemDataRepository.save(vb);
order++;
}
}
return ResponseEntity.ok(new MessageResponse("Script Uploaded Successfully"));
}
对于编辑脚本,我想删除 Scripts new_script = new Scripts(name);
并使用 findbyId 在数据库中查找脚本并将其传递到 scriptsRepository.save(new_script);
而不是 new_script,我只需要使用 id 的脚本文件。这对我没有用,我遇到了错误。还有其他方法吗?
当您使用 scriptsRepository.save(script) 时,它会将脚本保存在您的数据库中。但是,如果您在数据库中已有一个脚本,其 ID 与您通过参数传递的脚本的 ID 相同,则它不会创建一个新脚本,而只是使用您要保存的脚本的信息更新它。
遵循 REST API 设计的脚本控制器(仅使用更新方法)将是这样的:
@RestController
@RequestMapping("/scripts")
public class ScriptController {
@Autowired
ScriptRepository scriptRepository;
@PutMapping("/{id}")
@ResponseStatus(HttpStatus.OK)
public Script update(@RequestBody Script script, @PathVariable long id) {
if (scriptRepository.findById(id).isEmpty()) {
throw new RecordNotFoundException();
}
script.setId(id);
return scriptRepository.save(script);
}
}
要访问它,您需要使用端点 localhost:8080/scripts/{id}(如果您使用默认 Spring Boot localhost:8080).
您不需要抛出异常,但如果您需要,您需要像这样创建一个简单的 class:
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;
@ResponseStatus(HttpStatus.NOT_FOUND)
public class RecordNotFoundException extends RuntimeException {
}