스프링, 하이버네이트 연동(CRUD) 예 ( Spring & Hibernate Integration example )
테스트 환경
Windows 7, JDK 1.7, Tomcat 8, Eclipse luna, STS(Spring 3.2), Maven, Hibernate 4.3.6, Oracle 11g XE
pom.xml 파일에 추가할 라이브러리
<!-- hibernate start-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.6.Final</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.18.2-GA</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-dbcp</artifactId>
<version>7.0.55</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>${oracle.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>
<!-- hibernate end-->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3</version>
</dependency>
EmpController.java
package org.kdea.hibernate;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
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.servlet.ModelAndView;
import org.kdea.hibernate.EmpService;
@Controller
public class EmpController {
EmpService empService;
@Autowired
public EmpController(EmpService empService){
this.empService = empService;
}
@RequestMapping(value="/hib/form", method=RequestMethod.GET)
public ModelAndView getForm(@ModelAttribute Emp emp) {
return new ModelAndView("hib/inputForm");
}
@RequestMapping("/hib/insert")
public ModelAndView registerEmp(@ModelAttribute Emp emp) {
empService.insertEmp(emp);
return new ModelAndView("redirect:/hib/list");
}
@RequestMapping("/hib/list")
public ModelAndView getList() {
List<Emp> empList = (List<Emp>)empService.getList();
return new ModelAndView("hib/empList", "empList", empList);
}
@RequestMapping("/hib/empInfo")
public ModelAndView getEmp(@RequestParam int empno,
@ModelAttribute Emp emp) {
emp = empService.getEmp(empno);
return new ModelAndView("hib/empInfo", "emp", emp);
}
@RequestMapping("/hib/delete")
public ModelAndView deleteEmp(@RequestParam int empno) {
empService.deleteEmp(empno);
return new ModelAndView("redirect:/hib/list");
}
@RequestMapping("/hib/edit")
public ModelAndView editEmp(@RequestParam int empno,
@ModelAttribute Emp emp) {
emp = empService.getEmp(empno);
return new ModelAndView("hib/empEdit", "emp", emp);
}
@RequestMapping("/hib/update")
public ModelAndView updateEmp(@ModelAttribute Emp emp) {
empService.updateEmp(emp);
return new ModelAndView("redirect:/hib/list");
}
}
EmpService.java
package org.kdea.hibernate;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service("empService")
public class EmpService {
EmpDAO empDao;
@Autowired
public EmpService(EmpDAO empDao) {
this.empDao = empDao;
}
public int insertEmp(Emp emp) {
return empDao.insertEmp(emp);
}
public List<Emp> getList() {
return empDao.getList();
}
public int deleteEmp(int empno) {
return empDao.deleteEmp(empno);
}
public Emp getEmp(int empno) {
return empDao.getEmp(empno);
}
public int updateEmp(Emp emp) {
return empDao.updateEmp(emp);
}
}
EmpDAO.java
package org.kdea.hibernate;
import java.io.Serializable;
import java.util.List;
import javax.transaction.Transactional;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service("empDao")
public class EmpDAO {
SessionFactory sessionFactory;
@Autowired
public EmpDAO(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Transactional
public int insertEmp(Emp emp) {
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session.saveOrUpdate(emp);
tx.commit();
Serializable id = session.getIdentifier(emp);
session.close();
return (Integer) id;
}
public List<Emp> getList() {
Session session = sessionFactory.openSession();
List<Emp> empList = session.createQuery("from Emp").list();
//List<Emp> empList = (List<Emp>)session.createSQLQuery("SELECT * FROM emp2").addEntity(Emp.class).list();
session.close();
return empList;
}
/*
* http://docs.jboss.org/hibernate/orm/3.3/reference/ko-KR/html/queryhql.html
*/
public Emp getEmp(int empno) {
Session session = sessionFactory.openSession();
//List<Emp> empList = session.createQuery("from Emp where empno="+empno).list();
//List<Emp> empList = session.createSQLQuery("SELECT * FROM emp2").addEntity(Emp.class).list();
Query query = session.createQuery("from Emp where empno=?");
List<Emp> empList = query.setInteger(0, empno).list();
session.close();
return empList.get(0);
}
public int updateEmp(Emp p_emp) {
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
//session.saveOrUpdate(emp);
Emp loaded = (Emp)session.get(Emp.class, p_emp.getEmpno());
loaded.setDeptno(p_emp.getDeptno());
loaded.setSal(p_emp.getSal());
session.update(loaded);
tx.commit();
Serializable id = session.getIdentifier(loaded);
session.close();
return (Integer) id;
}
public int deleteEmp(int empno) {
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
Emp emp = (Emp) session.get(Emp.class, empno);
Serializable ids = session.getIdentifier(emp);
session.delete(emp);
tx.commit();
session.close();
return (Integer) ids;
}
}
Emp.java
package org.kdea.hibernate;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="emp2")
public class Emp {
@Id
@Column(name="empno")
private int empno;
@Column(name="ename")
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;
}
}
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>
</body>
</html>
empInfo.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>사원정보 상세</title>
<script type="text/javascript">
function deleteEmp(empno){
if(confirm('정말로 삭제하시겠어요?')){
location.href='delete?empno='+empno;
}
}
</script>
</head>
<body>
<h2>사원정보 상세</h2>
${emp.empno}<br>
${emp.empno}<br>
${emp.ename}<br>
${emp.deptno}<br>
${emp.job}<br>
${emp.sal}<br>
<p>
<a href="edit?empno=${emp.empno}">수정</a>
<a href="javascript:deleteEmp(${emp.empno})">삭제</a>
</body>
</html>
empEdit.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>사원정보 수정</title>
<script type="text/javascript">
function modifyEmp(empno){
if(confirm('정말로 사원정보를 수정하시겠어요?')){
editForm.submit();
}
}
</script>
</head>
<body>
<h2>사원정보 수정</h2>
<form name="editForm" action="update" method="post">
<input type="hidden" name="empno" value="${emp.empno}">
사번 ${emp.empno}<br>
이름 ${emp.ename}<br>
부서 <input type="text" name="deptno" value="${emp.deptno}"><br>
직무 ${emp.job}<br>
급여 <input type="text" name="sal" value="${emp.sal}"><br>
<input type="button" value="수정" onclick="javascript:modifyEmp(${emp.empno})">
</form>
</body>
</html>
inputForm.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>
</head>
<body>
<center>
<h2>사원정보 입력폼</h2>
<form:form id="insert" modelAttribute="emp" method="post"
action="insert">
<table width="400px" height="150px">
<tr>
<td><form:label path="empno">사번</form:label>
</td>
<td><form:input path="empno" />
</td>
</tr>
<tr>
<td><form:label path="ename">이름</form:label>
</td>
<td><form:input path="ename" />
</td>
</tr>
<tr>
<td><form:label path="deptno">부서</form:label>
</td>
<td><form:input path="deptno" />
</td>
</tr>
<tr>
<td><form:label path="job">직무</form:label>
</td>
<td><form:input path="job" />
</td>
</tr>
<tr>
<td><form:label path="sal">급여</form:label>
</td>
<td><form:input path="sal" />
</td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="저 장" /></td>
</tr>
</table>
</form:form>
<a href="list">사원정보 리스트</a>
</center>
</body>
</html>