Mybatis는 객체 지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도와주는
개발 프레임 워크로서 JDBC를 통해 데이터베이스에 액세스 하는 작업을 캡슐화하고 일반 SQL 쿼리,
저장 프로 시저 및 고급 매핑을 지원하며 모든 JDBC 코드 및 매개 변수의 중복작업을 제거한다. 한다.
Mybatis에서는 프로그램에 있는 SQL 쿼리들을 한 구성 파일에 구성하여 프로그램 코드와 SQL을 분리할 수 있는
장점을 가지고 있다.
즉, Mybatis를 사용하는 이유로는
1) DB연동을 담당하는 JAVA 코드를 1~2줄로 줄일 수 있어 가독성이 증대된다.
2) SQL문을 JAVA 코드에서 분리하여 XML 파일로 별로 관리하여 응집도를 높일 수 있다.
따라서 기존의 일반 자바 JDBC와 Service의 2 layerd 아키텍처를 이용하던 스프링 JDBCTemplate 등
여러 가지 버전의 DAO를 교체하며 사용 가능하다.
※ 동작방법
1) XML 파일에 저장된 SQL 문을 실행
2) 실행의 결과를 VO(JAVA객체)에 자동으로 매핑까지 수행
※설정
1) 마켓플레이스에서 아래 2개의 플러그인 설치
2) pom.xml에 2개의 라이브러리 파일 추가
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.ibatis</groupId>
<artifactId>ibatis-core</artifactId>
<version>3.0</version>
</dependency>
3) DB 연동에 필요한 SQL 문을 XML 파일에 저장
src/main/resources 하위 -> mappings 패키지 -> board-mapping.xml
=> SQL문을 작성한 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(BID,TITLE,WRITER,CONTENT) VALUES((SELECT NVL(MAX(BID),0)+1 FROM BOARD),#{title},#{writer},#{content})
</insert>
<update id="updateBoard">
UPDATE BOARD SET TITLE=#{title}, WRITER=#{writer} WHERE BID=#{bid}
</update>
<delete id="deleteBoard">
DELETE BOARD WHERE BID=#{bid}
</delete>
<select id="selectOneBoard" resultType="board">
SELECT * FROM BOARD WHERE BID=#{bid}
</select>
<select id="selectAllBoard" resultType="board">
SELECT * FROM BOARD WHERE TITLE LIKE '%'||#{searchContent}||'%' ORDER BY BID DESC
</select>
</mapper>
4) sql-map-config.xml 작성 (src/main/resources 하위)
Spring 연동 없이 사용하기 위해서는 직접 DB 연동정보를 작성해야 한다.
연동 정보를 db.properties에 작성
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:xe
jdbc.username=kim
jdbc.password=1234
Spring과 연동할 때에는 DB 연동 정보가 있기 때문에 별도 작성 필요 없음
<?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>
<!-- DB연동정보 파일과 연결 -->
<properties resource="db.properties" />
<!-- 별칭(Alias) 설정 -->
<typeAliases>
<typeAlias type="com.kim.biz.board.BoardVO" alias="board" />
</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>
<mappers>
<mapper resource="mappings/board-mapping.xml" />
</mappers>
</configuration>
DAO에 의존성을 주입해주기 위한 class 파일
package com.kim.biz.common;
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 SqlSessionBean {
// Mybatis로 DAO 클래스의 CRUD 메서드를 사용하려면,
// Mybatis에서 제공하는 SqlSession 객체를 사용해야한다!
// -> Factory 패턴
private static SqlSessionFactory sessionFactory=null;
static {
try {
if(sessionFactory==null) {
// 이곳의 작업은 스트림을 사용한다.
// 외부요인으로 인한 에러가 자주 발생하기때문에 예외처리.
// builder는 Mybatis 설정파일(sql-map-config.xml)을 로딩하면서
// SSF 객체를 생성함
// 설정파일 로딩을 위해 입력스트림(Reader)을 사용
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();
}
}
위의 설정들을 사용하는 DAO
package com.kim.biz.board.impl;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.kim.biz.board.BoardVO;
import com.kim.biz.common.SqlSessionBean;
public class BoardDAO3 {
private SqlSession mybatis;
public BoardDAO3() {
mybatis=SqlSessionBean.getSqlSessionInstance();
}
public void insertBoard(BoardVO vo) {
mybatis.insert("BoardDAO.insertBoard",vo);
mybatis.commit();
}
void updateBoard(BoardVO vo) {
mybatis.update("BoardDAO.updateBoard",vo);
mybatis.commit();
}
void deleteBoard(BoardVO vo) {
mybatis.delete("BoardDAO.deleteBoard",vo);
mybatis.commit();
}
BoardVO selectOneBoard(BoardVO vo) {
return mybatis.selectOne("BoardDAO.selectOneBoard",vo);
}
public List<BoardVO> selectAllBoard(BoardVO vo) {
return mybatis.selectList("BoardDAO.selectAllBoard",vo);
}
}
resultMap 속성 예시
<resultMap type="board" id="boardResult">
<id property="bid" column="BID" />
<result property="title" column="TITLE" />
<result property="writer" column="WRITER" />
<result property="content" column="CONTENT" />
</resultMap>
<select id="selectAllBoard" resultMap="boardResult">
SELECT * FROM BOARD WHERE TITLE LIKE '%'||#{searchContent}||'%' ORDER BY BID DESC
</select>
CDATA (문자데이터) -> XML 문법으로
XML 파서는 해석을 통해 설정을 이해하며 CDATA 영역을 설정하면, 그 영역은 XML 파서가 해석하지 않는다.
<![CDATA[SQL문]]>
ex) <![CDATA[SQL문DELETE BOARD WHERE BID<=#{bid}]]>
+) 가독성을 위해서라도 SQL문은 대문자로 작성하는 것을 권장한다.
'Spring' 카테고리의 다른 글
Spring Ajax를 사용한 정렬 (1) | 2022.10.07 |
---|---|
Mybatis 프레임워크 스프링 연동 (0) | 2022.10.05 |
Spring 다국어 처리 (0) | 2022.09.29 |
Spring 예외 페이지 설정 (0) | 2022.09.28 |
Spring 이미지 업로드 (0) | 2022.09.27 |