Spring 3/Hibernate

Spring & Hibernate example

Soul-Learner 2014. 9. 20. 23:34

스프링, 하이버네이트 연동(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>



jdbc.properties
jdbc.driverClassName=oracle.jdbc.OracleDriver
jdbc.dialect=org.hibernate.dialect.OracleDialect
jdbc.databaseurl=jdbc:oracle:thin:@127.0.0.1:1525:XE
jdbc.username=scott
jdbc.password=tiger


servlet-context.xml 
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
    <!-- Process annotations on registered beans like @Autowired... -->
    <context:annotation-config/>
    
    <!-- Enables the Spring MVC @Controller programming model -->
    <mvc:annotation-driven/>
    <context:component-scan base-package="org.kdea.java" />
    <context:component-scan base-package="org.kdea.service" />
    <context:component-scan base-package="org.kdea.hibernate" />
    <context:component-scan base-package="org.kdea.json" />

    <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
    <resources mapping="/resources/**" location="/resources/" />

    <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="suffix" value=".jsp" />
        <beans:property name="contentType" value="text/html; charset=UTF-8"/>
    </beans:bean>

<beans:bean id="messageSource" 
  class="org.springframework.context.support.ResourceBundleMessageSource">
    <beans:property name="basename" value="messages/messages"/> 
    </beans:bean>
    <beans:bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
 
    <beans:bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
        p:location="/WEB-INF/jdbc.properties" /> 
 
    <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="${jdbc.username}"/>
   <beans:property name="password" value="tiger"/>
    </beans:bean>  

    <beans:bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<beans:property name="dataSource">
    <beans:ref bean="dataSource"/>
</beans:property>
<beans:property name="annotatedClasses">    
        <beans:list>    
        <beans:value>org.kdea.hibernate.Emp</beans:value>    
        </beans:list>    
       </beans:property>   
       <beans:property name="hibernateProperties">  
  <beans:props>  
   <beans:prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</beans:prop>  
  </beans:props>  
       </beans:property>  
    </beans:bean>
    <beans:bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
   <beans:property name="sessionFactory" ref="sessionFactory"/>
    </beans:bean>
 
</beans:beans>



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>