2013년 10월 27일 일요일

MyBatis란

MyBatis는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크
즉 기존에 직접 jdbc connection, sql statement, parameter, result record set등을 개발자가 직접 코딩을 하던 것을 Mybatis 프레임워크가 대신 해줌

원래는 ibatis라고 불리웠는데 버전업하면서 이름을 바꾸었나보네요.. http://ibatis.apache.org/ 에 가보면 내용을 확인 할 수 있네요.


NEW NAME AND HOME
Both the Java and .NET project teams have forked the software to Google Code, where they’ll continue to maintain it and create new releases.

Ibatis와 크게 구조적으로 바뀌지 않은 듯합니다자 그럼 Mybatis를 설정하고 사용해 보도록 하겠습니다.

우선 Mybatis jar파일을 다운 받도록 해야겠죠해당 파일은 http://www.mybatis.org/사이트에서 다운로드 받을 수 있습니다.

mybatis-3.0.6-bundle.zip  다운 받으면   같습니다친절하게 한글 매뉴얼도 있으니 세부적인 내용을 해당 매뉴얼을 참조하시면 될듯합니다MyBatis-3-User-Guide_ko.pdf

압축을 풀면 다음과 같은 파일이 있습니다이중 mybatis-3.0.6.jar파일을 project의 libaray에 복사하여 놓으면 우선 기본적인 준비는 다 된것이겠죠 ? ^^;



복사하실 대는 Navigator view에서 복사해 놓으시면 됩니다.

 

우선 ibatis와 비슷하게 SqlMapper로 Mybatis에서는 SqlSessionFactory 인스턴트를 사용한다고 합니다. SqlSessionFactory 인스턴트를 생성하기 위해서는 SqlSessionFactoryBuilder를 통해 생성할 수 있다고 합니다. ;;;
쉽게 말해서 SqlSessionFactoryBuilder를 통해 jdbc설정등을 한 SqlMapper인 SqlSessionFactory인스턴트를 얻어오는 작업이라고 보면 됩니다.

해당 코드는 다음과 같습니다나중에 전체적인 소스를 보면 쉽게 이해할 수 있을 것입니다우선 고고싱~~

String resource = "org/power/mabatis/Configuration.xml";
Reader reader = Resources.getResourceAsReader(resource);
sqlMapper = new SqlSessionFactoryBuilder().build(reader);

위에서 Configuration.xml파일에는 jdbc설정정보가 들어 있습니다내용을 보면 아래와 같습니다.
<?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>
    <properties resource="org/power/mybatis/db.properties" />
   
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${driver}" />
                <property name="url" value="${url}" />
                <property name="username" value="${username}" />
                <property name="password" value="${password}" />
            </dataSource>
        </environment>
    </environments>
   
    <mappers>
        <mapper resource="org/power/mapper/bbsMapper.xml" />
    </mappers>

</configuration>

db.properties파일에는 jdbc설정 정보가 들어 있습니다내용을 보면 아래와 같습니다.
driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl
username=scott
password=tiger

properties파일을 굳이 분리하지 않고 해당 string에 직접 입력해도 동일한 결과가 나오겠죠;;^^

위의 Configuration.xml 을 읽어 SqlSessionFactoryBuilder를 통해 SqlMapper인 SqlSessionFactory 인스턴트를 생성한다는 말이네요.. 자 그럼 sqlMapper는 준비가 되었습니다이제 이것을 사용해 볼까요?


String resource = "org/power/mybatis/Configuration.xml";
Reader reader = Resources.getResourceAsReader(resource);
sqlMapper = new SqlSessionFactoryBuilder().build(reader);

SqlSession session = sqlMapper.openSession();
try {
bbsvo = (BbsVO) session.selectOne("selectBbs", 5000);
 System.out.println(bbsvo.toString());
} finally {
 session.close();
}

사용 방법도 간단합니다SqlSessionFactory에서 SqlSesson을 얻어 온 후에 sql mapping xml을 통해 자료를 읽어오면 됩니다이건 뭔말인지 ㅎㅎ자 그럼 자세히 보도록 하겠습니다.

bbsvo = (BbsVO) session.selectOne("selectBbs", 5000);

