Post

04 mybatis

04 mybatis

1. mybatis

1. mybatis

  • SQL Mapper 프레임워크
  • 직접 작성한 SQL을 매핑해서 Java 객체와 연동
  • JDBC 기반 → 커넥션 풀(HikariCP 등)과 함께 사용
  • 특징: SQL 제어권을 개발자가 직접 갖는다

2. 특징

항목내용
SQL 작성직접 SQL 작성 → 복잡한 쿼리도 자유롭게 사용 가능
객체 매핑ResultMap/자동 매핑으로 SQL 결과 → 객체 변환
유연성ORM보다 자유로운 SQL 제어 가능
커넥션JDBC 기반 → DataSource(HikariCP 등) 사용
트랜잭션스프링 @Transactional과 연동 가능

2. Note

  • 인터페이스 + XML 조합으로 사용이 보편적!
  • JPA랑 가장 크게 다른 부분은 SQL작성하고 안하고의 차이, 어차피 비슷하게 클래스와 인터페이스는 작업을 해야함.
  • 어떻게 구현하고 사용할것인가에 대한 부분,
  • 원론적인 데이터에 대한 접근 방식차이 일뿐.
  • 상황에 맞게 최적화된 방법으로 사용 필요!

3. mybatis 사용법

구분역할비고
전달 데이터파라미터로 전달할 DTO/VO 객체Mapper클래스 호출할때 파라미터
SQL 반환 타입DB 조회 결과를 받을 객체 타입SQL조회후 리턴할 타입
Mapper interfaceSQL과 매핑되는 인터페이스인터페이스로 생성함.
SQL이 담긴 XML실제 SQL 쿼리 정의Mapper 클래스에서 처리하면 불필요

1. SQL 반환 타입

1
2
3
4
  public class User {
      private Long id;
      private String name;
      private String email;

2. Mapper 클래스

1. Mapper로 바로 SQL 처리하는 경우

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Mapper
public interface UserMapper {

    @Select("SELECT id, name, email FROM users WHERE id = #{id}")
    User findById(@Param("id") Long id);

    @Insert("INSERT INTO users(name, email) VALUES(#{name}, #{email})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insert(User user);

    @Update("UPDATE users SET email = #{email} WHERE id = #{id}")
    void updateEmail(@Param("id") Long id, @Param("email") String email);

    @Delete("DELETE FROM users WHERE id = #{id}")
    void delete(@Param("id") Long id);
}
  • XML 없이 SQL 작성 가능
  • Mapper 인터페이스 중심
  • 간단 CRUD나 작은 프로젝트에 적합
  • 스프링 트랜잭션, 커넥션 풀과 완전히 통합 가능

2. Mapper interface + SQL이 담긴 XML 조합

  • Mapper 인터페이스

    1
    2
    3
    4
    5
    6
    7
    8
    
    @Mapper
    public interface UserMapper {
        User findById(Long id);
        void insert(User user);
        void updateEmail(Long id, String email);
        void delete(Long id);
    }
    //별도의 SQL 작성 X
    
  • SQL
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      
    <mapper namespace="com.example.mapper.UserMapper">
        <select id="findById" parameterType="long" resultMap="userResultMap">
            SELECT id, name, email
            FROM users
            WHERE id = #{id}
        </select>
      
     // 기본적으로 resources/내에 위치함.
    
  • Note
    • namespace = 인터페이스 풀 경로 + 클래스명 (필수)
    • 파일명 = 클래스명 (관례, 관리 편의)
    • id = 메서드명 (필수)

3. 서비스에서 실행

1
2
3
4
5
6
7
8
9
10
11
  @Service
  public class UserService {
  
      @Autowired
      private UserMapper userMapper;
  
      @Transactional
      public void register(User user) {
          userMapper.insert(user);
      }
  }

4. 그외 설정

1. Mapper Bean 클래스

1
2
3
  @SpringBootApplication
  @MapperScan("com.example.mapper") 
  public class Application { }
  • MapperScan은 interface *Mapper에서 @Mapper표기하지 않은 경우 필요.
  • 그외 기본 설정은 스프링부트에서 기본 제공하고 있음.

2. XML경로설정(application.properties)

1
  mybatis.mapper-locations=classpath:mybatis/mappers/**/*.xml

4. mybatis 인터셉터

  • 별도 Config 생성필요
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
       @Bean
       public MybatisSqlSupport MybatisSqlSupport() { // 해당 bean클래스 생성필요
           return new MybatisSqlSupport();
       }
      
       @Bean
       public ConfigurationCustomizer mybatisCustomizer(MybatisSqlSupport interceptor) {
           return configuration -> configuration.addInterceptor(interceptor);
       }
    
This post is licensed under CC BY 4.0 by the author.