@markdown
# MyBatis
____
- 더 빠른 JDBC 코딩을 위한 일반화된 프레임워크
- SQL을 `java code`가 아닌 XML로 따로 분리
- SQL의 실행결과를 `Map` 또는 `java class`로 자동 매핑
- SQL을 XML이나 인터페이스내에 `annotation`을 활용하여 처리함
- SQL을 변경하고자 할 경우 기존처럼 프로그램을 수정하는 것이 아니라 XML 파일의 SQL문 만을 변경하면 되기 때문에 SQL 변환이 자유로움
## MyBatis 구조
____

[사진 출처 : 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>
'웹 프로그래밍' 카테고리의 다른 글
Spring - RequestMapping, Form 데이터 처리, ResponseBody 사용법 (0) | 2017.07.10 |
---|---|
Spring - AOP annotaion 용어, 패턴매칭, 자동주입 (0) | 2017.07.07 |
Spring - DI 자동 주입, AOP (0) | 2017.07.06 |
Spring - 핵심 개념(IoC, DI) (0) | 2017.07.05 |
Spring - Maven 설치 및 Eclipse 환경설정 하기 (0) | 2017.07.04 |