Spring MyBatis

Let's Just Go·2022년 7월 10일
0

Spring

목록 보기
8/26

Spring

MyBatis

MyBatis 개념

  • Mybatis 개념
    • Query Based Web Application을 개발할 때 가장 많이 사용하는 SQL Mapper FrameWork

    • Mybatis는 SQL을 XML 파일에 작성하기 때문에 SQL 변환이 자유롭고 가독성이 좋음

    • DAO 계층을 대신, 기존 DAO의 interface의 구현 클래스를 xml 파일이 대신하며 클래스를 만들지 않음

    • 작성한 XML파일에 SQL문을 작성하며 #{ }을 통해 값을 넣어줌

    • Spring에서 사용하기 위해서는 MyBatis-Spring module 설치


MyBatis vs JDBC

  • JDBC vs MyBatis

    JDBCMyBatis
    직접 Connection 생성자동 Connection 생성
    직접 Close() 처리자동 Close() 처리
    직접 PreparedStatement 생성자동 PreparedStatement 처리
    Pstmt의 setxxx() 직접 작성 및 처리#{ }을 통한 ? 처리
    SELECT의 경우 ResultSet처리리턴 타입으로 자동 ResultSet 처리

SQLSessionFactory

  • SQLSessionFactory
    • xml에 적은 내용을 클래스로 변환하여 Container에 자동으로 bean 등록해줌
    • pom.xml에 MyBatis 관련 라이브러리 추가
    • Mybatis의 핵심 객체이며 Spring Container에 생성
    • MyBatis를 사용하기 위해 root-context.xml에 설정 추가

Flow

  • 흐름 (정말 중요)
    • Controller에서 요청을 받음
    • 요청 처리 하기 위해 service와 dao를 통해서 db 연결
    • Mybatis를 사용하기 위해 dao대신 Mapper를 사용하여 의존성 자동 주입
      • sqlSessionFactoryBean 객체를 통해서 xml 파일에 작성된 내용을 클래스로 변환
      • bean으로 등록할 수 있도록 Interface 타입의 Mapper를 찾아서 @Autowired로 주입
    • Interface Mapper와 Mapper를 통해 sql 작업 진행
    • 진행한 결과를 의존성 주입된 객체에 전달해서 요청 처리

Mapper 속성

  • MyBatis Mapper 속성
    • Mapper Tag
      • Namespace : Interface Mapper의 전체 경로 작성해야 Mapper가 인식할 수 있음
    • Select Tag
      • Id : 연결된 Interface의 메서드를 찾기 위한 구분자 (메서드 명이 동일해야 연산 진행 가능)
      • parameterType : 구문에 전달될 파라미터 타입 (패키지 경로 + 전체 클래스 명)
      • resultType : 결과 반환 타입 (패키지 경로 + 전체 클래스 명)
      • resultMap : 외부 Map 타입을 이용한 반환 타입
    • Insert, Update, Delete Tag
      • Id : 연결된 interface의 메서드를 찾기 위한 구분자
      • parameterType : 구문에 전달될 파라미터 타입 (패키지경로 + 전체 클래스 명)
    • 구분 값 전달
      • 값을 전달할 때 #{ } 을 통해서 값을 줄 수 있음
    • <느낌표[CDATA[Code]]>
      • 부등호 같은 문자는 xml에서 태그를 여는 것으로 인식할 수 있음으로 부등호가 아니라는 것을 지칭하기 위해 사용

Create table

  • Create Table
    • table 및 sequence

      CREATE TABLE jdbc_board(
          board_no NUMBER PRIMARY KEY,
          writer VARCHAR2(30) NOT NULL,
          title VARCHAR2(100) NOT NULL,
          content VARCHAR2(1000)
      );
      
      CREATE SEQUENCE bid_seq
      START WITH 1
      INCREMENT BY 1
      MAXVALUE 1000
      NOCYCLE
      NOCACHE;

