[Spring Mybatis] DB 조회, 수정, 삽입, 삭제 기능 구현
1. Department DTO
Department 테이블에서 조회한 데이터를 채울 DTO(Data Transfer Object)이다.
dto/Department.java
package dto;
public class Department {
int id;
String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2. Department mapper 구현
mapper/DepartmentMapper.java
package mapper;
import java.util.List;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import dto.Department;
@Mapper
public interface DepartmentMapper {
@Select("SELECT * FROM department")
List<Department> findAll();
@Select("SELECT * FROM department WHERE id = #{id}")
Department findOne(int id);
@Insert("INSERT department (name) VALUES (#{name})")
@Options(useGeneratedKeys=true, keyProperty="id")
void insert(Department department);
@Update("UPDATE department SET name = #{name} WHERE id = #{id}")
void update(Department department);
@Delete("DELETE FROM department WHERE id = #{id}")
void delete(int id);
}
@Mapper
mybatis mapper에는 @Mapper 어노테이션이 붙어있어야 한다.
findAll
@Select("SELECT * FROM Department")
List<Department> findAll();
findAll 메서드는 department 테이블의 모든 레코드를 조회해서 리턴한다. findAll 메서드를 호출하면, "SELECT * FROM Department" SQL 명령이 MySQL 엔진에서 실행된다. 이 메서드의 조회 결과 레코드 한 개당 Department 객체 한 개가 생성되어 조회 결과 레코드의 칼럼들이 Department 객체의 속성에 채워진다. 이 때 컬럼명과 객체의 속성명이 일치하는 것만 채워지고 일치하지 않는 것은 무시된다. 이렇게 생성된 Department 객체들이 List 타입의 객체에 채워져 리턴된다.
- 조회 결과 칼럼명 일치
SELECT SQL 명령의 조회 결과가 Java 객체에 자동으로 채워질 때 조회 결과 칼럼명과 Java 객체의 setter 이름이 일치해야 한다.
findOne
@Select("SELECT * FROM department WHERE id = #{id}")
Department findOne(int id);
findOne 메서드는 department 테이블의 레코드 한개를 조회해서 리턴한다. findOne 메서드를 호출하면 "SELECT * FROM department WHERE id = #{id}" 명령이 MySQL 엔진에서 실행된다. 이때, 이 메소드의 파라미터 id 변수의 값이, #{id} 부분에 채워진 후 실행된다. Department 객체를 한 개 생성해서, 조회 결과 레코드의 각 컬럼의 값을, 이 Department 객체에 채워서 리턴한다. 이때 컬럼명과 객체의 속성명이 일치하는 것만 채워지고, 일치하지 않는 것은 무시된다. 조회 결과가 없을 경우에, 이 메소드는 null을 리턴한다.
insert
@Insert("INSERT department (name) VALUES (#{name})")
@Options(useGeneratedKeys=true, keyProperty="id")
void insert(Department department);
insert 메서드의 파라미터 변수가 Department 객체이다. 이 Java 객체의 속성값이 INSERT SQL 명령의 #{...} 부분에 채워져서 실행된다. Java 객체의 속성명과 #{...} 부분의 이름이 일치해야 속성값이 채워질 수 있다.
@Options(useGeneratedKeys=true, keyProperty="id")
INSERT할 테이블의 기본키(primary key) 필드 이름이 "id"이고, 이 필드의 값은 자동으로 생성된다는 선언이다. (Auto Increment 필드)
update
@Update("UPDATE department SET name = #{name} WHERE id = #{id}")
void update(Department department);
delete
@Delete("DELETE FROM department WHERE id = #{id}")
void delete(int id);
3. Department Controller
controller/DepartmentController.java
package controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import dto.Department;
import mapper.DepartmentMapper;
@Controller
@RequestMapping("department")
public class DepartmentController {
@Autowired
DepartmentMapper departmentMapper;
@RequestMapping("list")
public String list(Model model) {
List<Department> departments = departmentMapper.findAll();
model.addAttribute("departments", departments);
return "department/list";
}
@GetMapping("create")
public String create(Model model) {
model.addAttribute("department", new Department());
return "department/edit";
}
@PostMapping("create")
public String create(Model model, Department department) {
departmentMapper.insert(department);
return "redirect:list";
}
@GetMapping("edit")
public String edit(Model model, @RequestParam("id") int id) {
Department department = departmentMapper.findOne(id);
model.addAttribute("department", department);
return "department/edit";
}
@PostMapping("edit")
public String edit(Model model, Department department) {
departmentMapper.update(department);
return "redirect:list";
}
@RequestMapping("delete")
public String delete(Model model, @RequestParam("id") int id) {
departmentMapper.delete(id);
return "redirect:list";
}
}
@Autowired
@Autowired
DepartmentMapper departmentMapper;
DepartmentMapper 인터페이스를 구현한 Java 클래스를 spring mybatis가 자동으로 구현해주고, 그 클래스의 객체를 하나 생성하여 departmentMapper 멤버 변수에 자동으로 대입해준다.
4. request parameter 전달
액션 메서드의 파라미터에 request parameter 값이 채워져서 액션 메서드에 전달된다.
값을 하나씩 전달 받을 때 - @RequestParam
@GetMapping("edit")
public String edit(Model model, @RequestParam("id") int id)
값을 여러 개 전달 받을 때 - 파라미터 객체
@PostMapping("edit")
public String edit(Model model, Department department)
request parameter 데이터가 Department 객체에 자동으로 채워진다. request parameter 데이터의 이름과 액션 메서드의 파라미터 객체의 속성이름이 일치할 경우에 (setter 메서드 이름이 일치할 경우에) request parameter 데이터가 그 속성에 자동으로 채워진다.
'web > Spring' 카테고리의 다른 글
[Spring Boot] Flyway를 이용한 데이터 마이그레이션 / Spring DB Migration Tool flyway (0) | 2021.12.03 |
---|---|
[Spring] RestTemplate / spring 에서 http 통신하는 법 / API 호출 (2) | 2021.12.01 |
[JSP] formatNumber, formatDate 확장 태그 (2) | 2021.11.25 |
[Spring Web MVC] 컨트롤러 클래스, 뷰 구현 (2) | 2021.11.24 |
[Spring] 의존성 주입 애노테이션 @Autowired @Resource @Inject (0) | 2021.11.22 |
댓글 개