본문 바로가기

Spring

[Spring] Mybatis 프레임워크 설치, DB연동

반응형

Mybatis란? 

Mybatis는 자바 오브젝트와 SQL사이의 자동 매핑 기능을 지원하는 ORM(Object relational Mapping)프레임워크이다.

 

※ 사용이유
 1) DB연동을 담당하는 JAVA 코드를 1~2줄로 줄일수있음 [가독성]
 2) SQL 문은 JAVA 코드에서 분리하여 XML 파일로 별도 관리 가능 [응집도 ↑]

 

※ 동작방법
 1) XML 파일에 저장된 SQL 문을 실행
 2) 실행의 결과를 VO(JAVA객체)에 자동으로 매핑까지 수행함


1. 플러그인 설치 

이클립스 상단의 Help -> Eclipse Marketplace-> mybatis 검색 후 검은새가 보이는 하기 2가지 플러그인을 설치 한다. 

설치할 때는 전부 동의를 누르면 이클립스가 재실행된다.


2.  pom.xml에 라이브러리 파일 설정 

pom.xml 설정에 하기 Mybatis 관련 라이브러리 추가를 해준다. 

	<!--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>

pom.xml에 저장 후 Maven Dependencies에 mybatis, ibatis jar 2개가 추가되었으면 성공!


 

3. DB 연동에 필요한 SQL 문을 XML 파일에 저장

 

src/main/resources 하위에 mappings라는 패키지를 생성 후  

해당 패키지 안에 SQL문들을 저장한 파일을 넣어주는데

파일 이름은 보통 "테이블 명"-mapping.xml 가준으로 만들어 준다. 

 

xml 파일 생성 시 -> new -> mybatis

 

플러그인을 설치하였지만 xml 파일 생성 시 mybatis가 뜨지 않아 상단에 스키마 설정을 해두니 연결이 되었다. 

'namespace'

-> 클래스의 패키지와 유사한 용도로 MyBtis 내에서 원하는 SQL문을 찾아서 실행할 때 동작한다. 

'resultType'

-> select류에 사용, 쿼리문 수행 후 메서드 반환타입이 String이나 객체를 반환할 수 있도록 지정하는 속성으로 

어떤 타입으로 반환할것이라는 반환 유형을 정해준다. 해당 value값은 sql-map-config.xml 과 연관됨 

'resultMap'

-> xml내에서 직접 타입을 지정해줄 수 있다. 

property에는 db에서 뽑은 값을 사용하고 싶을때 사용되는 이름 선언, column에는 실제 db컬럼명을 매핑한다. 

'CDATA'

-> XML파서가 '<', '>' 가 사용되면 태그로 인식해버려서 제대로 출력이 되지 않기때문에 이를 막기 위해서는 CDATA를 사용한다. 

참조 블로그 : https://parkjuwan.tistory.com/156

 

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

	<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"/>
	</resultMap>

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

   <update id="updateBoard">
      UPDATE BOARD SET TITLE=#{title}, WRITER=#{writer} WHERE BID=#{bid}
   </update>
   
   <delete id="deleteBoard">
      <![CDATA[
         DELETE BOARD WHERE BID=#{bid}
      ]]>
   </delete>

	<!--resultType : vo에 맴핑해달라는 내용-->
   <select id="selectOneBoard" resultType="board">
      SELECT * FROM BOARD WHERE BID=#{bid}
   </select>
   
   <select id="selectAllBoard" resultType="boardResult">
      SELECT * FROM BOARD
      WHERE TITLE LIKE '%'||#{searchContent}||'%'
      ORDER BY BID DESC
   </select>

</mapper>

 

4) sql-map-config.xml 작성

 

파일 경로는 src/main/resources 에 MyBatis Generator Configuration File 생성

파일 이름은 sql-map-config.xml 

 

파일을 생성하면 내용이 자동으로 기입되어 있는데 삭제 후 하기 스키마로 변경해준다. 

<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
  
  <configuration>

</configuration>

 

sql-map-config.xml 

<?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>
      <!-- DB연동정보 파일과 연결 -->
   <properties resource="db.properties" />

    <!-- 별칭(Alias) 설정 -->
    <typeAliases>
      <typeAlias type="com.kim.biz.board.BoardVO" alias="board" />
   </typeAliases>



     <!-- DataSource 설정 -->
   <environments default="development">
      <environment id="development">
         <transactionManager type="JDBC" />
         <dataSource type="POOLED">
            <property name="driver" value="${jdbc.driverClassName}" />
            <property name="url" value="${jdbc.url}" />
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
         </dataSource>
      </environment>
   </environments>

    <mappers>
       <mapper resource="mappings/board-mapping.xml" />
    </mappers>
</configuration>

 


5) DB연결 

 

Spring 연동없이 사용하기위해서는 직접 DB연동정보를 작성해야한다. 

Springg과 연동할 때는 DB연동정보가 applicationContext에 있기 때문에 별도 작성할 필요 없다. 

 

src/main/resources에  db.properties 파일 생성

jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:xe
jdbc.username=이름
jdbc.password=비밀번호

6. SqlSessionFactory

 

SqlSessionFactory는 데이터베이스와의 연결과 SQL의 실행에 대한 모든 것을 가진 가장 중요한 객체이다.

 

파일 생성 위치 및 파일 이름 

package com.kim.biz.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 SqlSessionBean {
	// Mybatis로 DAO 클래스의 CRUD 메서드를 사용하려면,
	// Mybatis에서 제공하는 SqlSession 객체를 사용해야한다!
	//  -> Factory 패턴
	private static SqlSessionFactory sessionFactory=null;
	static {
		try {
			if(sessionFactory==null) {
				// 이곳의 작업은 스트림을 사용합니다.
				// 외부요인으로 인한 에러가 자주 발생하기때문에 예외처리했습니다.
				
				// builder는 Mybatis 설정파일(sql-map-config.xml)을 로딩하면서
				// SSF 객체를 생성함
				
				// 설정파일 로딩을 위해 입력스트림(Reader)을 사용
				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();
	}
}

7.  DAO 파일 

package com.kim.biz.board.impl;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.kim.biz.board.BoardVO;
import com.kim.biz.common.SqlSessionBean;

public class BoardDAO3 {
   private SqlSession mybatis;
   public BoardDAO3() {
      mybatis=SqlSessionBean.getSqlSessionInstance();
   }
   
   public void insertBoard(BoardVO vo) {
      mybatis.insert("BoardDAO.insertBoard",vo);
      mybatis.commit();
   }
   public void updateBoard(BoardVO vo) {
      mybatis.update("BoardDAO.updateBoard",vo);
      mybatis.commit();
   }
   public void deleteBoard(BoardVO vo) {
      mybatis.delete("BoardDAO.deleteBoard",vo);
      mybatis.commit();
   }
   BoardVO selectOneBoard(BoardVO vo) {
      return mybatis.selectOne("BoardDAO.selectOneBoard",vo);
   }
   public List<BoardVO> selectAllBoard(BoardVO vo) {
      return mybatis.selectList("BoardDAO.selectAllBoard",vo);
   }
}
반응형