Spring 3.0 MVC with Hibernate 3.0 CRUD Example
In
this example show how to write a simple web based application with
CRUD operation using Spring3 MVC Framwork with Hibernate3 using
Annotation, which can handle CRUD inside its controllers. To start with
it, let us have working STS IDE in place and follow the following steps
to develop a Dynamic Form based Web Application using Spring Web Framework:
Step 1: Create a Database DAVDB on MySql Database and also we create Employee table on this database.
Step 2: Create a database.properties for database configuration information in the resources folder under src folder in the created project.
Step 3: Create a Dynamic Web Project with a name Spring3HibernateApp and create packages com.dineshonjava.controller, com.dineshonjava.bean, com.dineshonjava.dao, com.dineshonjava.service, com.dineshonjava.model under the src folder in the created project.
Step 4: Add below mentioned Spring 3.0 and Hibernate 3.0 related libraries and other libraries into the folder WebRoot/WEB-INF/lib.
Step 5: Create a Java class EmployeeController, EmployeeBean, Employee, EmployeeDao, EmployeeDaoImpl, EmployeeService, EmployeeServiceImpl under the respective packages..Step 1: Create a Database DAVDB on MySql Database and also we create Employee table on this database.
- CREATE TABLE Employee(
- EMPID INT NOT NULL AUTO_INCREMENT,
- EMPNAME VARCHAR(20) NOT NULL,
- EMPAGE INT NOT NULL,
- SALARY BIGINT NOT NULL,
- ADDRESS VARCHAR(20) NOT NULL
- PRIMARY KEY (ID)
- );
Step 2: Create a database.properties for database configuration information in the resources folder under src folder in the created project.
- database.driver=com.mysql.jdbc.Driver
- database.url=jdbc:mysql://localhost:3306/DAVDB
- database.user=root
- database.password=root
- hibernate.dialect=org.hibernate.dialect.MySQLDialect
- hibernate.show_sql=true
- hibernate.hbm2ddl.auto=update
Step 3: Create a Dynamic Web Project with a name Spring3HibernateApp and create packages com.dineshonjava.controller, com.dineshonjava.bean, com.dineshonjava.dao, com.dineshonjava.service, com.dineshonjava.model under the src folder in the created project.
Step 4: Add below mentioned Spring 3.0 and Hibernate 3.0 related libraries and other libraries into the folder WebRoot/WEB-INF/lib.

Step 6: Create Spring configuration files web.xml and sdnext-servlet.xml under the WebRoot/WEB-INF/ and WebRoot/WEB-INF/config folders.
Step 7: Create a sub-folder with a name views under the WebRoot/WEB-INF folder. Create a view file addEmployee.jsp, employeesList.jsp and index.jsp under this sub-folder.
Step 8: The final step is to create the content of all the source and configuration files name sdnext-servlet.xml under the sub-folder /WebRoot/WEB-INF/config and export the application as explained below.

