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 interface | SQL과 매핑되는 인터페이스 | 인터페이스로 생성함. |
| 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.