Spring 3/MyBatis

Spring MyBatis 3 example

Soul-Learner 2014. 9. 24. 23:42

Spring, MyBatis 3 Integration example



테스트 환경

Windows 7, JDK 1.7, Spring 3.2, MyBatis 3.2, Eclipse luna, STS, Maven, Tomcat 8



Spring 에서 MyBatis 를 사용하기 위한 라이브러리

http://mvnrepository.com 에서 mybatis, mybatis spring 으로 검색하면 된다



MyBatis 에 대한 보다 상세한 예제는 다른 페이지를 참조하세요


pom.xml 의 일부내용

<dependency>

    <groupId>com.oracle</groupId>

    <artifactId>ojdbc6</artifactId>

    <version>11.2.0.3</version>

</dependency>


<dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-jdbc</artifactId>

    <version>4.1.9.RELEASE</version>

</dependency>


<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.5</version>

</dependency>



WEB-INF/spring/servlet-context.xml

<context:component-scan base-package="org.kdea.mybatis" />

  ...........

.........


<beans:bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource"> 

   <beans:property name="dataSourceName" value="ds"/>

   <beans:property name="URL" value="jdbc:oracle:thin:@localhost:1521:xe"/>

   <beans:property name="user" value="scott"/>

   <beans:property name="password" value="TIGER"/>

</beans:bean>


<beans:bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

<beans:property name="mapperLocations" value="classpath*:org/kdea/**/*.xml"/>

<beans:property name="dataSource" ref="dataSource" />

</beans:bean>

<beans:bean id="sqlSessionTemplateclass="org.mybatis.spring.SqlSessionTemplate">

        <beans:constructor-arg index="0" ref="sqlSessionFactory"/>

</beans:bean>

여러개의 폴더에 xml 설정파일이 있는 경우에는 위의 설정(value="classpath*:org/kdea/**/*.xml")과 같이  ** 을 사용하여 org.kdea 하위의 모든 패키지에 xml 파일을 두고 참조할 수 있게 된다



