본문 바로가기

Spring

[Spring] Mybatis 프레임워크 Spring에 연동

728x90
반응형

지난 포스팅에 이어서 Mybatis 프레임워크를 Spring에 연동해보려고 한다. 

 

1. 라이브러리 (pom.xml) 변경 

Mybatis에서 Spring에게 연동에 필요한 API를 제공한다. 

		<!-- Mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.3.1</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.2.4</version>
		</dependency>

2. db.properties 파일 삭제 + sql-map-config.xml 파일에서 사용하지 않는 설정제거

이미 DataSource가 스프링 설정파일(applicationContext)에 존재하기 때문! 

applicationContext(스프링 설정파일)dataSource로 등록되어있다.

 

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 type="com.kim.biz.board.BoardVO" alias="board" />
       <typeAlias type="com.kim.biz.member.MemberVO" alias="member" />
   </typeAliases>
 
    <mappers>
    	<mapper resource="mappings/board-mapping.xml" />
    	<mapper resource="mappings/member-mapping.xml" />
    </mappers>
    
</configuration>

3. SqlSessionFactory 클래스를 스프링 설정파일에 <bean> 등록해야함 

SqlSessionFactory 객체로부터 DB연동에 사용할 SqlSession객체를 얻기위함

<?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"
	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.2.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">

	<context:component-scan base-package="com.kim.biz" />

	<aop:aspectj-autoproxy />
	
	<!-- DataSource 설정하기 -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
		<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
		<property name="username" value="kim" />
		<property name="password" value="1234" />
	</bean>
	<!-- Spring JDBC 설정하기 -->
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource" />
	</bean>
	
	<!-- Mybatis를 Spring에 연동 -->
	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="configLocation" value="classpath:sql-map-config.xml" />
		<property name="dataSource" ref="dataSource" />
	</bean>
    <!--멤버변수 mybatis에게 SqlSessionTemplate 클래스를 <bean> 등록하여 DI -->
	<bean class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg ref="sqlSession" />
	</bean>

</beans>

4. DAO 변경 

package com.kim.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.kim.biz.board.BoardVO;

@Repository("boardDAO")
public class BoardDAO3 {
	@Autowired
	private SqlSessionTemplate mybatis;

	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);
	}
}

MyBatis - 동적 쿼리

마이바티스의 가장 강력한 기능 중 하나는 동적 SQL을 처리하는 방법이다.

검색 기능을 구현하기 위해 달라지는 검색 조건에 대응을 동적 쿼리를 사용하였다. 

<?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 type="board" id="boardResult">
		<id property="bid" column="BID" />
		<result property="title" column="TITLE" />
		<result property="writer" column="WRITER" />
		<result property="fileName" column="UPLOADFILE" />
	</resultMap>

	<insert id="insertBoard">
		INSERT INTO BOARD(BID,TITLE,WRITER,CONTENT,UPLOADFILE) VALUES((SELECT NVL(MAX(BID),0)+1 FROM BOARD),#{title},#{writer},#{content},#{fileName})
	</insert>

	<update id="updateBoard">
		UPDATE BOARD SET TITLE=#{title}, CONTENT=#{content}, UPLOADFILE=#{fileName} WHERE BID=#{bid}
	</update>
	
	<delete id="deleteBoard">
		<![CDATA[
			DELETE BOARD WHERE BID=#{bid}
		]]>
	</delete>

	<select id="selectOneBoard" resultMap="boardResult">
		SELECT * FROM BOARD WHERE BID=#{bid}
	</select>
	
	<select id="selectAllBoard" resultMap="boardResult">
		SELECT * FROM BOARD
		WHERE 1 = 1
		<if test="searchCondition =='TITLE'">
		AND TITLE LIKE '%'||#{searchContent}||'%'
		</if>
		<if test="searchCondition =='WRITER'">
		AND WRITER LIKE '%'||#{searchContent}||'%'
		</if>
		ORDER BY BID DESC
	</select>

</mapper>

if 문을 이용한 동적 쿼리 

여기서 WHERE 1=1 는 동적쿼리를 만들때 사용하는데 , 수많은 쿼리를 만들다 보면 첫번째 조건에 어떤 것이 옳은지 몰라서 제일 먼저 1=1 같은 무의미한 조건을 걸어두고, 이후에 AND 조건을 쭉 붙이기 위해 사용한다. 

728x90
반응형