MyBatis (odbc프레임웍)

 | JSP
2012. 5. 8. 18:16

마이바티스

http://code.google.com/p/mybatis/downloads/detail?name=mybatis-3.1.1-bundle.zip&can=3&q=%22mybatis-3%22+-migrations

위의 링크로 들어가 jar 파일을 다운받은후 추가 하자.

신세계 마이바티스를 공부해 보자. (아이바 티스를 안보신분은 먼저 그것부터 보길 바란다 ) http://sararing.springnote.com/pages/10976942

MyBatis-3-User-Guide_ko.pdf  <== 마이바 티스 한글 유저 가이드 .

 

먼저 마이바티스란. odbc 프레임웍으로 웹페이지 에서 필요한 디비를 최대한 능동적으로 (빠른 접속시간및 코드의 효율 최상화)를 위해 사용 하게 된다.

먼저 우리가 기본적으로 생성하게 되는  MemberDaoOracleMpl.java 파일을 보자

findByPk 메서드를  중심으로 설명해 보겠다.

기존의_findByPk.jpg

rs 생성후 파라미터 연결 또 보드객체 생성 받고 rs psmt conn 닫고 ./ 여기서 이러한 코드들이 거의 의미 없이 무제한 적으로 사용 하게 되는것에 의문을 가질수 있다.

실제로 쿼리 문장은 매우 규칙적이고 심플 하기 때문에 이러한 의미 없는 코딩을 줄이고 풀링및 접속 환경 까지 제어 해주는것이 마이바티스 이다.

위와 같은 코드식을

변경후의_finByPK.jpg

이렇게 만들었다.  DAO 의 인터페이스인 IMDAO를 implement 했다.  이렇든 간단하게 형식에 맞추어 구현이 가능한 것이 마이바 티스 이다.

 

사용에 먼저 가장 먼저 할일은

res.jpg res 소스 폴더를 만든다 이후에 kr.or.ddit.mybatis 패키지를 생성후 패키지의 루트에  config.xml 파일을 생성 하자.

마이바티스 기본 설정 이다.   jar 파일은 이미 추가 했다는 전제 이다. 

config.jpg

config.xml 의 소스 내용 이다. 중요한 부분으로는 typeAliases  를 볼수 있다 . 위 소스를 보면 MemberBean 및 BoardBean 과 같은 bean 파일을 type 으로 지정 하여

애칭을 주며. 차후에 factory 등에서 쉽게   kr.or.ddit.member.vo.MemberBean  를  member 라고 적어 구현 할수 있다. 

여기서 중간 내용을 적용 하여 dataSource pooled 에서 드라이브및 url username password 등을 적어 구현 한다.

밑단에 보면 mappers 를 확인해 보자. 이하 매핑 이라고 하면 mappers 라고 알고 있자

mapper 의 리소스에는 mapping 에 각기 member.xml board.xml 이 있다 이이곳에서 실질적인 데이터베이스에 필요한 sql 문을 구현 하게 된다.

memberxmlfinbypk.jpg

위 사진은 member.xml 구현부 이다. 여기서 namespace 를 DAO 에 잡으며 반드시 select 문의 id 값은 DAO 에서 구현한 메서드의 이름과 같아야 자동 매칭이 가능하다.

구문 에서 parameterType="String" resultType="member"  메서드 실행시 파라미터 의 종류로 String 과 돌려주는 값이 member 임을 알수 있다.

      여기서 member는 위에서 알리아스(애칭)을 적용 한값을 사용 함을 알수 있다.

받은 값에 대하여 마치 파라미터를 받는것과 마찬 가지로 #{mem_id}  등의 형식으로 적어  member 객체로 받아     MemberDaoMyBatis.java 에서 구현 한다.

DAOmybatis.jpg

위의 사진에서 MemberDaoMyBatis.java  의 구현 사진이다. 실질적으로 MemberServiceIMpl.java 에서는 이 명령을 구현 하게 된다 . session factory 구현에 메퍼를 사용함을

