※ MyBatis(ORM Framework)
- ORM: Object Relational Mapping
- DB의 한 행과 객체를 연결해주는 프레임워크
* application.properties 내의 spring.datasource
- Connection Pool(DB 연결 객체 Connection을 보관하는 장소) / 다수의 사용자가 접근하면, 다수의 Connection이 생성된다.
- Connection을 연결하고 해제하는데 많은 시간이 걸리는데, 규모가 큰 기업의 경우 이런 시간을 줄이기 위해 Pool을 사용한다.
- Connection을 미리 제작해놓고, 사용자가 사용할 때 제공. 미리 제작해놓은 장소가 Pool.
(장점) Connection을 실시간으로 생성할 필요가 없다.
1. Java Eclipse pom.xml <Dependency> 추가
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
추가하면 자동으로 설치된다.
2. 사용하려는 Java Interface 추가
- Interface는 메서드의 Body를 구성하지 않은 클래스라고 해석한다.
UserMapper를 보면, int insertUser();와 같이 Body를 구성하지 않는다.
본래 Interface를 사용하는 클래스에서 Implements 명령어를 사용해 메서드의 Body를 구현하지만 ORM Framework ibatis를 사용해 Annotation으로 구현을 대신한다.
ex) public class MakeUserMapper implements UserMapper
- Interface를 사용해 기초적인 뼈대를 구성할 수 있다.
- 같은 Interface를 사용하지만, 같은 기능이 다른 코드로 구현될 수 있다.(다형성)
- 협업할 때, 기초적인 가이드라인을 제시할 수 있다.(가장 중요하다고 생각함)
- Annotation의 SQL에 매핑의 대상이 되는 컬럼에는 #을 붙인다.
(ex)
INSERT INTO member VALUES(NULL, #{name}, #{phone}, #{email})
* UserMapper.java(Interface)
import java.util.List;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
@Mapper
public interface UserMapper
{
@Insert("INSERT INTO member VALUES(NULL,#{name},#{phone},#{email}")
int insertUser(UserVO userVO);
/* 행을 추가하고 자동증가필드의 값을 파라미터로 전달된 UserVO 의 num 변수에 저장*/
@Insert("INSERT INTO member VALUES(NULL,#{name},#{phone},#{email})")
@Options(useGeneratedKeys = true, keyProperty = "num")
int addAndGetKey(UserVO userVO);
@Select("SELECT * FROM member WHERE num = #{num}")
UserVO getUserById( int num);
@Select("SELECT * FROM member")
List<UserVO> getUserList();
@Update("UPDATE member SET phone=#{phone}, email=#{email} "+
"WHERE num=#{num}")
int updateUser(UserVO u);
@Delete("DELETE FROM member WHERE num=#{num}")
int deleteUser( int num);
}
* UserDao.java
package com.example.demo.dao.mybatis;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.example.demo.vo.UserVO;
@Repository
public class UserDao
{
@Autowired
private UserMapper userMapper;
public UserVO selectById(int num) {
return userMapper.getUserById(num);
}
public int insert(UserVO userVO) {
return userMapper.insertUser(userVO);
}
public int addAndGetKey(UserVO userVO) {
return userMapper.addAndGetKey(userVO);
}
public List<UserVO> getUserList() {
return userMapper.getUserList();
}
public int update(UserVO userVO) {
return userMapper.updateUser(userVO);
}
public int delete(int num) {
return userMapper.deleteUser(num);
}
}
* UserMybasitsController.java
package com.example.demo.controller;
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.RestController;
import com.example.demo.dao.mybatis.UserDao;
import com.example.demo.vo.UserVO;
@RestController
public class UserMybatisController {
@Autowired
private UserDao dao;
@GetMapping("/mb")
public String index() {
return "index";
}
@GetMapping("mb/user/add")
public int insertUser()
{
return dao.insert(new UserVO(0,"obama","010-6541-6239","obama@usa.com"));
}
/* 한 행을 추가하고 저장된 자동증가 필드의 값을 가져오는 예*/
@GetMapping("mb/user/add/getkey")
public int insertAndGetKey() {
UserVO u = new UserVO(0,"trump","010-3910-2540","trump@gmail.com");
int rows = dao.addAndGetKey(u);
int generatedKey = u.getNum();
return generatedKey;
}
@GetMapping("mb/user/{num}")
public String getUser(@PathVariable int num)
{
return dao.selectById(num).toString();
}
@GetMapping("mb/user/list")
public String getUserList()
{
return dao.getUserList().toString();
}
@GetMapping("mb/user/update/{num}")
public int updateUser(@PathVariable("num") int num) {
return dao.update(new UserVO(num,null,"010-3671-2105","updated@gmail.com"));
}
@GetMapping("mb/user/delete")
public int deleteUser() {
return dao.delete(6);
}
}
'프로그래밍' 카테고리의 다른 글
Oracle PL/SQL - Collection (0) | 2021.09.23 |
---|---|
Eclipse Spring Package - Git 연동 (0) | 2021.08.14 |
[MySQL] With Recursive 문, 세션 변수 활용, Pagination (0) | 2021.07.06 |
[웹] Java Spring Framework 활용2 (0) | 2021.06.28 |
[웹] Java Spring Framework 활용 (0) | 2021.06.25 |