рдЕрдореВрд░реНрдд CRUD рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдХрдВрдЯреНрд░реЛрд▓рд░ рддрдХ: рдЖрдк рд╕реНрдкреНрд░рд┐рдВрдЧ + рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рде рдФрд░ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдПрдХ рд╕рд╣рдХрд░реНрдореА рд▓реЗрдЦ Habr├й рдкрд░ рднрдбрд╝рдХ рдЧрдпрд╛, рдЬрд┐рд╕рдиреЗ рдЬреЗрдирд░рд┐рдХ рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ред рдЙрд╕рдиреЗ рдореБрдЭреЗ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдпрд╛рдж рджрд┐рд▓рд╛рдпрд╛ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлрд╝реНрдЯ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реВрдБ, рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрд╛рдардХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред



рдЖрдЙрдЯрдкреБрдЯ рдкрд░, рд╣рдореЗрдВ рдПрдХ рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рд╕рд┐рд╕реНрдЯрдо рдорд┐рд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рдЗрдХрд╛рдИ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА-рд╕рд░реНрд╡рд┐рд╕-рдХрдВрдЯреНрд░реЛрд▓рд░ рдмрдВрдбрд▓ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдореЗрдВ рдПрдХ рдмреАрди рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рддреБрд░рдВрдд рд╕рдВрд╕рд╛рдзрди ред
рд╢рд╛рдЦрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдирд╣реАрдВ рдХрд░рддрд╛: standart_version ред
рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг abstract_version рд╢рд╛рдЦрд╛ рдореЗрдВ рд╣реИред

рдореИрдВрдиреЗ JPA, Web, рдФрд░ H2 рдЪреМрдЦрдЯреЗ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реБрдП рд╕реНрдкреНрд░рд┐рдВрдЧ рдЕрдирд┐рд▓рд┐рдЧреНрд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░рдЦрд╛ред рдЧреНрд░реЗрдб, рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ 2.0.5ред рдпрд╣ рдХрд╛рдлреА рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред



рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗ рднрдВрдбрд╛рд░ рддрдХ рдкрд░рд┐рд╡рд╣рди рдХреЗ рдХреНрд▓рд╛рд╕рд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХрд┐рд╕реА рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ рд╕реЗ рд░рд╣рд┐рддред рдпрджрд┐ рдЖрдк рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рд░ рдкрд░ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╕рд╛рд░ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╕реНрдХреНрд░реЙрд▓ рдХрд░реЗрдВред рд▓реЗрдХрд┐рди, рдлрд┐рд░ рднреА, рдореИрдВ рдкреВрд░рд╛ рд▓реЗрдЦ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред

рдХреНрд▓рд╛рд╕рд┐рдХ рд╕рдВрд╕реНрдХрд░рдгред


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдВрд╕рд╛рдзрди рдЙрдирдХреЗ рд▓рд┐рдП рдХрдИ рд╕рдВрд╕реНрдерд╛рдПрдБ рдФрд░ рд╡рд┐рдзрд┐рдпрд╛рдБ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд▓реЗрдЦ рдореЗрдВ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдХрд╛рдИ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рд╕реЗрд╡ () рд╡рд┐рдзрд┐ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рд╕реЗрд╡рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рдпрдВрддреНрд░рдХ рддрдХ рдЦреАрдВрдЪреЗрдВрдЧреЗред рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдореЗрдВ, рдЙрдирдореЗрдВ рд╕реЗ 7 рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕реАрдЖрд░рдпреВрдбреА / рдЬреЗрдкреАрдП рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рдЖрдкрдХреЛ рдмрдЪрдд / рд╣рдЯрд╛рдиреЗ / рд╣рдЯрд╛рдиреЗ рдХреЗ рдПрдХ рджрд░реНрдЬрди рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреА рдЖрд╡рд╢реНрдпрдХ рдЪреАрдЬреЛрдВ рд╕реЗ рд╡рд┐рдЪрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рдЬреИрд╕реЗ рдХрд┐ рд╕рддреНрдпрд╛рдкрди, рдбреЛрдкрд┐рдВрдЧ рд╡рдЧреИрд░рд╣ред рдЖрдк рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рд╣реИрдмрд░ рдХреЗ рдЕрдиреНрдп рд▓реЗрдЦреЛрдВ рдореЗрдВ рдЕрдзреНрдпрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдбреЛрдореЗрди:


