티스토리 뷰

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


'spring' 카테고리의 다른 글

day5 class03 스프링과 MyBatis 연동  (0) 2019.02.24
day5 class02 Mapper XML 파일 설정  (0) 2019.02.22
day4 class07 데이터 변환  (0) 2019.02.17
day4 class07 다국어 처리  (0) 2019.02.16
day4 class05 파일 업로드 및 예외 처리  (0) 2019.02.12