MyBatis
sql mapping을 사용하는 영속성 프레임워크.
보통 스프링부트를 사용할때 JPA나 MyBatis중 하나를 사용하는편이다.
혹은 복잡한 쿼리는 MyBatis를 사용하고 나머지는 JPA를 사용하는 등의 방법도 가능.
JPA보다 가볍다는 장점이 있음.
새 프로젝트 생성
pom.xml에 mybatis가 추가됨.
User클래스 생성
- User -
private String id;
private String name;
private String phone;
private String address;
// 모든 필드가 추가된 생성자, get/set메서드 자동생성
DB에 새 스키마 mybatis 생성
user테이블 생성.
참고로 DB의 테이블이름은 대부분 소문자로 작성.
CREATE TABLE IF NOT EXISTS mybatis.user (
id int not null,
name VARCHAR(45) not null,
phone VARCHAR(45) not null,
address VARCHAR(200) not null,
PRIMARY KEY (id)
);
- application.properties -
DB설정
# MySQL DB setting
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=1234
UserController클래스 생성
- UserController -
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping("/{id}")
public User getUser(@PathVariable("id") String id) {
User user = userMapper.getUser(id);
return user;
}
}
@RestController
는 view없이 바로 리턴
User user = 연결할 매퍼(repository).메서드(id);
의 방법으로 DB에서 id로 검색해 데이터를 가져옴.
MyBatis에서는 repository대신 매퍼를 사용.
로고 repository를 불러와 사용하듯 mapper를 불러와 사용. (<-private UserMapper userMapper;
이 부분을 말하는것임)
repository대신 매퍼 인터페이스를 생성.
- UserMapper -
@Mapper // jpa의 repository와 같은 역할을 함
public interface UserMapper {
@Select("select * from user where id = #{id}")
User getUser(String id); // 유저객체 리턴 id로 DB의 user테이블에서 데이터를 찾아 유저객체로 리턴
}
#{id}
는 매개변수의 id가 들어간다는 의미.
insert into mybatis.user(id, name, phone, address)
values (1, '홍길동', '010-1111-1111', '부산진구');
insert into mybatis.user(id, name, phone, address)
values (2, '강감찬', '010-2222-2222', '부산시 중구');
insert into mybatis.user(id, name, phone, address)
values (3, '계백', '010-3333-3333', '서울시 강서구');
insert into mybatis.user
values (4, '이순신', '010-4444-4444', '서울시 북구');
DB에 데이터를 입력 (모든 필드데이터 입력 시 4번 이순신처럼 ()생략가능)
실행 후 http://localhost:8080/users/1 로 접속하여 데이터확인
json형식으로 id가 1번인 user데이터가 User객체로 리턴됨
- UserController -
@GetMapping
public List<User> getUsersList(){
List<User> userList = userMapper.getUserList();
return userList;
}
컨트롤러 클래스에 @RequestMapping("/users")
어노테이션을 통해 주소를 지정했으므로 기본주소를 사용하는 getUserList()메서드는 주소를 따로 지정하지 않아도 된다.
- UserMapper -
@Select("select * from user")
List<User> getUserList();
- UserController -
@PostMapping
public void createUser( @RequestParam("id") String id,
@RequestParam("name") String name,
@RequestParam("phone") String phone,
@RequestParam("address") String address) {
userMapper.insertUser(id, name, phone, address);
}
- UserMapper -
@Insert("insert into user values(#{id}, #{name}, #{phone}, #{address})")
void insertUser(String id, String name, String phone, String address);
http://localhost:8080/users?id=5&name=송상현&phone=010-5555-5555&address=부산진구 양정동
postman을 사용해 전송. 아무것도 리턴되지 않으면 다시 /users로 접근하여 입력되었는지 확인.
정상적으로 입력되었음.
- UserController -
@PutMapping("/{id}")
public void editUser(@PathVariable("id") String id,
@RequestParam("name") String name,
@RequestParam("phone") String phone,
@RequestParam("address") String address) {
int i = userMapper.updatetUser(id, name, phone, address);
if (i > 0) System.out.println("성공!");
}
- UserMapper -
@Update("update user set name = #{name}, phone = #{phone}, address = #{address} where id = #{id}")
int updatetUser(String id, String name, String phone, String address);
http://localhost:8080/users/5?name=송상현&phone=010-5566-5566&address=부산진구 양정동
- UserController -
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable("id") String id) {
userMapper.deleteUser(id);
}
- UserMapper -
@Delete("delete from user where id = #{id}")
void deleteUser(String id);
http://localhost:8080/users/5
5번 유저가 삭제됨