본문 바로가기
Spring/Spring

day76) MyBatis로 DAO변경하기

by code_learner 2022. 4. 19.

[Mybatis 프레임워크]

1) Java코드의 개입을 축소시키기 위해 사용한다.
2) SQL명령어를 Java코드에서 분리시킨다.
  -> 분리된 SQL명령어는 XML파일에서 관리한다

  -> 결합도가 낮아지고, 응집도가 높아졌다.

3) "실행 결과를 VO 자바 객체로 매핑"하는 설정이 필요하다.

  ==설정이 있다면 자동으로 매핑
  ==매핑이 안되면 설정부분에서 에러가 날 확률이 높다.

  -mapping.xml의

resultType과 sql-map-config alias를 일치 시킨다(매핑) 

오늘 변경할 파일 위치

 


[mybatis설치]

marketplace-> mybatis-> 참새 두개다 설치 -> pom.xml 에 설정추가

 

[pom.xml]

<!-- Mybatis기본 설정 -->
      <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
            <version>3.3.1</version>
      </dependency>
      <dependency>
          <groupId>org.apache.ibatis</groupId>
          <artifactId>ibatis-core</artifactId>
            <version>3.0</version>
      </dependency>

 

<!- -Spring연동을 위한 설정 -->
      <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
            <version>3.3.1</version>
      </dependency>
      <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis-spring</artifactId>
            <version>1.2.4</version>
      </dependency>

 

실습에서는 Spring에서 사용하기 때문에 밑의 설정을 사용한다.


 

-board테이블을 사용하여 설정해보자

MyBatis XML Mapper -> board-mapping.xml

MyBatis Generator Configuration File -> sql-map-config.xml

 

 

[board-mapping.xml]

- <mapper namespace="BoardDAO"></mapper> -> BoardDAO와 mapping하기 위한 설정

- <select id="getBoard">
      SQL명령어
   </select>

<?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">

<!-- BoardDAO와 mapping됨 -->
<mapper namespace="BoardDAO">
	
	<!--1. resultMap-->
	<resultMap type="board" id="boardResult">
		<id property="bid" column="bid" />
		<result property="title" column="title" />
		<result property="writer" column="writer" />
		<result property="content" column="content" />
		<result property="filename" column="filename" />
	</resultMap>
	<select id="getBoard" resultMap="boardResult">
     <!-- 2.CDATA Section -->
     <![CDATA[
     	 <!-- 기존의 ?는 #{bid}로 바꿈 -->
         SELECT * FROM BOARD WHERE BID=#{bid}
      ]]>
	</select>
	
    <!-- 3. resultType -->
   <select id="getBoardList" resultType="board">
      SELECT * 
      FROM BOARD 
      WHERE 1=1
      <!-- 4.if -->
      <if test="searchCondition == 'title'">
         AND TITLE LIKE '%'||#{searchKeyword}||'%'
      </if>
      <if test="searchCondition == 'writer'">
         AND WRITER LIKE '%'||#{searchKeyword}||'%'
      </if>
      <if test="searchCondition == 'content'">
         AND CONTENT LIKE '%'||#{searchKeyword}||'%'
      </if>
      ORDER BY BID DESC
   </select> 


	<insert id="insertBoard">
		INSERT INTO BOARD VALUES((SELECT NVL(MAX(BID),0)+1
		FROM
		BOARD),#{title},#{writer},#{content},#{filename})
	</insert>

	<update id="updateBoard">
		UPDATE BOARD SET TITLE=#{title},CONTENT=#{content}
		WHERE BID=#{bid}
	</update>

	<delete id="deleteBoard">
		DELETE BOARD WHERE BID=#{bid}
	</delete>

</mapper>

3.  resultType: sql-map-config.xml설정파일에서 BoardVO를 alias값과 매핑

1.  resultMap: resultType으로 받을수 없는 값들을 설정한다.

2.  CDATA Section
SQL구문내부에 '<' or '>' 을 쓸 수 없다. XML 파서가 <류를 태그로 인식하여 처리하기 때문이다.

따라서 '<![CDATA[ select * from board where bid=#{bid} ]]>'형태로 사용

4.  조건에 따른 분기처리

조건에 따라 WHERE조건을 하려하는데 WHERE뒤에 비워둘 수 없다. 항상 true인 값을 사용 ex)1=1