@Entity public class User implements Serializable { private Long id; private String name; private String phone; @Id @GeneratedValue public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(nullable = false) public String getName() { return name; } public void setName(String name) { this.name = name; } @Column public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } //equals, hashcode, toString } 

рднрдВрдбрд╛рд░:


 @Repository public interface UserRepository extends CrudRepository<User, Long> { } 

рд╕реЗрд╡рд╛:


 public interface UserService { Optional<User> save(User user); } 

рд╕реЗрд╡рд╛ (рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди):


 @Service public class UserServiceImpl implements UserService { private final UserRepository userRepository; @Autowired public UserServiceImpl(UserRepository userRepository) { this.userRepository = userRepository; } @Override public Optional<User> save(User user) { return Optional.of(userRepository.save(user)); } } 

рдирд┐рдпрдВрддреНрд░рдХ:


 @RestController @RequestMapping("/user") public class UserController { private final UserService service; @Autowired public UserController(UserService service) { this.service = service; } @PostMapping public ResponseEntity<User> save(@RequestBody User user) { return service.save(user).map(u -> new ResponseEntity<>(u, HttpStatus.OK)) .orElseThrow(() -> new UserException( String.format(ErrorType.USER_NOT_SAVED.getDescription(), user.toString()) )); } } 

рд╣рдореЗрдВ рдЖрд╢реНрд░рд┐рдд рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдореВрд╣ рдорд┐рд▓рд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ CRUD рд╕реНрддрд░ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдХрд╛рдИ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣ рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ, рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдореЗрдВ рдЕрдзрд┐рдХ рд╣реИрдВред рд▓реЗрдЦрди рдкрд░рддреЛрдВ рдХреЗ рд╕рднреА рдЕрдореВрд░реНрдд рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЗрд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдорд╛рди рд▓реАрдЬрд┐рдП, рд╣рдореЗрдВ рдПрдХ рдФрд░ рдЗрдХрд╛рдИ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХрд╣рддреЗ рд╣реИрдВ, рдХрд╛рд░ред рд╣рдордиреЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд╕реНрддрд░ рдкрд░ рдкреИрд╕рд╛ рдирд╣реАрдВ рджрд┐рдпрд╛ (рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдореИрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдЗрдХрд╛рдИ рдмрдирд╛рдПрдБред

 @Entity public class Car implements Serializable { private Long id; private String brand; private String model; @Id @GeneratedValue public Long getId() { return id; } public void setId(Long id) { this.id = id; } //, , equals, hashcode, toString } 

рдлрд┐рд░ рдПрдХ рднрдВрдбрд╛рд░ рдмрдирд╛рдПрдБред

 public interface CarRepository extends CrudRepository<Car, Long> { } 

рдлрд┐рд░ рд╕реЗрд╡рд╛ ...

 public interface CarService { Optional<Car> save(Car car); List<Car> saveAll(List<Car> cars); Optional<Car> update(Car car); Optional<Car> get(Long id); List<Car> getAll(); Boolean deleteById(Long id); Boolean deleteAll(); } 

рдлрд┐рд░ рд╕реЗрд╡рд╛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди ....... рдирд┐рдпрдВрддреНрд░рдХ ...........

рд╣рд╛рдВ, рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд░реНрдЧ рд╕реЗ рдПрдХ рд╣реА рддрд░реАрдХреЗ (рд╡реЗ рдпрд╣рд╛рдВ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реИрдВ) рдХреЛ рдХреЙрдкреА рдФрд░ рдкреЗрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХрд╛рд░ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде, рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЕрдЧрд▓реА рдЗрдХрд╛рдИ рд▓рд╛рдЗрди рдореЗрдВ рд╣реИ, рдФрд░ рд╡рд╣рд╛рдВ рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рджрд┐рдЦрддреЗ рд╣реИрдВ ... рдЖрдорддреМрд░ рдкрд░ рдЖрдк рджреВрд╕рд░реЗ рд╕реЗ рдердХ рдЬрд╛рддреЗ рд╣реИрдВ, рджрд░реНрдЬрдиреЛрдВ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрд╡рд╛ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг (рдХреЙрдкреА-рдкреЗрд╕реНрдЯ, рдЗрдХрд╛рдИ рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░, рдХрд╣реАрдВ рдЧрд▓рдд, рдХрд╣реАрдВ рд╕реАрд▓ ...) рдХрд┐рд╕реА рднреА рдиреАрд░рд╕ рдХрд╛рдо рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред рдЕрдкрдиреЗ рдЕрд╡рдХрд╛рд╢ рдкрд░ рдХрд┐рд╕реА рддрд░рд╣ рдмреАрд╕ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдФрд░ рдЖрдк рд╕рдордЭ рдЬрд╛рдПрдВрдЧреЗ рдХрд┐ рдореЗрд░рд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред

рдФрд░ рдЗрд╕рд▓рд┐рдП, рдПрдХ рдмрд┐рдВрджреБ рдкрд░, рдЬрдм рдореБрдЭреЗ рд╕рд┐рд░реНрдл рдЬреЗрдирд░рд┐рдХ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рдереА, рддреЛ рдпрд╣ рдореБрдЭ рдкрд░ рд╣рд╛рд╡реА рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрд╣реБрдд рдХрдо рджрд┐рдирдЪрд░реНрдпрд╛ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рддреЛ, рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рд╛рд░ред


рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЕрд░реНрде рд╕рднреА рддрд░реНрдХреЛрдВ рдХреЛ рдЕрдореВрд░реНрддрддрд╛ рдореЗрдВ рд▓реЗ рдЬрд╛рдирд╛ рд╣реИ, рдЕрдореВрд░реНрдд рдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рд╕реЗ рдмрд╛рдВрдзрдирд╛ рдФрд░ рдЕрдиреНрдп рдбрд┐рдмреНрдмреЗ рдХреЛ рдбрд┐рдмреНрдмреЗ рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реИред рдФрд░ рд╡рд╣ рдпрд╣ рд╣реИред рдлрд▓рд┐рдпреЛрдВ рдореЗрдВ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВред рдХреЗрд╡рд▓ рдЕрдиреНрдп рдмреАрдиреНрд╕ рдХрд╛ рдПрдХ рдЗрдВрдЬреЗрдХреНрд╢рдиред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдПрдХ рдмрд╛рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдФрд░ рд▓реЙрдЬрд┐рдХ рд▓рд┐рдЦрдирд╛ рдФрд░ рдирдИ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рдЗрд╕реЗ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдирд╣реАрдВ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред

рдЪрд▓реЛ рд╣рдорд╛рд░реЗ рдЕрдореВрд░реНрдд рдХреА рдЖрдзрд╛рд░рд╢рд┐рд▓рд╛ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ - рдПрдХ рдЕрдореВрд░реНрдд рдЗрдХрд╛рдИред рдпрд╣ рдЙрд╕рд╕реЗ рд╣реИ рдХрд┐ рдЕрдореВрд░реНрдд рдирд┐рд░реНрднрд░рддрд╛ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╢реБрд░реВ рд╣реЛрдЧреА, рдЬреЛ рд╕реЗрд╡рд╛ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧреАред

рд╕рднреА рд╕рдВрд╕реНрдерд╛рдУрдВ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХреНрд╖реЗрддреНрд░ (рдЖрдорддреМрд░ рдкрд░ рдЕрдзрд┐рдХ) рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдЖрдИрдбреА рд╣реИред рд╣рдо рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдЕрдореВрд░реНрдд рдЗрдХрд╛рдИ рдореЗрдВ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рдХрд╛рд░ рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рддреЗ рд╣реИрдВред

AbstractEntity:


 @MappedSuperclass public abstract class AbstractEntity implements Serializable { private Long id; @Id @GeneratedValue public Long getId() { return id; } public void setId(Long id) { this.id = id; } } 

@MappedSuperclass рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдЕрдореВрд░реНрдд рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рдпрд╛рдж рд░рдЦреЗрдВ - рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдХреЛ рдпрд╣ рднреА рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рдПрдХ рдЕрдореВрд░реНрдд рд╣реИред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛:


 @Entity public class User extends AbstractEntity { private String name; private String phone; //... } 

рдХрд╛рд░ рдХреЗ рд╕рд╛рде, рддрджрдиреБрд╕рд╛рд░, рд╡рд╣реАред

рдкреНрд░рддреНрдпреЗрдХ рдкрд░рдд рдореЗрдВ, рдбрд┐рдмреНрдмреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рд░ рд╡рд░реНрдЧ рд╣реЛрдЧрд╛ред рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рдЕрд▓рд╛рд╡рд╛ - рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдП рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реЛрдЧрд╛ред

рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рдПрдХ рд╕рд╛рдЭрд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╣реИред

CommonRepository:


 @NoRepositoryBean public interface CommonRepository<E extends AbstractEntity> extends CrudRepository<E, Long> { } 

рдЗрд╕ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ, рд╣рдо рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ: рдЗрд╕рдореЗрдВ рднрд╛рдЧ рд▓реЗрдиреЗ рд╡рд╛рд▓реА рд╕рднреА рд╕рдВрд╕реНрдерд╛рдПрдВ рд╕рд╛рд░ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗрдВрдЧреАред рдЕрдЧрд▓рд╛, рдкреНрд░рддреНрдпреЗрдХ рдЗрдХрд╛рдИ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдирд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА-рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА-рд╕рд░реНрд╡рд┐рд╕-рдХрдВрдЯреНрд░реЛрд▓рд░ рдЪреЗрди рдХрд┐рд╕ рдЗрдХрд╛рдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧреАред

UserRepository:


 @Repository public interface UserRepository extends CommonRepository<User> { } 

рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдП рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗрдЯрдЕрдк рдпрд╣рд╛рдВ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ - рд╕рдм рдХреБрдЫ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдмрд╛рдж рд╕рд░реНрд╡рд┐рд╕ рдЖрддреА рд╣реИред рд╣рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рдЕрдореВрд░реНрддрддрд╛ рдФрд░ рдмреАрди рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

CommonService:


 public interface CommonService<E extends AbstractEntity> { { Optional<E> save(E entity); //-     } 

AbstractService:


 public abstract class AbstractService<E extends AbstractEntity, R extends CommonRepository<E>> implements CommonService<E> { protected final R repository; @Autowired public AbstractService(R repository) { this.repository = repository; } // ,    } 

рдпрд╣рд╛рдВ рд╣рдо рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рднрдВрдбрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдирдХреАрдХреГрдд рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рднреА рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдо рдмреАрди рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рднрдВрдбрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдЕрднреА рддрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рд╣рдореЗрдВ рдЕрднреА рддрдХ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдЕрдореВрд░реНрдд рдореЗрдВ рдХрд┐рд╕ рдЗрдХрд╛рдИ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╣рдореЗрдВ рдХрд┐рд╕ рднрдВрдбрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

UserService:


 @Service public class UserService extends AbstractService<User, UserRepository> { public UserService(UserRepository repository) { super(repository); } } 

рдмрд┐рди рдореЗрдВ, рд╣рдо рдЕрдВрддрд┐рдо рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ - рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрд╕ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рд╣реИ, рдЬрд┐рд╕реЗ рддрдм рдЕрдореВрд░реНрдд рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рд╡рд╣ рдпрд╣ рд╣реИред

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдЕрдореВрд░реНрддрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдордиреЗ рдПрдХ рд░рд╛рдЬрдорд╛рд░реНрдЧ рдмрдирд╛рдпрд╛, рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдо рд╕рднреА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдЪрд▓рд╛рдПрдВрдЧреЗред рдмрд┐рди рдореЗрдВ, рд╣рдо рд░рд╛рдЬрдорд╛рд░реНрдЧ рдкрд░ рдбрд┐рдиреЛрдорд┐рдиреЗрд╢рди рд▓рд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдо рдЙрд╕ рдЗрдХрд╛рдИ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рд░рд╛рдЬрдорд╛рд░реНрдЧ рдкрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдирд┐рдпрдВрддреНрд░рдХ рдПрдХ рд╣реА рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рдЕрдореВрд░реНрдд, рдмрд┐рдиред

CommonController:


 public interface CommonController<E extends AbstractEntity> { @PostMapping ResponseEntity<E> save(@RequestBody E entity); //  } 

AbstractController:


 public abstract class AbstractController<E extends AbstractEntity, S extends CommonService<E>> implements CommonController<E> { private final S service; @Autowired protected AbstractController(S service) { this.service = service; } @Override public ResponseEntity<E> save(@RequestBody E entity) { return service.save(entity).map(ResponseEntity::ok) .orElseThrow(() -> new SampleException( String.format(ErrorType.ENTITY_NOT_SAVED.getDescription(), entity.toString()) )); } //  } 

UserController:


 @RestController @RequestMapping("/user") public class UserController extends AbstractController<User, UserService> { public UserController(UserService service) { super(service); } } 

рдпрд╣ рдкреВрд░реА рд╕рдВрд░рдЪрдирд╛ рд╣реИред рдпрд╣ рдПрдХ рдмрд╛рд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред

рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ?


рдФрд░ рдЕрдм рдХрд▓реНрдкрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдирдИ рдЗрдХрд╛рдИ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА AbstractEntity рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рд╣рдореЗрдВ рдПрдХ рдорд┐рдирдЯ рд▓рдЧреЗрдЧрд╛ред рдФрд░ рдХреЛрдИ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдФрд░ рдХрд░реЗрдХреНрд╢рди рдирд╣реАрдВред

AbstractEntity рдХрд╛рд░ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред

CarRepository:


 @Repository public interface CarRepository extends CommonRepository<Car> { } 

CarService:


 @Service public class CarService extends AbstractService<Car, CarRepository> { public CarService(CarRepository repository) { super(repository); } } 

CarController:


 @RestController @RequestMapping("/car") public class CarController extends AbstractController<Car, CarService> { public CarController(CarService service) { super(service); } } 

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рд╣реА рддрд░реНрдХ рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдореЗрдВ рдХреЗрд╡рд▓ рдмреАрди рдЬреЛрдбрд╝рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рди рдореЗрдВ рддрд░реНрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╡реЗ рдПрдХ рдмрд╛рд░ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рдирд┐рд╖реНрдХрд░реНрд╖


рдмреЗрд╢рдХ, рдЙрджрд╛рд╣рд░рдг рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЧреЛрд▓рд╛рдХрд╛рд░ рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЗрдХрд╛рдИ рдХреЗ рд▓рд┐рдП CRUD рдореЗрдВ рдПрдХ рд╣реА рддрд░реНрдХ рд╣реЛрддрд╛ рд╣реИред рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ - рдЖрдкрдХреЛ рдЕрднреА рднреА рдмрд┐рди рдореЗрдВ рдХреБрдЫ рддрд░реАрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ рдирдП рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдЗрдХрд╛рдИ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рд╕реЗ рдЖрдПрдЧрд╛ред рдЦреИрд░, рдЕрдЧрд░ рд╕реАрдЖрд░рдпреВрдбреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рдХрд╛ 60 рдкреНрд░рддрд┐рд╢рдд рдЕрдореВрд░реНрддрддрд╛ рдореЗрдВ рд░рд╣реЗрдЧрд╛ред рдФрд░ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рд╣рдо рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреЛрдб рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рдЙрддрдирд╛ рд╣реА рдЕрдзрд┐рдХ рд╕рдордп рд╣рдо рдиреАрд░рд╕ рдХрд╛рдо рдкрд░ рдЦрд░реНрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдпрд╛ рдЯрд╛рдЗрдкреЛ рдХрд╛ рдЬреЛрдЦрд┐рдо рдЕрдзрд┐рдХ рд╣реЛрддрд╛ рд╣реИред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд▓реЗрдЦ рдЙрдкрдпреЛрдЧреА рдерд╛, рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдпреБрдкреАрдбреАред

рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдПрд▓реЗрдХреНрд╕реЗрдиреНрдбреА рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдмреАрди рдХреА рдЖрд░рдВрднреАрдХрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ рдФрд░ рдЗрд╕ рддрд░рд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдХрд╛рдлреА рд╕реБрдзрд╛рд░ рд╣реБрдЖред рдпрджрд┐ рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдФрд░ рдХреИрд╕реЗ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВ, рдФрд░ рд╢рд╛рдпрдж рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред

Source: https://habr.com/ru/post/hi423741/


All Articles