spring

day5 class05 Mybatis 프레임워크 시작하기

일상다반ㅅㅏ 2019. 2. 21. 22:30

Mybatis 프레임워크 특징

- 한두 줄의 자바코드로 DB 연동을 처리한다.

- SQL 명령어를 자바 코드에서 분리하여 XML 파일에 따로 관리한다.


1. Java ORM Plugin 설치

- Mybatis와 관련된 복잡한 XML 설정 파일들을 자동으로 만들고 관리할 수 있다.

- Eclipse Marketplace에서 설치



2. 프로젝트 생성

1) file > new > Spring Legacy Project > project name : MybatisProject

2) 프로젝트 우클릭 > properties > project Facets > convert to faceted form > java : 1.8 선택 > runtimes : jdk1.8.~~ 선택

3) DB 연동을 위한 H2 Driver, mybatis, iBatis 라이브러리들을 내려받는다.

> 교재엔 1.4.191로 나와 있는데 이걸로 하면 

Cause: org.apache.ibatis.transaction.TransactionException: Error configuring AutoCommit.  Your driver may not support getAutoCommit() or setAutoCommit(). Requested setting: false.

위와 같은 에러가 발생하여 실행이 되지 않는다. 이것 때문에 몇일을 삽질했네ㅡㅡ^

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!-- pom.xml -->
 
<!-- H2 Driver -->
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.196</version>
</dependency>
        
<!-- Mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.3.1</version>
</dependency>
        
<!-- Ibatis -->
<dependency>
    <groupId>org.apache.ibatis</groupId>
    <artifactId>ibatis-core</artifactId>
    <version>3.0</version>
</dependency>
cs




3. VO(Value Object) 클래스 작성

- 기존 게시판 프로젝트에서 사용하던 BoardVO와 같은 내용이다. 

- getter/setter 부분만 있으면 된다.



4. SQL Mapper XML 파일 작성

1) 프로젝트 우클릭 > new > other > Java ORM Plugin > Mybatis Mapper XML > MyBatis Mapper name : board-mapping.xml

2) 위의 파일을 src/main/resources의 mappings 패키지 생성 후 이동시킨다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!-- board-mapping.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="BoardDAO">
    <insert id="insertBoard">
        insert into board(seq, title, writer, content) 
        values((select nvl(max(seq), 0)+1 from board),#{title},#{writer},#{content})
    </insert>
    
    <update id="updateBoard">
        update board set title=#{title}, content=#{content} where seq=#{seq}
    </update>
    
    <delete id="deleteBoard">
        delete board where seq=#{seq}
    </delete>
    
    <select id="getBoard" resultType="board">
        select * from board where seq=#{seq}
    </select>
    
    <select id="getBoardList" resultType="board">
        select * from board
        where title like '%'||#{searchKeyword}||'%'
         order by seq desc
    </select>
</mapper>
cs





5. Mybatis 환경설정 파일

1) 프로젝트 우클릭 > new > other > Java ORM Plugin > Mybatis Configuration XML > Container : /MybatisPorject , MyBatis Configuration name : sql-map-config.xml

2) src폴더에 db.properties / sql-map-config.xml 파일이 생성되는데 src/main/resource 폴더로 이동시킨다.

- <properties> 엘리먼트는 XML 설정에서 사용할 프로퍼티를 선언하거나 외부 프로퍼티 파일을 참조할 때 사용한다. 이렇게 선언된 프로퍼티는 {프로퍼티 이름}"으로 참조하여 사용한다.

- <typeAliases> 엘리먼트는 <typeAlias>를 여러 개 가질 수 있으며, 특정 클래스의 별칭을 선언할 수 있다. 이 별칭은 SqlMapper에서 사용할수 있으며 Sql Mapping 파일의 크기를 줄여주기도 하고 설정을 간단히 처리할 수도 있다.

- <mappers> 엘리먼트는 여러 <mapper>를 가질 수 있으며, SQL 명령어들이 저장된 SQL파일들을 등록할 수 있다.

1
2
3
4
5
6
<!-- db.properties -->
 
jdbc.driverClassName=org.h2.Driver
jdbc.url=jdbc:h2:tcp://localhost/~/test
jdbc.username=sa
jdbc.password=
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<!-- sql-map-config -->
 
<?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 파일 설정 -->
    <properties resource="db.properties" />
    
    <!-- Alias 설정 -->
    <typeAliases>
        <typeAlias alias="board" type="com.springbook.biz.board.BoardVO"></typeAlias>
    </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>
    
    <!-- Sql Mapper 설정 -->
    <mappers>
        <mapper resource="mappings/board-mapping.xml" />
    </mappers>
</configuration>
 
cs


6. SqlSession 객체 생성하기

- Mybatis를 이용하여 DAO를 구현하려면 SqlSession 객체가 필요하다. 그런데 이 객체를 얻으려면 SqlSessionFactory 객체가 필요하다. 

- Mybatis 메인 설정 파일인 sql-map-config.xml 파일로부터 설정 정보를 읽어 들이기 위한 입력 스트림을 생성한다.

- 그리고 나서 입력 스트림을 통해 sql-map-config.xml 파일을 읽어 SqlSessionFactory 객체를 생성한다.

- getSqlSessionInstance() 메소드는 SqlSessionFactory 객체로부터 SqlSession 객체를 얻어내어 리턴하는 메소드다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// SqlSessionFactoryBean.java
 
package com.springbook.biz.util;
 
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();
    }
}
 
cs




7. DAO 클래스 작성

- BoardDAO 클래스는 생성자에서 SqlSessionFactoryBean을 이용하여 SqlSession 객체를 얻어내고 있다.

- 각 메소드의 첫번째 인자는 실행될 SQL의 id정보이다. SQL Mapper에 선언된 네임스페이스와 아이디를 조합하여 아이디를 지정한다. 두번째 인자는 parameterType 속성으로 지정된 파라미터 객체이다. 단 건과 목록 조회는 selectOne(), selectList()메소드로 처리한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// BoardDAO.java
 
package com.springbook.biz.board.impl;
 
import java.util.List;
 
import org.apache.ibatis.session.SqlSession;
 
import com.springbook.biz.board.BoardVO;
import com.springbook.biz.util.SqlSessionFactoryBean;
 
public class BoardDAO {
 
    private SqlSession mybatis;
    
    public BoardDAO() {
        mybatis = SqlSessionFactoryBean.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();
    }
    
    public BoardVO getBoard(BoardVO vo) {
        return (BoardVO) mybatis.selectOne("BoardDAO.getBoard", vo);
    }
    
    public List<BoardVO> getBoardList(BoardVO vo) {
        return mybatis.selectList("BoardDAO.getBoardList", vo);
    }
    
}
 
cs




8. 테스트 클라이언트 작성 및 실행

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// BoardServiceClient.java
 
package com.springbook.biz.board;
 
import java.sql.SQLException;
import java.util.List;
 
import com.springbook.biz.board.BoardVO;
import com.springbook.biz.board.impl.BoardDAO;
 
public class BoardServiceClient {
 
    public static void main(String[] args) throws SQLException {
        BoardDAO boardDAO = new BoardDAO();
        
        BoardVO vo = new BoardVO();
        vo.setTitle("myBatis 제목3");
        vo.setWriter("홍길동3");
        vo.setContent("myBatis 내용입니다...3");
        boardDAO.insertBoard(vo);
        
        vo.setSearchCondition("TITLE");
        vo.setSearchKeyword("");
        List<BoardVO> boardList = boardDAO.getBoardList(vo);
        for(BoardVO board : boardList) {
            System.out.println("---> " + board.toString());
        }
    }
}
cs