본문 바로가기

웹 프로그래밍

MyBatis - 설치, Mapping 태그

@markdown

# MyBatis

____

- 더 빠른 JDBC 코딩을 위한 일반화된 프레임워크

- SQL을 `java code`가 아닌 XML로 따로 분리

- SQL의 실행결과를 `Map` 또는 `java class`로 자동 매핑

- SQL을 XML이나 인터페이스내에 `annotation`을 활용하여 처리함

- SQL을 변경하고자 할 경우 기존처럼 프로그램을 수정하는 것이 아니라 XML 파일의 SQL문 만을 변경하면 되기 때문에 SQL 변환이 자유로움


## MyBatis 구조

____

![](http://docs.altibase.com/download/attachments/7340856/MyBatis_intro.png?version=1&modificationDate=1416808419000&api=v2)

[사진 출처 : Altibase]


## MyBatis 적용

____

- 환경설정 파일(SqlMapConfig)과 실제 쿼리를 적용할 파일(Mapper)이 필요(XML, Annotation)

- Java 파일에서는 설정된 환경설정 정보를 이용하여 `SqlSession`객체를 얻어온 다음 `MyBatis`와 연동


## MyBatis 설치

____

### 1. MyBatis 다운로드

- [https://github.com/mybatis/mybatis-3/releases](https://github.com/mybatis/mybatis-3/releases) 다운로드

<br/>

### 2. Eclipse 라이브러리 추가

- 프로젝트에 다운받은 파일을 압축 해재 한 후 mybatis-x.x.x.jar 파일을 클래스패스에 추가(웹 프로젝트인 경우 WEB-INF/lib에 추가)

- `Maven` 일 경우 `dependency` 추가

```xml

<dependency>

<groupId>org.mybatis</groupId>

<artifactId>mybatis</artifactId>

<version>3.4.4</version>

</dependency>

```

<br/>

### 3. XML 환경 설정

- `new file` - `db.properties` 파일 생성 후 소스 코드 입력

<pre><code class="java" style="font-size:14px">jdbc.driver=oracle.jdbc.driver.OracleDriver

jdbc.url=jdbc:oracle:thin:@localhost:1521:xe

jdbc.user=hr

jdbc.password=hr

</code></pre>


- `mybatis-config.xml` 생성 후 소스 코드 입력

- `property` 속성 value에 위에서 설정한 jdbc.driver, url, user, password 이름과 같게 설정해준다.

- MyBatis의 환경설정 파일 DB 드라이버, ID, Pass로 접근할 것이다. 매핑정보 입력

<pre><code class="java" style="font-size:14px"><?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="db.properties"></properties>

<environments default="development">

<environment id="development">

<transactionManager type="JDBC" />

<dataSource type="POOLED">

<property name="driver" value="${jdbc.driver}" />

<property name="url" value="${jdbc.url}" />

<property name="username" value="${jdbc.user}" />

<property name="password" value="${jdbc.password}" />

</dataSource>

</environment>

</environments>

<mappers>

<mapper resource="org/mybatis/example/BlogMapper.xml" />

</mappers>

</configuration>

</code></pre>

<br/>

### 4. Java Class에서 SqlSessionFactory 불러오기

- `MyConfig.java` 생성 후 코드 작성

<pre><code class="java" style="font-size:14px">import java.io.IOException;

import java.io.InputStream;

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 MyConfig {

private SqlSession session;

public MyConfig() {

String resource = "mybatis-config.xml";

InputStream inputStream = null;

try {

inputStream = Resources.getResourceAsStream(resource);

} catch (IOException e) {

e.printStackTrace();

}

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

session = sqlSessionFactory.openSession();

}

public SqlSession getInstance(){

return session;

}

}

</code></pre>

- `MyBatisMain.java` 생성 후 코드 작성

<pre><code class="java" style="font-size:14px">import org.apache.ibatis.session.SqlSession;

public class MyBatisMain {

public static void main(String[] args) {

SqlSession session = new MyConfig().getInstance();

System.out.println(session);

}

}

</code></pre>


```

MyBatisMain 실행결과

org.apache.ibatis.session.defaults.DefaultSqlSession@5fe5c6f

출력이 되면 성공

```


## XML Mapper 사용 태그

____

- `<select>` : 데이터 조회(select 쿼리)시 사용하는 태그

- 속성 : `id`, `parameteType`, `resultType`, `resultMap`

- `<sql>` : 공통 쿼리 묶는데 사용하는 태그

- `<include>` : <sql>로 생성된 컴포넌트 삽입 시 사용

- 속성 : `refid`

- `<insert>` : 데이터 입력(insert 쿼리) 시 사용하는 태그

- 속성 : `id`, `parameteType`

- `<update>` : 데이터 업데이트(update 쿼리) 시 사용하는 태그

- 속성 : `id`, `parameteType`

- `<delete>` : 데이터 삭제(delete 쿼리) 시 사용하는 태그

- 속성 : `id`, `parameteType`

## XML Mapper 동적 태그

____

### foreach

<pre><code class="java" style="font-size:14px"><foreach item="addr" open="(" separator="," close=")"collection="addrs">

#{addr}

</foreach>

</code></pre>

<br/>


### if

<pre><code class="java" style="font-size:14px"><iftest="id != null">

id = #{id}

</if>

</code></pre>

<br/>


### choose, when, otherwise

<pre><code class="java" style="font-size:14px"><choose>

<when test="searchType== 'id'">

id like #{searchWord}

</when>

<otherwise>

addrlike #{searchWord}

</otherwise>

</choose>

</code></pre>

<br/>


### where

<pre><code class="java" style="font-size:14px"><where>

<if test="writer != null">

writer like #{writer}

</if>

<if test="title != null">

AND title like #{title}

</if>

</where>

</code></pre>

<br/>


### set

<pre><code class="java" style="font-size:14px"><set>

<if test="writer != null">

writer = #{writer},

</if>

<if test="title != null">

title = #{title}

</if>

</set>

</code></pre>


## MyBatis SQL 태그 사용

____


### select

- Mapping xml 파일 생성

- namespace 를 각각의 매퍼 클래스마다 정의해준다.(중복 ID를 피하기 위함)


<pre><code class="java" style="font-size:14px"><?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.co.bit.board.BoardDAO">

...

</mapper>

</code></pre>


- 위에서 설정한 mybatis-config.xml 파일의 <configuration> 태그 사이에 아래 mappers 코드 추가

- xml 생성한 경로를 입력

<pre><code class="java" style="font-size:14px"><mappers>

<mapper resource="common/db/board.xml" />

</mappers>

</code></pre>


- 생성된 xml 파일의 mapper 태그 사이에 `<select>` 태그 사용

<pre><code class="java" style="font-size:14px"><select id="selectBoard" resultMap="boardMap">

select no, title, writer, content, reg_date from t_board

</select>

java 파일에서는 xml id 속성으로 select 쿼리를 찾는다.

resultMap 속성으로 리턴 받을 타입을 명시해준다.

</code></pre>

- DAO.java selectAll()

<pre><code class="java" style="font-size:14px">private SqlSession session;

public void select(){

List<BoardVO> list = session.selectList("kr.co.bit.board.BoardDAO.selectBoard");

System.out.println("<전체 게시물 조회>");

for(BoardVO board : list){

System.out.println(board);

}

}

</code></pre>

- `<select>` xml의 결과 값으로 VO List 형태로 리턴된다.


### insert

- 전달 받은 `board` 타입의 파라미터 값으로 values를 지정

<pre><code class="java" style="font-size:14px"><insert id="insertBoard" parameterType="board">

insert into t_board(no, title, writer, content)

 values(seq_t_board_no.nextval, #{title}, #{writer}, #{content})

</insert>

</code></pre>

<pre><code class="java" style="font-size:14px">private void insert() {

BoardVO board = new BoardVO();

board.setTitle("mybatis insert");

board.setWriter("ㅇㄱㅅ");

board.setContent("mybatis 내용");

session.insert("kr.co.bit.board.BoardDAO.insertBoard", board);

session.commit();

}

</code></pre>

<br/>

### foreach 사용

- where 조건에서 in 연산자 사용하는 경우, 여러 값을 DAO로 부터 전달 받아야 한다.

이때 foreach 태그를 사용해 전달 받은 값을 쿼리에 넣는다.

- where no in (1, 2, 3, 4, 5, 6)을 조회한다.

- 양쪽 괄호를 `open`과 `close` 속성을 사용해 지정하고 `,` 구분자로 지정해 sql 문법에 맞춘다.

<pre><code class="java" style="font-size:14px"><select id="selectNos" parameterType="board" resultType="board">

<include refid="select01"></include>

where no in

<foreach collection="nos" item="bno" open="(" close=")" separator=",">

#{ bno }

</foreach>

</select>

</code></pre>