프로그래밍

[MyBatis] ORM 프레임워크 활용(1)

RainIron 2021. 7. 6. 00:36
반응형

※ 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);
   }
}

 

반응형