주의 깊게 보자. openSession파라미터  true commit()을 의미 하니 셀렉트 문에는 구지 안넣어도 되나 db 값이 변화 하는 경우 반드시 추가 해야만 한다. 

board구현.png

위의 사진에서 보면 실질적으로 jsp 단에서 파일을 생성 구현 하는 부분은 두 부분이다. 먼저 직접적인 생성및 사용하게 되는 BoardServiceIMple 이 있다.이곳 에서 일차 적으로 jsp 에서 사용 하게 되며

service 에서는 두가지 선택이 가능 하다. BoardDaoOracle 과 BoardDaoMybatis 이다. 기본적인 factory 단을 이용 하여 구현 하는게 훨신 간단하게 소스구현을 할수 있다는것을 알수 있다.

추가로 member의 UML 도 확인하자.

member구현.png

 

 

소스

 

 

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>
    <typeAliases>
        <typeAlias alias="member" type="kr.or.ddit.member.vo.MemberBean"/>
        <typeAlias alias="board" type="kr.or.ddit.board.vo.BoardBean"/>
   
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
                <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:xe"/>
                <property name="username" value="hun"/>
                <property name="password" value="java"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="kr/or/ddit/mapping/member.xml"/>
        <mapper resource="kr/or/ddit/mapping/board.xml"/>
    </mappers>
</configuration>

MyBatisFactory.java

package kr.or.ddit.mybatis;

import java.io.IOException;
import java.io.Reader;

import javax.management.RuntimeErrorException;

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

public class MyBatisFactory {

    private static SqlSessionFactory sqlMapper;
    static{
       
        try {
            String resource = "kr/or/ddit/mybatis/config.xml";
            Reader reader = Resources.getResourceAsReader(resource);
            sqlMapper = new SqlSessionFactoryBuilder().build(reader);
        } catch (IOException e) {
            throw new RuntimeException(e.getMessage(),e);
        }

    }
    public static SqlSessionFactory getSqlMapper() {
        return sqlMapper;
    }
   
}

