Spring ์์ JPA๋ก ํ๋ก๊ทธ๋๋ฐ ํ๊ธฐ
Spring DataBase
- JDBC
- JdbcTemplate
- MyBatis
- JPA(Java Persistence API)
JPA ์ค์
-application.properties
-pom.xml : dependency ์ถ๊ฐ
https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa
VO CLASS
JPA์์ VO๊ฐ ํ์ํ๋ค : Entity (DB์์ฑ์ ์งํฉ)
Entity -> ํ
์ด๋ธ ์์ฑ (DB๋ชจ๋ธ๋งํ ๋ ์ค๊ณ๋จ๊ณ์์ ์ฐ๋ ์ฉ์ด.)
- ์ฌ๋ฒ, ์ด๋ฆ, ๋ถ์, ๊ธ์ฌ, ์
์ฌ <-- ์ปฌ๋ผ๋ช
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.SequenceGenerator;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@ToString
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Table(name="emp4")
public class Emp
{
@Id
@SequenceGenerator(sequenceName = "EMP4_EMPNO_SEQ", allocationSize =1, name="EMP4_EMPNO_GEN" )
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="EMP4_EMPNO_GEN")
private int empno;
@Column(name="ename")
private String name;
private int deptno;
private int sal;
private java.sql.Date hiredate;
}
|
cs |
INTERFACE
์ธํฐํ์ด์ค (๋ฐ์ดํฐ ์
์ถ๋ ฅ ๊ธฐ๋ฅ์ ๋ด๊ฒ๋๋ ->) : JpaRepository์์ ( ๊ธฐ๋ณธ์ ์ผ๋ก CRUD์ ๊ด๋ จ๋๊ฑด ๋ค ๊ตฌํ๋์ด์๋ค.)
-๋จ์ํ ์ ์ถ๋ ฅ ๊ธฐ๋ฅ์ ๋ฏธ๋ฆฌ ์ค๋น๋์ด ์์.
-์ํ๋ ๊ธฐ๋ฅ์ ์๋ก ์์ฑํด์ค์ผ ํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
|
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
public interface EmpRepository extends JpaRepository<Emp,Integer> {
//emp๋ ํ
์ด๋ธ์ ์ ์ INTEGER๋ ํ๋ผ์ด๋จธ๋ฆฌ ํค์ ์๋ฃํ
Optional<Emp> findByName(String name);
Optional<Emp> findByDeptno(int deptno);
Optional<Emp> findByDeptnoAndName(int deptno,String name);
}
|
cs |
Controller
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
import java.sql.Date;
import java.util.List;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import lombok.extern.slf4j.Slf4j;
@Controller
@Slf4j
@RequestMapping("/jpa")
public class JpaController {
@Autowired
private EmpRepository repo;
@GetMapping("/")
@ResponseBody
public String index() {
return "JPA Controller Working...";
}
@GetMapping("/add")
@ResponseBody
public String add() {
Date hiredate = Date.valueOf("2022-12-28");
Emp emp = new Emp(11,"smith", 20,300,hiredate);
Emp saved = repo.save(emp);
return saved.toString();
}
@GetMapping("/list")
@ResponseBody
public String list() {
List<Emp> saved = repo.findAll();
return saved.toString();
}
@GetMapping("/find/{empno}")
@ResponseBody
public String findById(@PathVariable int empno) {
//Emp saved = repo.findById(empno).get();
//Optional์ ์์ผ๋ฉด ์๋ฌ๊ฐ ๋จ๋๊ฒ ์๋๋ผ null์ด ๋์จ๋ค.
Optional<Emp> op = repo.findById(empno);
if(op.isEmpty()/*op๊ฐ null์ธ ๊ฒฝ์ฐ*/) {
return empno+"๋ฒํธ๋ก ๊ฒ์์คํจ";
}
return op.get().toString();
}
@GetMapping("/name/{name}")
@ResponseBody
public String findByName(@PathVariable String name) {
Optional<Emp> op = repo.findByName(name);
if(op.isEmpty()) {
return name+"์ด๋ฆ์ผ๋ก ๊ฒ์์คํจ";
}
return op.get().toString();
}
@GetMapping("/deptno/{deptno}")
@ResponseBody
public String findByDeptno(@PathVariable int deptno) {
Optional<Emp> op = repo.findByDeptno(deptno);
if(op.isEmpty()) {
return deptno+" ๋ถ์๋ฒํธ๋ก ๊ฒ์์คํจ";
}
return op.get().toString();
}
//ํน์ ๋ถ์์ ๊ทผ๋ฌดํ๋ ์ธ์์ ์ด๋ฆ ๊ฒ์ (WHERE deptno=? and name=?)
@GetMapping("/finddeptnoandname/{deptno}/{name}")
@ResponseBody
public String findByDeptnoAndName(@PathVariable("deptno") int deptno, @PathVariable("name") String name) {
Optional<Emp> op = repo.findByDeptnoAndName(deptno,name);
if(op.isEmpty()) {
return deptno+"/"+name+" ๊ทผ๋ฌด์ ๊ฒ์์คํจ";
}
return op.get().toString();
}
//์์ : Entity ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ save() ํ๋ฉด ํด๋น pk ์ธ ๊ณณ์ ์ฐพ์ ์์ ํด์ค๋ค.
//save()๋ ์์ ํ ์์ ๋ ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๋ฏ๋ก ์์ ์ฌ๋ถ๋ฅผ ํ๋จํ๋๋ฐ ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
@GetMapping("/update/{empno}/{deptno}/{sal}")
@ResponseBody
public String updateByEmpno(@PathVariable int empno,
@PathVariable int deptno, @PathVariable int sal) {
Optional<Emp> op = repo.findById(empno);
if(op.isEmpty()/*op๊ฐ null์ธ ๊ฒฝ์ฐ*/) {
return empno+"๋ฒํธ๋ก ๊ฒ์์คํจ";
}
Emp emp = op.get();
emp.setDeptno(deptno);
emp.setSal(sal);
return repo.save(emp).toString();
}
@GetMapping("/delete/{empno}")
@ResponseBody
public String deleteByEmpno(@PathVariable int empno) {
Optional<Emp> op = repo.findById(empno);
if(op.isEmpty()) {
return empno+"๋ฒํธ๋ก ๊ฒ์์คํจ";
}
else repo.deleteById(empno);
return "์ญ์ ์ฑ๊ณต";
}
}
|
cs |
์คํ๊ฒฐ๊ณผ :
๋๊ธ