Web & Mobile/SpringBoot

[SpringBoot] 스프링부트 Mybatis 연동

byunghyun23 2021. 3. 15. 02:42

스프링부트 Mybatis 연동을 위해 먼저 이전 포스팅의 4번과 같이 Mybatis Framework 의존 설정을 먼저 해주세요.

1. application.properties 코드 작성 (Mybatis 설정)

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
spring.mvc.static-path-pattern=/resources/**

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
server.servlet.encoding.charset=utf-8
server.servlet.encoding.enabled=true
server.servlet.encoding.force=true

mybatis.type-aliases-package=com.example.demo.mapper 		// Mapper.java 파일이 위치한 경로
mybatis.mapper-locations=mybatis/**/*.xml 		        // Mapper.xml 파일이 위치한 경로


Mybatis 설정을 위해 위 코드 맨 아래 두 줄만 추가해주면 됩니다.

프로젝트 내 해당 경로에 있는 파일은 아래 그림과 같습니다.
(**Mapper.java, **Mapper.xml)

2. **Mapper.java 생성 및 코드 작성 (DAO 인터페이스 작성)

package com.example.demo.mapper;

import java.util.HashMap;
import java.util.List;

import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

@Repository
@Mapper
public interface TestMapper {

	List<HashMap<Object, Object>> selectAll(HashMap<Object, Object> vo);

}

@Repository, @Mapper 어노테이션을 붙여줍니다.

selectAll()의 인자와 반환형은 잠시 후 설명하겠습니다.

3. **Mapper.xml 생성 및 코드 작성 (쿼리 작성)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<mapper namespace="com.example.demo.mapper.TestMapper">
    <select id="selectAll" parameterType="hashMap" resultType="hashMap">
      SELECT 
      	*
      FROM
      	users
      WHERE
         1=1
         <if test="region != null">
         	AND region = #{region}
         </if>
    </select>
</mapper>

쿼리 작성은 스프링에서 Mybatis 쿼리 작성과 유사합니다.

위 코드에서 if test에 있는 region은 파라미터 hashMap의 key 이고, 내용에 있는 #{region}은 value 입니다.

4. **Service.java 생성 및 코드 작성 (Service 클래스 작성)

package com.example.demo.service;

import java.util.HashMap;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.example.demo.mapper.TestMapper;

@Service
@Transactional
public class TestService {
    @Autowired
    private TestMapper mapper;

    public List<HashMap<Object, Object>> selectAll(HashMap<Object, Object> vo) {
        return mapper.selectAll(vo);
    }
}

@Service, @Transactional 어노테이션을 붙여줍니다.

5. **Controller.java 생성 및 코드 작성 (Controller 클래스 작성)

package com.example.demo;

import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.example.demo.service.TestService;

@Controller
public class TestController {
    @Autowired
    private TestService service;
	
    @RequestMapping(value="/", produces = "application/text; charset=utf8")
    public String main() {
    	try {
    		HashMap<Object, Object> parameterMap = new HashMap<Object, Object>();
    		parameterMap.put("region", "서울");
    		
    		List<HashMap<Object, Object>> selectList = service.selectAll(parameterMap);
    		
    		for (HashMap<Object, Object> rowMap : selectList) {
    			for( Entry<Object, Object> rowEntry : rowMap.entrySet() ){
    			    Object key = rowEntry.getKey();
    			    Object value = rowEntry.getValue();
    			    System.out.print( String.format(key + ":"+value + "  ") );
    			    
    			}
    		}
    	} catch (Exception e) {
    		e.printStackTrace();
    	}
    	
        return "index";
    }
}


selectAll() 메소드는 HashMap을 인자로 받고 HashMap을 원소로 하는 List를 반환합니다.

즉, 쿼리에서 조건절에 사용할 값을 HashMap에 put()하고 selectAll()을 통해 전달하면

쿼리 결과의 각 필드명은 HashMap의 key가 되고, 해당하는 값은 value가 되는 HashMap List를 반환합니다.

여기서 List는 쿼리 결과의 ROW라고 생각하면 됩니다.

위 코드의 이중 반복문을 통해 쿼리의 결과를 확인할 수 있습니다.