본문 바로가기
kosta/Servlet,JSP,JDBC,MyBatis

[MyBatis] 실습

by 엑츄얼리 2022. 4. 14.

이론

https://linked2ev.github.io/mybatis/2019/09/08/MyBatis-1-MyBatis-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EA%B5%AC%EC%A1%B0/

 

 


직전의 JDBC, DBCP 프로젝트를 MyBatis 방식으로 교체

 

insertBoard(), listBoard(), detailBoard()를 수정

package bean;

import java.io.InputStream;
import java.util.List;

import mapper.BoardMapper;
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 BoardDao2 {
    private static BoardDao2 dao = new BoardDao2();

    public static BoardDao2 getInstance() {
        return dao;
    }

    public SqlSessionFactory getSqlSessionFactory() {
        //mybatis-config.xml => SqlSesstionFactory로 변환하는 작업
        String resource = "resource/mybatis-config.xml";
        InputStream in = null;

        try {
            in = Resources.getResourceAsStream(resource);//mybatis-config.xml를 인푸트스트림이랑 연결시켜줬음.
        } catch (Exception e) {
            e.printStackTrace();
        }
        return new SqlSessionFactoryBuilder().build(in);
    }



    public int insertBoard(Board board) {
        SqlSession sqlSession = getSqlSessionFactory().openSession();
        int re = -1;
        try {
            //re = sqlSession.insert("mapper.BoardMapper.insertBoard", board);
            re = sqlSession.getMapper(BoardMapper.class).insertBoard(board);
            if (re > 0) {
                sqlSession.commit();
            } else {
                sqlSession.rollback();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(sqlSession != null){
                sqlSession.close();
            }
        }
        return re;
    }
    public List<Board> listBoard() {
        SqlSession sqlSession = getSqlSessionFactory().openSession();
        List<Board> list = null;
        try {
            //list = sqlSession.selectList("mapper.BoardMapper.listBoard");//mapStatement 호출
            list = sqlSession.getMapper(BoardMapper.class).listBoard();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
        return list;
    }

    public Board detailBoard(int seq){
        SqlSession sqlSession = getSqlSessionFactory().openSession();
        Board board = null;
        try{
            board = sqlSession.getMapper(BoardMapper.class).detailBoard(seq);
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            if(sqlSession!=null){
                sqlSession.close();
            }
        }
        return board;
    }

    public int updateBoard(Board board){
        SqlSession sqlSession = getSqlSessionFactory().openSession();
        int re = -1;

        try{
            re = sqlSession.getMapper(BoardMapper.class).updateBoard(board);
            if (re > 0) {
                sqlSession.commit();
            }else{
                sqlSession.rollback();
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            if(sqlSession != null){
                sqlSession.close();
            }
        }
        return re;
    }
}

<BoardDao2.java>

 

.
.
.
public SqlSessionFactory getSqlSessionFactory() {
        //mybatis-config.xml => SqlSesstionFactory로 변환하는 작업
        String resource = "resource/mybatis-config.xml";
        InputStream in = null;

        try {
            in = Resources.getResourceAsStream(resource);//mybatis-config.xml를 인푸트스트림이랑 연결시켜줬음.
        } catch (Exception e) {
            e.printStackTrace();
        }
        return new SqlSessionFactoryBuilder().build(in);
    }
.
.
.

<BoardDao2.java 내용>

이 부분이 MyBatis를 통해 DB와 Application을 연동해주는 부분이다.

  한줄씩 이해하고 싶었는데, 자세히 설명된 블로그나 내용을 찾지못했다.

  전체적으로 mybatis-config.xml을 객체화하여 Application에서 사용할 수 있도록 변환해주는 과정이라고

  이해하면 되는 것 같다.

 

* mybatis-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 type="bean.Board" alias="Board"/>
        	<typeAlias type="member.Member" alias="Member"/>
        	<typeAlias type="blog.Author" alias="Author"/>
        	<typeAlias type="blog.Blog" alias="Blog"/>
	</typeAliases>

	<environments default="development">
		<environment id="development">
    
			<transactionManager type="JDBC"/>
        
			<dataSource type="JNDI">
            <!--아래 property를 통해 context.xml의 설정을 통해 DB와 접속-->
				<property name="data_source" value="java:comp/env/jdbc/oracle"/>
			</dataSource>
        
<!--            <dataSource type="POOLED">-->
<!--                <property name="driver" value="oracle.jdbc.driver.OracleDriver"/>-->
<!--                <property name="url" value="jdbc:oracle:thin:@localhost:1521:XE"/>-->
<!--                <property name="username" value="c##kosta236_2"/>-->
<!--                <property name="password" value="1234"/>-->
<!--            </dataSource>-->
        
		</environments>
	</environments>

<mappers>
        <mapper resource="mapper/Board.xml"/>
        <mapper resource="mapper/Member.xml"/>
        <mapper resource="mapper/Blog.xml"/>
</mappers>

</configuration>

 <mybatis-config.xml>

 

environments : DB에 연결할 설정에 대한 정보 선언

 - <environments default="{defaultName}"> : 여러개의 environment 중 기본으로 연결할 정보를 설정

     environment 1개는 1개의 DB와 매칭

    <environment id="{name}">으로 구분 가능 (defaultName = (id = "{name}") 중 하나

 

 - <transactionManager type="JDBC"> : 트랜잭션 제어 방식 설정

     JDBC : JDBC가 commit/rollback을 직접 처리하기 위해 사용(수동 commit)

     MANAGED : 트랜잭션을 자동으로 관리(자동 commit)

 

 - <dataSource type="POOLED"> : Connection Pool 사용 여부에 대한 설정 (DB 접속 방식)

     UNPOOLED : Connection객체를 별도로 저장하지 않고 객체 호출 시 매번 생성하여 사용

     POOLED : 최초 Connection객체를 생성할 때 그 정보를 pool 영역에 저장 및 이후 재사용

    - properties : 연결 정보 입력 (driver, url(DB주소), username(DB username), password(DB userpassword))

 

 - mappers : DB에 사용되는 쿼리문들들을 담은 mapper파일을 등록하는 부분

 

 - typeAliases : 각 객체에 대한 별칭 설정

참고 : https://spring.tistory.com/3

 

 

 


아래에서 진행한 프로젝트의 mybatis-config.xml 셋팅은 위에 작성된 것과 같으며,

 context.xml및 directory 구조는 아래와 같다.

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/">
    <Resource auth="Container" driverClassName="oracle.jdbc.driver.OracleDriver"
              maxActive="100" maxIdle="30" maxWait="10000"
              name="jdbc/oracle" password="1234" type="javax.sql.DataSource"
              url="jdbc:oracle:thin:@localhost:1521:XE"
              username="c##kosta236_2"/>
</Context>

<context.xml>

 

나머지는 복습할 때 프로젝트 열어서 확인해보자. <BoardDao2.java>랑 내용이 많이 다르지 않다.

* bean, member, blog

MyBatis.zip
0.07MB

 

댓글