Back-end/Spring Boot

[Spring Boot] MyBatis

Bay Im 2024. 4. 13. 12:44

MyBatis

  • MyBatis 사용전 설정
    1. build.gradle dependencies 추가
      • implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3'
        testImplementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:3.0.3'
        implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16'
    2. application.properties 수정
      • 추가
        • # mybatis
          mybatis.mapper-locations=classpath:mybatis/mapper/**/**.xml
          mybatis.configuration.cache-enabled=false
          mybatis.configuration.mapUnderscoreToCamelCase=true
          # SQL 매개변수의 NULL을 허용
          mybatis.configuration.jdbc-type-for-null=NUL
      • 변경
        • #spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
          #spring.datasource.hikari.jdbc-url=jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8&serverTimezone=Asia/Seoul
          
          // 아래 코드로 변경  
          spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
          spring.datasource.hikari.jdbc-url=jdbc:log4jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8&serverTimezone=Asia/Seoul
    3. resources 폴더 안의 log4jdbc.log4j2.properties 생성
      • log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
        log4jdbc.dump.sql.maxlinelength=0
        
        log4jdbc.drivers=com.mysql.cj.jdbc.Driver
        log4jdbc.auto.load.popular.drivers=false
    4. resources 폴더 안의 logback.xml 생성
      • <configuration>
            <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
                <encoder>
                    <pattern>%d{yyyyMMdd HH:mm:ss.SSS} [%thread] %-3level %logger{5} - %msg %n</pattern>
                </encoder>
            </appender>
        
            <logger name="jdbc" level="OFF"/>
        
            <logger name="jdbc.sqlonly" level="OFF"/>
            <logger name="jdbc.sqltiming" level="DEBUG"/>
            <logger name="jdbc.audit" level="OFF"/>
            <logger name="jdbc.resultset" level="OFF"/>
            <logger name="jdbc.resultsettable" level="DEBUG"/>
            <logger name="jdbc.connection" level="OFF"/>
        
            <root level="INFO">
                <appender-ref ref="STDOUT" />
            </root>
        
        </configuration>
    5. resources 폴더 안의 mybatis/mapper 폴더 생성 후 mapper 폴더 안에 xml 파일 생성
      • <mapper namespace=”파일경로”></mapper> 태그를 작성해주고, 파일 경로는 해당 xml파일과 매핑되는 DAO 인터페이스의 경로를 넣어준다.
        • 예시
          • <mapper namespace="com.study.ex15readdbcrud.dao.IMemberDao">
      • mapper 태그에 SQL 문 작성할 때 끝에 세미콜론(;)을 넣지 말아야 한다.
      • 예시 (MemberDao.xml)
        • <?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">
          <!-- SQL 끝에 세미콜론(;)을 넣지 마세요! -->
          <mapper namespace="파일경로">
          
          </mapper>
    6. namespace의 파일 경로에 DAO 인터페이스 파일 생성
      • 해당 인터페이스에 @Mapper 어노테이션 주입
      • 예시 (IMemberDao.java)
        • package com.study.ex15readdbcrud.dao;
          
          @Mapper
          public interface IMemberDao {
          }
    7. Controller 클래스에 인터페이스 DAO 생성자 주입
      • final DAO인터페이스명 DAO인터페이스명;
      • 예시
        • @Controller
          @RequiredArgsConstructor
          public class MainController {
              // 생성자 주입
              final IMemberDao memberDao;
  • MyBatis 관련 어노테이션
    • @Mapper
      • 인터페이스 DAO와 MyBatis XML과 연결하는 역할
  • DAO 인터페이스와 DAO.xml 매핑하여 작성
    • DAO 인터페이스
      • 인터페이스 함수만 만들고 구현은 xml에서 SQL 문을 작성하여 구현한다.
      • 예시
        • @Mapper
          public interface IMemberDao {
              // list (SELECT *)
              public List<MemberDTO> list();
          
              // SELECT COUNT(*)
              public int count();
          
              // INSERT
              public int insert(MemberDTO dto);
          
              // SELECT WHERE id=
              public List<MemberDTO> findById(int id);
          
              // UPDATE
              public int update(MemberDTO dto);
          
              // DELETE
              public int delete(int id);
          }
    • DAO.xml (resources/mybatis/mapper)
      • select, insert, update, delete 태그 작성
        1. 태그 안의 id 값 작성
          • DAO 인터페이스에서 만든 함수 이름 작성
        2. 태그 안의 resultType 값 작성
          • return 값이 List<DTO클래스> 같은 형태 혹은 insert, update 태그는 해당 DTO 클래스 위치와 클래스명까지 작성
            • 예시) resultType="com.study.ex15readdbcrud.dto.MemberDTO"
          • COUNT(*) 같이 return 값이 int면 resultType=”_int” 작성
          • delete 태그는 resultType을 적지 않는다.
        3. SQL 문 작성
          • SQL 문 끝에 세미콜론(;)을 붙이지 않는다.
          • 컬럼명은 #{컬럼명} 의 형태로 작성한다.
          • WHERE 절의 입력값은 #{param1}, #{param2}, … 로 작성
            • 예시
              • SELECT * FROM member WHERE id=#{param1}
              • DELETE FROM member WHERE id=#{param1}
          • INSERT 의 VALUES 혹은 UPDATE의 SET 값은 #{컬럼명} 형태로 작성
            • 예시
              • INSERT INTO member values (0, #{userId}, #{userPw}, #{userName}, #{userRole}, #{joinDate})
              • UPDATE member SET user_id=#{userId}, user_pw=#{userPw}, user_name=#{userName}, user_role=#{userRole}, join_date=#{joinDate} WHERE id=#{id}
      • 예시
        • <?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">
          <!-- SQL 끝에 세미콜론(;)을 넣지 마세요! -->
          <!-- id는 함수이름 -->
          <mapper namespace="com.study.ex15readdbcrud.dao.IMemberDao">
              <select id="list" resultType="com.study.ex15readdbcrud.dto.MemberDTO">
                  SELECT * FROM member ORDER BY join_date DESC
              </select>
              <select id="count" resultType="_int">
                  SELECT COUNT(*) FROM member
              </select>
              <select id="findById" resultType="com.study.ex15readdbcrud.dto.MemberDTO">
                  SELECT * FROM member WHERE id=#{param1}
              </select>
          
              <insert id="insert" parameterType="com.study.ex15readdbcrud.dto.MemberDTO">
                  INSERT INTO member values (0, #{userId}, #{userPw}, #{userName}, #{userRole}, #{joinDate})
              </insert>
              
              <update id="update" parameterType="com.study.ex15readdbcrud.dto.MemberDTO">
                  UPDATE member SET user_id=#{userId}, user_pw=#{userPw}, user_name=#{userName}, user_role=#{userRole}, join_date=#{joinDate} WHERE id=#{id}
              </update>
              
              <delete id="delete">
                  DELETE FROM member WHERE id=#{param1}
              </delete>
          </mapper>
 
728x90