Application Architecture
We will have a layered architecture for our demo application. The database will be accessed by a Data Access layer popularly called as DAO Layer. This layer will use Hibernate API to interact with database. The DAO layer will be invoked by a service layer. In our application we will have a Service interface called EmployeeService.
EmployeeBean.java
- package com.dineshonjava.bean;
- /**
- * @author Mallikarjun
- *
- */
- public class EmployeeBean {
- private Integer id;
- private String name;
- private Integer age;
- private Long salary;
- private String address;
- public Long getSalary() {
- return salary;
- }
- public void setSalary(Long salary) {
- this.salary = salary;
- }
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Integer getAge() {
- return age;
- }
- public void setAge(Integer age) {
- this.age = age;
- }
- public String getAddress() {
- return address;
- }
- public void setAddress(String address) {
- this.address = address;
- }
- }
- package com.dineshonjava.model;
- import java.io.Serializable;
- import javax.persistence.Column;
- import javax.persistence.Entity;
- import javax.persistence.GeneratedValue;
- import javax.persistence.GenerationType;
- import javax.persistence.Id;
- import javax.persistence.Table;
- @Entity
- @Table(name="Employee")
- public class Employee implements Serializable{
- private static final long serialVersionUID = -723583058586873479L;
- @Id
- @GeneratedValue(strategy=GenerationType.AUTO)
- @Column(name = "empid")
- private Integer empId;
- @Column(name="empname")
- private String empName;
- @Column(name="empaddress")
- private String empAddress;
- @Column(name="salary")
- private Long salary;
- @Column(name="empAge")
- private Integer empAge;
- public Integer getEmpId() {
- return empId;
- }
- public void setEmpId(Integer empId) {
- this.empId = empId;
- }
- public String getEmpName() {
- return empName;
- }
- public void setEmpName(String empName) {
- this.empName = empName;
- }
- public String getEmpAddress() {
- return empAddress;
- }
- public void setEmpAddress(String empAddress) {
- this.empAddress = empAddress;
- }
- public Long getSalary() {
- return salary;
- }
- public void setSalary(Long salary) {
- this.salary = salary;
- }
- public Integer getEmpAge() {
- return empAge;
- }
- public void setEmpAge(Integer empAge) {
- this.empAge = empAge;
- }
- }
- package com.dineshonjava.dao;
- import java.util.List;
- import com.dineshonjava.model.Employee;
- public interface EmployeeDao {
- public void addEmployee(Employee employee);
- public List<Employee> listEmployeess();
- public Employee getEmployee(int empid);
- public void deleteEmployee(Employee employee);
- }
- package com.dineshonjava.dao;
- import java.util.List;
- import org.hibernate.SessionFactory;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Repository;
- import com.dineshonjava.model.Employee;
- @Repository("employeeDao")
- public class EmployeeDaoImpl implements EmployeeDao {
- @Autowired
- private SessionFactory sessionFactory;
- public void addEmployee(Employee employee) {
- sessionFactory.getCurrentSession().saveOrUpdate(employee);
- }
- @SuppressWarnings("unchecked")
- public List<Employee> listEmployeess() {
- return (List<Employee>) sessionFactory.getCurrentSession().createCriteria(Employee.class).list();
- }
- public Employee getEmployee(int empid) {
- return (Employee) sessionFactory.getCurrentSession().get(Employee.class, empid);
- }
- public void deleteEmployee(Employee employee) {
- sessionFactory.getCurrentSession().createQuery("DELETE FROM Employee WHERE empid = "+employee.getEmpId()).executeUpdate();
- }
- }<span style="color: #4c1130;"><b>
- </b></span>
- package com.dineshonjava.service;
- import java.util.List;
- import com.dineshonjava.model.Employee;
- public interface EmployeeService {
- public void addEmployee(Employee employee);
- public List<Employee> listEmployeess();
- public Employee getEmployee(int empid);
- public void deleteEmployee(Employee employee);
- }
- package com.dineshonjava.service;
- import java.util.List;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- import org.springframework.transaction.annotation.Propagation;
- import org.springframework.transaction.annotation.Transactional;
- import com.dineshonjava.dao.EmployeeDao;
- import com.dineshonjava.model.Employee;
- @Service("employeeService")
- @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
- public class EmployeeServiceImpl implements EmployeeService {
- @Autowired
- private EmployeeDao employeeDao;
- @Transactional(propagation = Propagation.REQUIRED, readOnly = false)
- public void addEmployee(Employee employee) {
- employeeDao.addEmployee(employee);
- }
- public List<Employee> listEmployeess() {
- return employeeDao.listEmployeess();
- }
- public Employee getEmployee(int empid) {
- return employeeDao.getEmployee(empid);
- }
- public void deleteEmployee(Employee employee) {
- employeeDao.deleteEmployee(employee);
- }
- }
- package com.dineshonjava.controller;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Controller;
- import org.springframework.validation.BindingResult;
- 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.servlet.ModelAndView;
- import com.dineshonjava.bean.EmployeeBean;
- import com.dineshonjava.model.Employee;
- import com.dineshonjava.service.EmployeeService;
- @Controller
- public class EmployeeController {
- @Autowired
- private EmployeeService employeeService;
- @RequestMapping(value = "/save", method = RequestMethod.POST)
- public ModelAndView saveEmployee(@ModelAttribute("command")EmployeeBean employeeBean,
- BindingResult result) {
- Employee employee = prepareModel(employeeBean);
- employeeService.addEmployee(employee);
- return new ModelAndView("redirect:/add.html");
- }
- @RequestMapping(value="/employees", method = RequestMethod.GET)
- public ModelAndView listEmployees() {
- Map<String Object> model = new HashMap<String Object>();
- model.put("employees", prepareListofBean(employeeService.listEmployeess()));
- return new ModelAndView("employeesList", model);
- }
- @RequestMapping(value = "/add", method = RequestMethod.GET)
- public ModelAndView addEmployee(@ModelAttribute("command")EmployeeBean employeeBean,
- BindingResult result) {
- Map<String, Object> model = new HashMap<String, Object>();
- model.put("employees", prepareListofBean(employeeService.listEmployeess()));
- return new ModelAndView("addEmployee", model);
- }
- @RequestMapping(value = "/index", method = RequestMethod.GET)
- public ModelAndView welcome() {
- return new ModelAndView("index");
- }
- @RequestMapping(value = "/delete", method = RequestMethod.GET)
- public ModelAndView editEmployee(@ModelAttribute("command")EmployeeBean employeeBean,
- BindingResult result) {
- employeeService.deleteEmployee(prepareModel(employeeBean));
- Map<String<b>,</b> Object> model = new HashMap<String, Object>();
- model.put("employee", null);
- model.put("employees", prepareListofBean(employeeService.listEmployeess()));
- return new ModelAndView("addEmployee", model);
- }
- @RequestMapping(value = "/edit", method = RequestMethod.GET)
- public ModelAndView deleteEmployee(@ModelAttribute("command")EmployeeBean employeeBean,
- BindingResult result) {
- Map<String, Object> model = new HashMap<String, Object>();
- model.put("employee", prepareEmployeeBean(employeeService.getEmployee(employeeBean.getId())));
- model.put("employees", prepareListofBean(employeeService.listEmployeess()));
- return new ModelAndView("addEmployee", model);
- }
- private Employee prepareModel(EmployeeBean employeeBean){
- Employee employee = new Employee();
- employee.setEmpAddress(employeeBean.getAddress());
- employee.setEmpAge(employeeBean.getAge());
- employee.setEmpName(employeeBean.getName());
- employee.setSalary(employeeBean.getSalary());
- employee.setEmpId(employeeBean.getId());
- employeeBean.setId(null);
- return employee;
- }
- private List<EmployeeBean> prepareListofBean(List<Employee> employees){
- List<employeebean> beans = null;
- if(employees != null && !employees.isEmpty()){
- beans = new ArrayList<EmployeeBean>();
- EmployeeBean bean = null;
- for(Employee employee : employees){
- bean = new EmployeeBean();
- bean.setName(employee.getEmpName());
- bean.setId(employee.getEmpId());
- bean.setAddress(employee.getEmpAddress());
- bean.setSalary(employee.getSalary());
- bean.setAge(employee.getEmpAge());
- beans.add(bean);
- }
- }
- return beans;
- }
- private EmployeeBean prepareEmployeeBean(Employee employee){
- EmployeeBean bean = new EmployeeBean();
- bean.setAddress(employee.getEmpAddress());
- bean.setAge(employee.getEmpAge());
- bean.setName(employee.getEmpName());
- bean.setSalary(employee.getSalary());
- bean.setId(employee.getEmpId());
- return bean;
- }
- }
- <web-app version="2.5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemalocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
- <servlet>
- <servlet-name>sdnext</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <init-param>
- <param-name>contextConfigLocation</param-name><param-value>/WEB-INF/config/sdnext-servlet.xml</param-value></init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>sdnext</servlet-name>
- <url-pattern>*.html</url-pattern>
- </servlet-mapping>
- <welcome-file-list>
- <welcome-file>index.html</welcome-file>
- </welcome-file-list>
- </web-app>
Spring Web configuration file sdnext-servlet.xml
- <beans xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemalocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.0.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
- <context:property-placeholder location="classpath:resources/database.properties">
- </context:property-placeholder>
- <context:component-scan base-package="com.dineshonjava">
- </context:component-scan>
- <tx:annotation-driven transaction-manager="hibernateTransactionManager">
- </tx:annotation-driven>
- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="jspViewResolver">
- <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
- <property name="prefix" value="/WEB-INF/views/"></property>
- <property name="suffix" value=".jsp"></property>
- </bean>
- <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">
- <property name="driverClassName" value="${database.driver}"></property>
- <property name="url" value="${database.url}"></property>
- <property name="username" value="${database.user}"></property>
- <property name="password" value="${database.password}"></property>
- </bean>
- <bean class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" id="sessionFactory">
- <property name="dataSource" ref="dataSource"></property>
- <property name="annotatedClasses">
- <list>
- <value>com.dineshonjava.model.Employee</value>
- </list>
- </property>
- <property name="hibernateProperties">
- <props>
- <prop key="hibernate.dialect">${hibernate.dialect}</prop>
- <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
- <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto} </prop>
- </props>
- </property>
- </bean>
- <bean class="org.springframework.orm.hibernate3.HibernateTransactionManager" id="hibernateTransactionManager">
- <property name="sessionFactory" ref="sessionFactory"></property>
- </bean>
- </beans>
- <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
- pageEncoding="ISO-8859-1"%>
- <%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
- <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
- <title>Spring MVC Form Handling</title>
- </head>
- <body>
- <h2>Add Employee Data</h2>
- <form:form method="POST" action="/sdnext/save.html">
- <table>
- <tr>
- <td><form:label path="id">Employee ID:</form:label></td>
- <td><form:input path="id" value="${employee.id}" readonly="true"/></td>
- </tr>
- <tr>
- <td><form:label path="name">Employee Name:</form:label></td>
- <td><form:input path="name" value="${employee.name}"/></td>
- </tr>
- <tr>
- <td><form:label path="age">Employee Age:</form:label></td>
- <td><form:input path="age" value="${employee.age}"/></td>
- </tr>
- <tr>
- <td><form:label path="salary">Employee Salary:</form:label></td>
- <td><form:input path="salary" value="${employee.salary}"/></td>
- </tr>
- <tr>
- <td><form:label path="address">Employee Address:</form:label></td>
- <td><form:input path="address" value="${employee.address}"/></td>
- </tr>
- <tr>
- <td colspan="2"><input type="submit" value="Submit"/></td>
- </tr>
- </table>
- </form:form>
- <c:if test="${!empty employees}">
- <h2>List Employees</h2>
- <table align="left" border="1">
- <tr>
- <th>Employee ID</th>
- <th>Employee Name</th>
- <th>Employee Age</th>
- <th>Employee Salary</th>
- <th>Employee Address</th>
- <th>Actions on Row</th>
- </tr>
- <c:forEach items="${employees}" var="employee">
- <tr>
- <td><c:out value="${employee.id}"/></td>
- <td><c:out value="${employee.name}"/></td>
- <td><c:out value="${employee.age}"/></td>
- <td><c:out value="${employee.salary}"/></td>
- <td><c:out value="${employee.address}"/></td>
- <td align="center"><a href="edit.html?id=${employee.id}">Edit</a> | <a href="delete.html?id=${employee.id}">Delete</a></td>
- </tr>
- </c:forEach>
- </table>
- </c:if>
- </body>
- </html>
- <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
- pageEncoding="ISO-8859-1"%>
- <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <title>All Employees</title>
- </head>
- <body>
- <h1>List Employees</h1>
- <h3><a href="add.html">Add More Employee</a></h3>
- <c:if test="${!empty employees}">
- <table align="left" border="1">
- <tr>
- <th>Employee ID</th>
- <th>Employee Name</th>
- <th>Employee Age</th>
- <th>Employee Salary</th>
- <th>Employee Address</th>
- </tr>
- <c:forEach items="${employees}" var="employee">
- <tr>
- <td><c:out value="${employee.id}"/></td>
- <td><c:out value="${employee.name}"/></td>
- <td><c:out value="${employee.age}"/></td>
- <td><c:out value="${employee.salary}"/></td>
- <td><c:out value="${employee.address}"/></td>
- </tr>
- </c:forEach>
- </table>
- </c:if>
- </body>
- </html>
- <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
- pageEncoding="ISO-8859-1"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
- <title>Spring3MVC with Hibernate3 CRUD Example using Annotations</title>
- </head>
- <body>
- <h2>Spring3MVC with Hibernate3 CRUD Example using Annotations</h2>
- <h2>1. <a href="employees.html">List of Employees</a></h2>
- <h2>2. <a href="add.html">Add Employee</a></h2>
- </body>
- </html>
Now start your Tomcat server and make sure you are able to access other web pages from webapps folder using a standard browser. Now try a URL http://localhost:8080/sdnext/ and you should see the following result if everything is fine with your Spring Web Application:




we click Edit button for fifth record of table the >>



Spring3HibernateApp.zip