본문 바로가기

Spring 3/MyBatis Parameters

Multiple Parameters in MyBatis

Spring, MyBatis 사용시 다수개의 파라미터를 SQL 문장에 전달하는 예


개요

MyBatis의 SQL 문장에 다수개의 파라미터를 전달하기 위해서는 다음과 같은 방법을 사용한다

1. 도메인 오브젝트를 정의하고 다수개의 속성에 값을 저장한 후에 오브젝트를 parameterType="Product" 처럼 설정한다

2. HashMap<String, Object> 을 사용하여 다수개의 기본형 데이터나 오브젝트 형을 혼합하여 함께 전달할 때는 parameterType="hashmap" 으로 설정한다

3. 위의 방법 대신에 MyBatis에서 지원하는 @Param Annotation을 사용한다 ( @Param("empno") int empno, @Param("deptno") int deptno )


여기서는 1, 2번째 방법 대신에 @Param 을 사용하여 Java 측에서 MyBatis 측의 SQL 문장에 다수개의 파라미터를 전달하는 예를 테스트하고자 한다


EmpDAO.java

import java.util.HashMap;

import java.util.List;


import org.apache.ibatis.annotations.Param;


public interface EmpDAO {

  ....................

...........

public EmpVO getEmp(@Param("deptno") int deptno, @Param("ename") String ename);

}


EmpMapper.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="org.kdea.mybatis.EmpDAO"> <!--이 sql 문장과 매핑될 인터페이스의 완전한 경로-->

   ....................

...........

    <select id="getEmp" resultType="org.kdea.mybatis.EmpVO"> 

     <!-- parameterType 속성을 사용하지 않았으나 아래의 SQL문장 중에는 파라미터가 사용되고 있다-->

    select empno,ename,job,deptno,sal 

    from emp2 

    where deptno=#{deptno} and ename=#{ename}

    </select>

    

</mapper>


EmpMBController.java

package org.kdea.mybatis;


import java.util.HashMap;

import java.util.List;


import org.mybatis.spring.SqlSessionTemplate;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.ResponseBody;

import org.springframework.web.servlet.ModelAndView;


@Controller

@RequestMapping("/mb/")

public class EmpMBController {


@Autowired

private SqlSessionTemplate sqlSessionTemplate; // 설정파일에 빈으로 등록되었기 때문에 생성자나 Setter 없이 자동으로 주입

@RequestMapping("getEmp")

public ModelAndView getEmp(){

EmpDAO dao = sqlSessionTemplate.getMapper(EmpDAO.class);

EmpVO vo = dao.getEmp(20, "SMITH");

ModelAndView mv = new ModelAndView("mb/empView","vo",vo);

return mv;

}

}


empView.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="EUC-KR">

<title>사원정보 보기</title>

</head>

<body><p>

<h2>deptno, ename 으로 검색된 사원정보</h2>

${vo.empno } ${vo.ename} ${vo.deptno} ${vo.sal}

</body>

</html>