본문 바로가기
IT Study/Spring

Spring - MyBatis 스프링 JDBC 연동하기

by hhyyyjun 2023. 1. 3.

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

1. pom.xml에 추가(ibatis dependency 제외함)

   <!-- 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로 등록되어있다.

<!-- 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="dgw" />
		<property name="password" value="950617" />
	</bean>
	<!-- Spring JDBC 설정하기 -->
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource" />
	</bean>

3. SqlSessionFactory 클래스를 스프링 설정파일에 bean 등록을 해야 객체로 사용 가능함

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

<!-- Mybatis Spring 연동 -->
	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="configLocation" value="classpath:sql-map-config.xml"></property>
		<property name="dataSource" ref="dataSource"></property>
	</bean>

4. Mybatis를 이용한 DAO 클래스를 구현 준비

=> 멤버변수 Mybatis에게 SqlSessionTemplate 클래스를 <bean> 등록하여 DI

<!-- 생성자 주입 -->
	<bean class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg ref="sqlSession" />
	</bean>

5. 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; //SqlSessionTemplate로 등록
	
	public void insertBoard(BoardVO vo) {
		mybatis.insert("BoardDAO.insertBoard",vo);
	}
	public void updateBoard(BoardVO vo) {
		mybatis.update("BoardDAO.updateBoard",vo);
	}
	public void deleteBoard(BoardVO vo) {
		mybatis.delete("BoardDAO.deleteBoard",vo);
	}
	public BoardVO selectOneBoard(BoardVO vo) {
		return mybatis.selectOne("BoardDAO.selectOneBoard",vo);
	}
	public List<BoardVO> selectAllBoard(BoardVO vo) {
		return mybatis.selectList("BoardDAO.selectAllBoard",vo);
	}
}

Mybatis를 이용한 동적 sql문

기존의 sql문을 동적으로 구현할 때는 Java를 통해 초기설정한 sql문에 각 조건에 따라 문자열을 붙여 필터기능을 할 수 있도록 했었다.

구현한 필터기능 설명 : https://blog.naver.com/jun950617/222864534759

 

[프로젝트] 필터 검색을 통해 원하는 정보 출력하기(ft. FrontController)

프로젝트의 메인 기능인 필터 기능을 구현해보았다. 필터는 연료/지역/가격/주행거리/연식 총 5개의 카테고...

blog.naver.com

 

하지만 Mybatis는 sql의 유연성을 더욱 향상시키는 dynamic sql을 지원해주어 동적 엘리먼트를 사용해서 sql문을 처리할 수 있다.

이를 통해 검색/필터 등의 기능에서 더욱 쉽게 적용할 수 있다.

검색 기능 예시

<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>
      <if test="searchCondition == 'CONTENT'">
        AND	CONTENT LIKE '%'||#{searchContent}||'%'
      </if>
      ORDER BY BID DESC
   </select>

동적 sql문을 사용하기 위해 WHERE 1=1 조건문을 초기식에 넣어주었다.

if문을 통해 해당 조건에 해당되면 작성한 sql문이 붙어 적용된다.

코드 확인

https://github.com/hhyyyjun/SpringMybatis

댓글