org.kdea.mybatis.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="list" resultType="org.kdea.mybatis.EmpVO">

        select * from emp2

    </select>

    <insert id="insert" parameterType="org.kdea.mybatis.EmpVO">

        insert into emp2 (empno, ename, deptno, job, sal) 

        values ( #{empno}, #{ename}, #{deptno}, #{job}, #{sal} )

    </insert>

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

        select * from emp2 where empno=#{empno}

    </select>

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

        SELECT * FROM emp2 WHERE empno=#{empno} AND deptno=#{deptno}

    </select

    <update id="update" parameterType="org.kdea.mybatis.EmpVO">

        update emp2 set deptno=#{deptno}, sal=#{sal} where empno=#{empno}

    </update>

    <delete id="delete" >

        delete from emp2 where empno=#{empno}

    </delete>

</mapper>



org.kdea.mybatis.EmpDAO.java

package org.kdea.mybatis;


import java.util.List;


public interface EmpDAO {


public List<EmpVO> list();

public EmpVO info(int empno);

public EmpVO find(@Param("empno")int empno, @Param("deptno")int deptno);

public int insert(EmpVO emp);

public int update(EmpVO emp);

public int delete(int empno);

}



org.kdea.mybatis.EmpVO.java

package org.kdea.mybatis;


public class EmpVO {  

 

 private int empno;  

 private String ename;  

 private String job;  

 private int deptno;  

 private int sal;

 

public int getEmpno() {

return empno;

}

public void setEmpno(int empno) {

this.empno = empno;

}

public String getEname() {

return ename;

}

public void setEname(String ename) {

this.ename = ename;

}

public String getJob() {

return job;

}

public void setJob(String job) {

this.job = job;

}

public int getDeptno() {

return deptno;

}

public void setDeptno(int deptno) {

this.deptno = deptno;

}

public int getSal() {

return sal;

}

public void setSal(int sal) {

this.sal = sal;

}  

}



org.kdea.mybatis.EmpMBController.java

package org.kdea.mybatis;


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.*;


@Controller

@RequestMapping("/mb/")

public class EmpMBController {


@Autowired

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


@RequestMapping("empList")

public String getEmpList(Model model) {

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

List<EmpVO> list = dao.list();

model.addAttribute("empList", list);

return "mb/empList";

}


        @RequestMapping("empInfo")

public String getEmp(Model model, @RequestParam int empno) {

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

EmpVO emp = dao.info(empno);

model.addAttribute("empInfo", emp);

return "mb/empInfo";

}

@RequestMapping(value="empInputForm", method=RequestMethod.GET)

public String empInputForm(EmpVO emp) {

return "/mb/empInputForm";

}

@RequestMapping(value="empInsert", method=RequestMethod.POST)

public String empInsert(EmpVO emp) {

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

int n = dao.insert(emp);

return "redirect:/mb/empList";

}

@RequestMapping("empEdit")

public String empEdit(Model model, @RequestParam int empno) {

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

EmpVO emp = dao.info(empno);

model.addAttribute("empInfo", emp);

return "/mb/empEdit";

}

@RequestMapping("empUpdate")

public String empUpdate(Model model, EmpVO emp) {

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

int n = dao.update(emp);

model.addAttribute("empno", emp.getEmpno());

return "redirect:/mb/empInfo";

}

@RequestMapping("empDelete")

public String empDelete(@RequestParam int empno) {

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

int n = dao.delete(empno);

return "redirect:/mb/empList";

}

}



WEB-INF/views/mb/empList.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>사원정보 리스트</title>

</head>

<body>

<h2>사원정보 리스트</h2>

<c:forEach var="e" items="${empList}" >

${e.empno} 

<a href="empInfo?empno=${e.empno}"> ${e.ename} </a> 

${e.deptno} ${e.job} ${e.sal} <br>

</c:forEach>

<p>

<a href="empInputForm">사원정보 추가</a>

</body>

</html>



WEB-INF/views/mb/empInfo.jsp

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

    pageEncoding="EUC-KR"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE htm>

<html>

<head>

<meta charset="EUC-KR">

<title>사원정보 상세 페이지</title>

<script type="text/javascript">

function empDelete(empno){

if(confirm('정말로 사원정보를 삭제하시겠어요?')) {

location.href='empDelete?empno='+empno;

}

}

</script>

</head>

<body>

<h2>사원정보 상세 페이지</h2>

사번 ${empInfo.empno } <br>

이름 ${empInfo.ename } <br>

부서 ${empInfo.deptno } <br>

직무 ${empInfo.job } <br>

급여 ${empInfo.sal } <br>

<p>

<a href="empEdit?empno=${empInfo.empno}">사원정보 수정</a>

<a href="javascript:empDelete(${empInfo.empno})">사원정보 삭제</a>

</body>

</html>



WEB-INF/views/mb/empInputForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>  

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>사원정보 입력 폼</title>

<style>  

body {  

 font-size: 20px;  

 color: teal;  

}  

  

td {  

 font-size: 15px;  

 color: black;  

 width: 100px;  

 height: 22px;  

 text-align: left;  

}  

  

.heading {  

 font-size: 18px;  

 color: white;  

 font: bold;  

 background-color: orange;  

 border: thick;  

}  

</style>  

</head>  

<body>  

 <h2>사원정보 입력 폼 </h2>   


  <div>  

   <form:form method="post" action="empInsert" modelAttribute="empVO">  

    <table>  

     <tr>  

      <td>EMPNO :</td>  

      <td><form:input path="empno" /></td>  

     </tr>  

     <tr>  

      <td>ENAME :</td>  

      <td><form:input path="ename" /></td>  

     </tr>  

     <tr>  

      <td>DEPTNO :</td>  

      <td><form:input path="deptno"/></td>  

     </tr>  

     <tr>  

      <td>JOB :</td>  

      <td><form:input path="job" /></td>  

     </tr>

     <tr>  

      <td>SAL :</td>  

      <td><form:input path="sal" /></td>  

     </tr>  

     <tr>  

      <td> </td>  

      <td><input type="submit" value="Save" /></td>  

     </tr>  

     <tr>  

        

      <td colspan="2"><a href="list">사원정보 리스트 보기</a></td>  

     </tr>  

    </table>  

   </form:form>  

  </div>  


</body>  

</html>



WEB-INF/views/mb/empEdit.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>  

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>

<!DOCTYPE htm>

<html>

<head>

<meta charset="UTF-8">

<title>사원정보 수정 페이지</title>

</head>

<body>

<h2>사원정보 수정 페이지</h2>

 <form:form method="post" action="empUpdate" modelAttribute="empInfo">  

 <form:hidden path="empno"/>

사번 ${empInfo.empno } <br>

이름 ${empInfo.ename } <br>

부서 <form:input path="deptno"/> <br>

직무 ${empInfo.job } <br>

급여 <form:input path="sal"/> <br>

<p>

<input type="submit" value="변경사항 적용">

</form:form>  

</body>

</html>