이 문장인데요위 문장은 BbsVO라는 vo object를 반환합니다. selectOne메소드는 하나의 인스턴트를 반환합니다. selectOne("selectBbs", 5000)에서 selectBbs는 xml에 있는 sql mapping id입니다. 5000은 인자값입니다.

이것으로 이해가 좀;; 그렇죠 ^^. 자 그럼 sqlmapping xml파일(bbsMapper.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">

<mapper namespace="bbs">

  <!-- select 쿼리문 정의 -->
  <select id="selectBbs" parameterType="int" resultType="org.power.vo.BbsVO">
    SELECT * FROM TBL_BBS
    WHERE bbsno = #{bbsno}
  </select>

</mapper>


Configuration.xml 파일 보시면 다음의 매핑 정보가 있죠?
<mappers>
        <mapper resource="org/power/mapper/bbsMapper.xml" />
</mappers>

selectOne메소드는 id="selectBbs" 찾아 해당 sql문을 수행하고 결과를 리턴합니다 아래의 xml안의 select문을 찾겠죠여기에는 파라메터 타입이 int 받으며 결과는 BbsVO라는 vo Object 결과를 반환하겠다는 설정이 있습니다.

파라메터는 int 받는다고 했고 SQL문에는 인자값으로 #{bbsno} 받는다고 설정되어 있습니다 selectOne("selectBbs", 5000)에서 5000값이 bbsno에 설정되겠죠?

<select id="selectBbs" parameterType="int" resultType="org.power.vo.BbsVO">
    SELECT * FROM TBL_BBS
    WHERE bbsno = #{bbsno}
  </select>

자 그럼 대충 mybatis가 작동하는 원리가 이해가 되시나요 ^^;


정리하면 위의 그림에서 SqlMapConfig.xml이 우리가 살펴본 Configuration.xml이고 SqlMap.xml이 bbsMapper.xml  되겠죠환경설정  SQL Mapping xml 통해 Mybatis 프레임워크는 자동으로 SQL input파라메터와 result 자동으로 object 매핑하여 줍니다 Mabatis 사용하므로써 다음의 소스코드들을 개발자가 직접작성하는 불필요한 작업이 없어지게 됩니다.

public void insert(final BbsVO vo) throws Exception {
            
       final StringBuffer sql = new StringBuffer();
      
       sql.append("INSERT INTO TBL_BBS ");
       sql.append(" (bbsno, title, content, writer, hits) ");
       sql.append(" VALUES (?, ?, ?, ?, ?)");
      
       new AbstractDAO() {
            
             @Override
             public void query() throws Exception {
             pstmt = con.prepareStatement(sql.toString());
             pstmt.setInt(1, vo.getBbsno());
             pstmt.setString(2, vo.getTitle());
                pstmt.setString(3, vo.getContent());
                pstmt.setString(4, vo.getWriter());
                pstmt.setInt(5, vo.getHits());
                pstmt.executeQuery();
                    }
       }.execute();
}

Java 1.5버전부터 annotation이 나왔나요위 그림을 보면 Mabatis Mapper Annotation을 지원하고 있는 것을 볼 수 있습니다이를 사용하면 개발이 더 단순하게 될 것입니다.

JUNIT으로 테스트하는 소스코드와 결과를 한번 보고 글을 마치겠습니다.


package org.power.test;

import java.io.IOException;
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;
import org.power.vo.BbsVO;

import junit.framework.TestCase;

public class BbsMybatisTest extends TestCase {

             String resource;
             Reader reader;
             BbsVO bbsvo;
              
             protected void setUp() throws Exception {
                 super.setUp();
                 resource = "org/power/mybatis/Configuration.xml";
             }
            
             public void testBbsMybatis() {
                          
             try {
            reader = Resources.getResourceAsReader(resource);
            SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(reader);
            SqlSession session = sqlMapper.openSession();
            try {
                    
                bbsvo = (BbsVO) session.selectOne("selectBbs", 5000);
                System.out.println(bbsvo.toString());
             
            } finally {
                session.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
}

자세한 설명은 http://www.mybatis.org/사이트에 한글 매뉴얼이 잘 되어 있으니 참고 하시면 될 것 같습니다.



댓글 없음:

댓글 쓰기