기존의 프로젝트를 복사한 뒤 spring과 mybatis 연동하기
라이브러리 추가
파일 추가
sql-map-config.xml
<?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>
<!-- Alias 설정 -->
<typeAliases>
<typeAlias alias="board" type="com.springbook.biz.board.BoardVO"/>
</typeAliases>
<!-- Sql Mapper 설정 -->
<mappers>
<mapper resource="mappings/board-mapping.xml"/>
</mappers>
</configuration>
application.xml
sessionFactory를 클래스로 만들지않고 bean으로 생성
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<context:component-scan
base-package="com.springbook.biz" />
<!-- AOP 어노테이션 자동 인식 설정 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<context:property-placeholder
location="classpath:config/database.properties"/>
<!-- DataSource 설정 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- Transaction 설정 -->
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- Transaction Advice 설정 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="txPointcut"
expression="execution(* com.springbook.biz..*(..))"/>
<aop:advisor pointcut-ref="txPointcut" advice-ref="txAdvice"/>
</aop:config>
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:sql-map-config.xml" />
</bean>
</beans>
DAO를 구현하는 방법에는 두가지가 있다.
SqlSessionDaoSupport 클래스를 상속하여 구현
BoardDAOMybatis
Autowired를 통해 설정 파일에 등록된 객체를 인자로 받아 부모인 SqlSessionDaoSupport에 setSqlSessionFactory() 메서드로 설정해준다. 이렇게 해야 getSqlSession() 메서드를 호출하여 SqlSession 객체를 리턴 받을 수 있다.
package com.springbook.biz.board.impl;
import java.util.List;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.beans.factory.annotation.Autowired;
import com.springbook.biz.board.BoardVO;
@Repository
public class BoardDAOMybatis extends SqlSessionDaoSupport {
@Autowired
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
super.setSqlSessionFactory(sqlSessionFactory);
}
public void insertBoard(BoardVO vo) {
System.out.println("===> Mbatis로 insertBoard() 기능 처리");
getSqlSession().insert("BoardDAO.insertBoard", vo);
}
public void updateBoard(BoardVO vo) {
System.out.println("===> Mbatis로 updateBoard() 기능 처리");
getSqlSession().insert("BoardDAO.updateBoard", vo);
}
public void deleteBoard(BoardVO vo) {
System.out.println("===> Mbatis로 deleteBoard() 기능 처리");
getSqlSession().delete("BoardDAO.deleteBoard", vo);
}
public BoardVO getBoard(BoardVO vo) {
System.out.println("===> Mbatis로 getBoard() 기능 처리");
return (BoardVO)getSqlSession().selectOne("BoardDAO.getBoard", vo);
}
public List<BoardVO> getBoardList(BoardVO vo) {
System.out.println("===> Mbatis로 getBoardList() 기능 처리");
return getSqlSession().selectList("BoardDAO.getBoardList", vo);
}
}
BoardServiceImpl
board-mapping.xml
가독성을 위해 수정
XML 파일 처리시 부등호(< 혹은 >)를 또 다른 태그의 시작으로 받아들여 오류가 발생할 수 있다.
CDATA는 XML 파서가 해석하지 않도록 하여 문자열로 해석한다.
resultMap은 프로퍼티들을 재구성 할 수 있다.(불필요한 프로퍼티를 빼거나 테이블 조인시에는 검색 결과를 정확하게 하나의 자바 객체로 매핑할 수 없는데 이 때 사용할 수 있다.)
<?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">
<resultMap id="boardResult" type="board">
<id property="seq" column="SEQ"/>
<result property="title" column="TITLE"/>
<result property="writer" column="WRITER"/>
<result property="content" column="CONTENT"/>
<result property="regDate" column="REGDATE"/>
<result property="cnt" column="CNT"/>
</resultMap>
<insert id="insertBoard">
<![CDATA[
INSERT INTO BOARD(SEQ, TITLE, WRITER, CONTENT)
VALUES((SELECT NVL(MAX(SEQ), 0) + 1 FROM BOARD),
#{title},#{writer},#{content})
]]>
</insert>
<update id="updateBoard">
<![CDATA[
UPDATE BOARD SET TITLE=#{title}, CONTENT=#{content}
WHERE SEQ=#{seq}
]]>
</update>
<delete id="deleteBoard">
<![CDATA[
DELETE BOARD WHERE SEQ=#{seq}
]]>
</delete>
<select id="getBoard" resultType="board">
<![CDATA[
SELECT * FROM BOARD WHERE SEQ=#{seq}
]]>
</select>
<select id="getBoardList" resultMap="boardResult">
<![CDATA[
SELECT * FROM BOARD
WHERE TITLE LIKE '%'||#{searchKeyword}||'%'
ORDER BY SEQ DESC
]]>
</select>
</mapper>
SqlSessionTemplate을 사용하여 구현
applicationContext.xml
template bean을 추가하여 주입한다.
BoardDAOMybatis
package com.springbook.biz.board.impl;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.springbook.biz.board.BoardVO;
@Repository
public class BoardDAOMybatis {
// 일치하는 타입이 컨테이너에 존재하는지 확인하여 주입한다.
@Autowired
private SqlSessionTemplate mybatis;
public void insertBoard(BoardVO vo) {
System.out.println("===> Mbatis로 insertBoard() 기능 처리");
mybatis.insert("BoardDAO.insertBoard", vo);
}
public void updateBoard(BoardVO vo) {
System.out.println("===> Mbatis로 updateBoard() 기능 처리");
mybatis.update("BoardDAO.updateBoard", vo);
}
public void deleteBoard(BoardVO vo) {
System.out.println("===> Mbatis로 deleteBoard() 기능 처리");
mybatis.delete("BoardDAO.deleteBoard", vo);
}
public BoardVO getBoard(BoardVO vo) {
System.out.println("===> Mbatis로 getBoard() 기능 처리");
return (BoardVO)mybatis.selectOne("BoardDAO.getBoard", vo);
}
public List<BoardVO> getBoardList(BoardVO vo) {
System.out.println("===> Mbatis로 getBoardList() 기능 처리");
return mybatis.selectList("BoardDAO.getBoardList", vo);
}
}