member.xml (member 의 매핑 파일)|| 실제 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">
<mapper namespace="kr.or.ddit.board.dao.IBoardDao">
    <cache eviction="LRU" flushInterval="600000" size="512" readOnly="true" />

    <select id="findAllByPage" parameterType="map" resultType="board">

        select *
        from (select rownum rn,a.*
        from (select *
        from board
       
        order by bo_no desc
        )a
        where <![CDATA[ rownum <= #{endRow}]]>
        )
        where <![CDATA[rn >= #{startRow}]]>


    </select>
    <select id="findByPk" parameterType="int" resultType="board">
        select * from BOARD where bo_no=#{bo_no}
    </select>
    <select id="getBoardCount" resultType="int" parameterType="map">
        select count(*) from board
    </select>
    <insert id="insertBoard" parameterType="board" >
       
        INSERT INTO board (bo_no,bo_title,bo_writer,bo_passwd,bo_email,bo_ip,
        bo_content,bo_hit,bo_date)
         VALUES(board_seq.nextval,#{bo_title}, #{bo_writer}, #{bo_passwd}, #{bo_email}, #{bo_ip},
        #{bo_content}, 0, sysdate)

    </insert>
    <update id="hitCount" parameterType="board">
        update board set
        BO_HIT =#{bo_hit}
        where BO_NO=#{bo_no}
    </update>
    <update id="updateBoard" parameterType="board">
        update board set  
        BO_TITLE =#{bo_title}, 
        BO_WRITER =#{bo_writer},
        BO_EMAIL =#{bo_email} ,
        BO_IP =#{bo_ip} ,
        BO_CONTENT =#{bo_content}
        where BO_NO=#{bo_no}
</update>

</mapper>

board.xml (mapper 구현부)

<?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="kr.or.ddit.member.dao.IMemberDao">
    <select id="findByPk" parameterType="String" resultType="member">
        select * from member where mem_id= #{mem_id}
    </select>
   

    <select id="findByAll" resultType="member">
        select * from member
    </select>
    <insert id="insertMember" parameterType="member">
        INSERT INTO MEMBER
        (MEM_ID,MEM_PASS, MEM_NAME,MEM_REGNO1,MEM_REGNO2,MEM_BIR,
         MEM_ZIP, MEM_ADD1, MEM_ADD2, MEM_HOMETEL, MEM_COMTEL, MEM_HP,
        MEM_MAIL, MEM_JOB, MEM_LIKE, MEM_MEMORIAL,MEM_MEMORIALDAY,
          MEM_MILEAGE, MEM_DELETE)
         VALUES
        (#{mem_id},#{mem_pass}, #{mem_name},#{mem_regno1},#{mem_regno2},#{mem_bir},
         #{mem_zip}, #{mem_add1}, #{mem_add2}, #{mem_hometel}, #{mem_comtel}, #{mem_hp},
        #{mem_mail}, #{mem_job}, #{mem_like}, #{mem_memorial},#{mem_memorialday},0,'N' )

    </insert>
    <update id="updateMember" parameterType="member">
   
              update MEMBER set  
              MEM_NAME       =#{mem_name},
              MEM_REGNO1      =#{mem_regno1},
              MEM_REGNO2      =#{mem_regno2},
              MEM_BIR         =#{mem_bir},
              MEM_ZIP          =#{mem_zip},
                           
              MEM_ADD1       =#{mem_add1},
              MEM_ADD2       =#{mem_add2},
              MEM_HOMETEL     =#{mem_hometel},
              MEM_COMTEL      =#{mem_comtel},
              MEM_HP         =#{mem_hp},
                           
              MEM_MAIL         =#{mem_mail},
              MEM_JOB        =#{mem_job},
              MEM_LIKE           =#{mem_like},
              MEM_MEMORIAL       =#{mem_memorial},
              MEM_MEMORIALDAY =#{mem_memorialday},
                                   
              MEM_MILEAGE  =#{mem_mileage},
              MEM_DELETE      =#{mem_delete}
              where MEM_ID     =#{mem_id}
             
             
   
    </update>
    <select id="findByJob" resultType="member">
        select * from member
        <where>
        <if test="array !=null">
            <foreach collection="array" item="item" open=" mem_jop in(" close=")" separator=",">
                #{item}
            </foreach>
        </if>
        </where>
    </select>

</mapper>

 

 

BoardDaoMyBatise.java

package kr.or.ddit.board.dao;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import kr.or.ddit.board.vo.BoardBean;
import kr.or.ddit.mybatis.MyBatisFactory;

public class BoardDaoMyBatis implements IBoardDao {

    private SqlSessionFactory factory = MyBatisFactory.getSqlMapper();
   
    @Override
    public int insertBoard(BoardBean board) {
        SqlSession session = factory.openSession(true);
        try {
            IBoardDao boardDao = session.getMapper(IBoardDao.class);
            return boardDao.insertBoard(board);
        } finally{
            session.close();
        }
    }

    @Override
    public int updateBoard(BoardBean board) {
        SqlSession session = factory.openSession(true);
       
        try {
            IBoardDao boardDao = session.getMapper(IBoardDao.class);
            return boardDao.updateBoard(board);
        } finally{
            session.close();
        }
    }

    @Override
    public int deleteBoard(BoardBean board) {
        SqlSession session = factory.openSession();
       
        try {
            IBoardDao boardDao = session.getMapper(IBoardDao.class);
            return boardDao.deleteBoard(board);
        } finally{
            session.close();
        }
    }

    @Override
    public int getBoardCount(Map<String, Object> paramMap) {
        SqlSession session = factory.openSession();
       
        try {
            IBoardDao boardDao = session.getMapper(IBoardDao.class);
            return boardDao.getBoardCount(paramMap);
        } finally{
            session.close();
        }
    }


    @Override
    public List<BoardBean> findAllByPage(Map<String, Object> paramMap) {
        SqlSession session = factory.openSession();
       
        try {
            IBoardDao boardDao = session.getMapper(IBoardDao.class);
            return boardDao.findAllByPage(paramMap);
        } finally{
            session.close();
        }
    }

    @Override
    public BoardBean findByPk(int bo_no) {
        SqlSession session = factory.openSession();
        try {
            IBoardDao boardDao = session.getMapper(IBoardDao.class);
            return boardDao.findByPk(bo_no);
        } finally{
            session.close();
        }
    }

    @Override
    public int hitCount(BoardBean board) {
        SqlSession session = factory.openSession(true);
        try {
            IBoardDao boardDao = session.getMapper(IBoardDao.class);
            return boardDao.hitCount(board);
        } finally{
            session.close();
        }
    }

}

MemberDaoMyBatis.java

package kr.or.ddit.member.dao;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import kr.or.ddit.member.vo.MemberBean;
import kr.or.ddit.mybatis.MyBatisFactory;

public class MemberDaoMyBatis implements IMemberDao {

    private SqlSessionFactory factory = MyBatisFactory.getSqlMapper();

    @Override
    public int insertMember(MemberBean member) {
       
//         factory.openSession(true);   오토코밋 가능
        SqlSession session = factory.openSession(true);
        try {
            //return session.insert("kr.or.ddit.member.dao.IMemberDao.insertMember",member);
            // 위에엇을 밑에 것으로 변환 해서 사용.
            IMemberDao dao = session.getMapper(IMemberDao.class);
            return dao.insertMember(member);
        } finally {
            session.close();
            // session 을 close 하면서 dao를 null로 돌려 주므로 IMemberDao 를 전역 변수로 사용 하지 않아도 된다..
        }
    }
    @Override
    public int updateMember(MemberBean member) {
       
//         factory.openSession(true);   오토코밋 가능
        SqlSession session = factory.openSession(true);
        try {
            IMemberDao dao = session.getMapper(IMemberDao.class);
            return dao.updateMember(member);
           
            //return session.update("kr.or.ddit.member.dao.IMemberDao.updateMember",member);
        } finally {
            session.close();
        }
    }

    @Override
    public int deleteMember(String mem_id) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public List<MemberBean> findByAll() {
        SqlSession session = factory.openSession();
        try {
            //return session.selectList("kr.or.ddit.member.dao.IMemberDao.findByAll");
            IMemberDao dao = session.getMapper(IMemberDao.class);
            return dao.findByAll();
        } finally {
           
            session.close();
        }
    }
   
    @Override
    public MemberBean findByPk(String mem_id) {
        SqlSession session = factory.openSession(true);
        try {
            IMemberDao dao = session.getMapper(IMemberDao.class);
            return dao.findByPk(mem_id);
        } finally {
            session.close();
        }
    }

}

 

이 글은 스프링노트에서 작성되었습니다.

'JSP' 카테고리의 다른 글

Multiple Parameter  (0) 2012.05.08
log4j구현환경제공.  (0) 2012.05.08
MVC패턴  (0) 2012.05.08
Login&Logout 기본패턴  (0) 2012.05.08
log4j  (0) 2012.05.08
Posted by 사라링
BLOG main image
.. by 사라링

카테고리

사라링님의 노트 (301)
JSP (31)
J-Query (41)
JAVA (24)
VM-WARE (0)
디자인패턴 (1)
스크랩 (0)
스트러츠 (3)
안드로이드 (11)
오라클 (45)
우분투-오라클 (1)
이클립스메뉴얼 (6)
스프링3.0 (23)
자바스크립트 (10)
HTML5.0 (17)
정보처리기사 (1)
기타(컴퓨터 관련) (1)
문제점 해결 (3)
프로젝트 (2)
AJAX (4)
하이버네이트 (3)
트러스트폼 (11)
Jeus (2)
재무관리(회계) (5)
정규식 (5)
아이바티스 (8)
취미 (2)
소프트웨어 보안 관련모음 (0)
정보보안기사 (6)
C언어 베이직 및 프로그램 (3)
보안 관련 용어 정리 (2)
넥사크로 (6)
Total :
Today : Yesterday :