IScoreMapper

  • IScoreMapper
    • MyBatis를 사용하기 위해 DAO 대신 Mapper를 사용

      package com.spring.db.repository;
      
      import java.util.List;
      
      import com.spring.db.model.ScoreVO;
      
      public interface IScoreMapper {
      
      	// 점수 등록 
      	void insertScore(ScoreVO score);
      	
      	// 점수 전체 조회 
      	List<ScoreVO> listScore();
      	
      	// 점수 삭제 
      	void deleteScore(int num);
      	
      	// 점수 개별 조회 
      	ScoreVO selectScore(int num);
      	
      	// IScoreService의 내용과 같도록 작성 
      	// 왜냐면 Service가 DAO를 호출하기 때문에 Service가 DB와 연동작업을 진행하기 위해 
      	// 작성한 메서드는 DAO와 같게 작성해야함 왜냐면 DAO가 DB와 접근하기 때문
      }

ScoreMapper

  • ScoreMapper.xml

    • xml파일에 sql 작성

      <?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">
      <!-- Mybatis용 맵퍼라는 것을 말함 -->
      
      <mapper namespace="com.spring.db.repository.IScoreMapper">
      
      	<!-- DB컬럼명과 VO클래스의 필드(멤버변수)명을 맞추는 ResultMap선언 컬럼명과 VO의 변수명이 서로 일치하지 않는다면 
      		SQL을 잘 작성해도 MyBatis에서 값을 가져오지 못함 -->
      	<resultMap type="com.spring.db.model.ScoreVO" id="ScoreMap">
      		<!-- 값을 리턴하기 위해서 db컬럼명과 VO객체의 변수명을 맞춰주는 것 -->
      		<id property="stuId" column="stu_id" />
      		<!-- property는 set을 제외한 setter 메서드의 이름 column은 db의 컬럼명을 지정 -->
      		<result property="stuName" column="stu_name" />
      		<!-- id태그는 primary key 변수를 맞춰줄 때 사용하고 나머지는 모두 result 태그를 사용 -->
      	</resultMap>
      
      	<!-- ScoreMapper는 namespace에 있는 것을 구현하는 것이라는 뜻 -->
      	<!-- namespace에 적힌 것을 구현하는 xml이라는 뜻 -->
      	<!-- 이제 여기에 sql 코드 작성 -->
      
      	<!-- 점수 등록 기능 -->
      	<insert id="insertScore">
      		<!-- IScoreMapper에 있는 메서드의 이름을 id에 적어줌 -->
      		<!-- insertScore는 ScoreVO 객체를 매개변수로 받는데 mybatis는 getter 안쓰고 ScoreVO 변수명만 
      			정확하게 작성하면 sql 실행가능 -->
      		INSERT INTO scores
      		VALUES(id_seq.NEXTVAL, #{stuName}, #{kor}, #{eng},
      		#{math}, #{total}, #{average})
      		<!-- ScoreVO가 넘어오는 것은 알고 있고 값을 넣을 때 변수이름만 정확하게 작성하면 됨 -->
      	</insert>
      
      	<!-- 조회를 하는 것이라 select 태그 작성 -->
      	<!-- <select id="listScore" resultType="com.spring.db.model.ScoreVO"> -->
      	<!-- IScoreMapper에 있는 메서드 이름을 id에 적어줌 -->
      	<!-- return이 존재하면 resultType에 return 객체가 있는 디렉토리를 지정 즉 select결과가 어떤 타입으로 
      		포장이 될 건지를 resultType에 넣어줌 -->
      	<!-- resultType에 객체가 있는 디렉토리가 있는 곳의 경로를 작성하면 db의 컬럼명과 객체 변수명이 다르면 불러오지 않음 -->
      
      	<!-- 점수 조회 기능 -->
      	<select id="listScore" resultMap="ScoreMap">
      		<!-- db의 컬럼명과 객체의 변수명이 다를 때 resultMap태그를 활용하여 미리 지정한 것을 알려줌 -->
      		SELECT * FROM scores
      		
      		ORDER BY stu_id ASC
      	</select>
      
      	<!-- 점수 삭제 기능 -->
      	<delete id="deleteScore">
      		DELETE FROM scores
      		WHERE stu_id = #{num}
      		<!-- interface의 deleteScore의 매개변수를 넣어주면 됨 -->
      	</delete>
      
      	<!-- 점수 개별 조회 기능 -->
      	<select id="selectScore" resultMap="ScoreMap">
      		<!-- return이 있으므로 resultMap property 사용 -->
      		SELECT * FROM scores
      		WHERE stu_id = #{num}
      	</select>
      
      </mapper>
profile
안녕하세요! 공부한 내용을 기록하는 공간입니다.

0개의 댓글