본문 바로가기
Java Web/Spring Boot

[Spring Boot] MyBatis 설정 및 DAO 구현

by 스응 2023. 4. 18.
728x90
728x90

MyBatis

  - Java 객체와 SQL문 사이의 자동 매핑을 지원하는 매퍼 프레임워크

  - SQL 쿼리를 작성할 때 xml 또는 어노테이션 이용 가능

      → 쿼리 구문을 작성해서 데이터베이스와 통신 수행

  - 매우 유연한 구조

      · SQL 쿼리와 Java 객체의 매핑 규칙을 세부적으로 지정할 수 있음

      · 동적 SQL 쿼리 구문을 작성할 수 있음

 

 


MyBatis 설정

1) 의존성 추가 (build.gradle)

1
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.0'
cs

 

2) 설정 (application.yml)

1
2
3
4
5
mybatis:
  mapper-locations:         # **.xml : 해당 경로 아래 모든 xml 파일
  - classpath:mapper/**.xml # classpath는 src/main/resources/ 아래부터 시작
  configuration:
    map-underscore-to-camel-casetrue # DB의 underscore(snake case) 방식을 Java의 camel case 방식과 매핑
cs

 

 

반응형
728x90

DAO 구현

1. 표준을 위한 인터페이스 정의

  - src/main/java/com.example.demo.repository.interfaces. ~

 

▶ 예시

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Mapper // MyBatis가 인식할 수 있게 됨
public interface UserRepository {
    
    public int insert(User user);
    
    public int updateById(User user);  
    
    public int deleteById(Integer id); // principal (접근 주체)로도 사용함
    
    // 전체 조회
    public List<User> findAll();
    
    // 특정 고객 조회
    public User findById(Integer id);
    
}
cs

 

▶ 주의사항

  - 매개변수 개수가 2개 이상이면 반드시 @Param("파라미터명")을 명시해주어야 함 !

 

1
2
    // 매개변수 개수가 2개 이상이면 반드시 파라미터 이름 명시
    public List<HistoryDto> findByIdHistoryType(@Param("type"String type, @Param("id") Integer id);
cs

 

2. xml 파일에 쿼리 구문 작성

  - yml 파일에 기술한 경로에 xml 파일을 생성해야 함

      : src/main/resources/mapper/**.xml

  - Connection, PreparedStatement, ResultSet을 알아서 관리해줌

 

▶ 기본 틀

  - 복사해서 붙여넣고, <mapper> 태그 안에 코드 작성

  - 매개변수 값을 #{매개변수명}으로 가져올 수 있음

  - DTO 객체를 반환할 경우, resultType 속성으로 해당 클래스의 경로를 지정해주어야 함

 

1
2
3
4
5
6
7
<?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> 
 
</mapper>
cs

 

▶ 예시

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?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">
                 
                   <!-- DAO 인터페이스 경로를 정확히 입력 -->
<mapper namespace="com.tenco.bank.repository.interfaces.UserRepository"> 
 
    <insert id="insert"> <!-- id명은 대응되는 DAO interface의 메서드명과 동일하게 -->
        INSERT INTO user_tb (username, password, fullname, created_at)
        VALUES ( #{username}, #{password}, #{fullname}, now() )  <!-- SQL의 함수를 사용할 수 있음 -->
    </insert>
    
    <!-- parameterType 속성은 필수 속성이 아니며, 가독성을 위해 지정하는 것 -->
    <update id="updateById" parameterType="com.tenco.bank.repository.model.User">
        UPDATE user_tb SET username = #{username}, password = #{password}, fullname = #{fullname}
        WHERE id = #{id}
    </update>
    
    <delete id="deleteById">
        DELETE FROM user_tb WHERE id = #{id}
    </delete>
    
    <!-- SELECT는 객체 타입으로 리턴할 것이므로, 모델 클래스를 지정해주어야 함 -->
    <select id="findById" resultType="com.tenco.bank.repository.model.User"> 
        SELECT * FROM user_tb WHERE id = #{id}
    </select>
    
    <!-- List 내 자료형도 단일 객체처럼 resultType 속성  -->
    <select id="findAll" resultType="com.tenco.bank.repository.model.User"> 
        SELECT * FROM user_tb
    </select>
    
</mapper>
cs

 

 

320x100
반응형

댓글