-> Dynamic SQL

   <if test="searchCondition == 'title'">
         AND TITLE LIKE '%'||#{searchKeyword}||'%'
   </if>

 


[sql-map-config.xml]

-Mybatis 프레임 워크를 위한 설정파일

 

이번 Spring프로젝트 때 사용할 설정

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
</configuration>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

	<!-- 별칭,별명,Alias 설정 -->
	<typeAliases>
		<typeAlias type="com.test.app.board.BoardVO" alias="board" />
		<!-- sql-map-config의 alias를 board-mapping.xml의 resultType과  일치 시킨다 -->
	</typeAliases>
	
	<!-- Sql Mapper 연결 -->
	<!-- mapping파일을 보기 위한 설정 -->
	<mappers>
		<mapper resource="mappings/board-mapping.xml"/>
	</mappers>
    
</configuration>

 


 

[applicationContext.xml]

-Mybatis 프레임워크: SqlSession 객체를 활용한다.
"팩토리 패턴" >> 팩토리 == 객체생성하여 반환하는 주체
-> 객체생성해서 반환하는 로직을 "캡슐화"
:SqlSessionFactory가 sqlSession 객체를 생성하여 반환한다

☆ 싱글톤 패턴
메모리에 동일한 객체를 하나만 생성하여 재사용
☆ 팩토리 패턴(my batis)
객체를 반환하는 로직이 캡슐화된, 그래서 해당객체를 별도 설정없이 바로 반환가능

 

	<!-- DataSource 설정 -->
	<bean id="dataSource"
		class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName"
			value="oracle.jdbc.driver.OracleDriver" />
		<property name="url"
			value="jdbc:oracle:thin:@localhost:1521:xe" />
		<property name="username" value="kim" />
		<property name="password" value="1234" />
	</bean>

	<!-- Mybatis 설정 -->
	<bean id="sqlSession"
		class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="configLocation"
			value="classpath:sql-map-config.xml" />
	</bean>
	<bean class="org.mybatis.spring.SqlSessionTemplate">
		<!-- autowired가 타입만 보므로 id필요없음 -->
        <!--생성자 INJECTION-->
		<constructor-arg ref="sqlSession" />
	</bean>

SqlSessionFactoryBean의 역할

더보기
package com.test.app.common;

import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class SqlSessionFactoryBean {
   private static SqlSessionFactory sessionFactory=null;
   //필요없다우
   static {
      try {
         if(sessionFactory==null) {
            Reader reader=Resources.getResourceAsReader("sql-map-config.xml");
            //입력스트림을 통해 설정을 전달받는다. 
            sessionFactory=new SqlSessionFactoryBuilder().build(reader);
         }
      } catch(Exception e) {
         e.printStackTrace();
      }
   }
   public static SqlSession getSqlSessionInstance() {
	      return sessionFactory.openSession();
	   }

}

[BoardDAO3]

package com.test.app.board.impl;

import java.util.List;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;

import com.test.app.board.BoardVO;

public class BoardDAO3 {
	
	@Autowired
	private SqlSessionTemplate mybatis;
	
	public void insertBoard(BoardVO vo) {
		System.out.println("insertBoard() 호출됨");
		mybatis.insert("BoardDAO.insertBoard",vo);
	}
	public BoardVO getBoard(BoardVO vo) {
		System.out.println("getBoard() 호출됨");
		return (BoardVO)mybatis.selectOne("BoardDAO.getBoard",vo);
	}
	public List<BoardVO> getBoardList(BoardVO vo) {
		System.out.println("getBoardList() 호출됨");
		return mybatis.selectList("BoardDAO.getBoardList", vo);
	}
	public void updateBoard(BoardVO vo) {
		mybatis.update("BoardDAO.updateBoard",vo);
	}
	public void deleteBoard(BoardVO vo) {
		mybatis.delete("BoardDAO.deleteBoard",vo);
	}

}

'Spring > Spring' 카테고리의 다른 글

Spring) 알림기능 개선(1) - HTTP, SSE, WebSocket  (0) 2022.12.05
day79) JPA로 DAO4변경하기  (0) 2022.04.22
day73) 다국어 처리(국제화)  (0) 2022.04.13
day72) 파일 업로드  (0) 2022.04.12
day72) 에러페이지 처리  (0) 2022.04.12

댓글