Data Insert/Update Using RESTFul Web Service (Hibernate + Spring + Maven)
Data Insert/Update Using RESTFul Web Service (Hibernate + Spring + Maven)
Introduction
This document explains how to write a RESTFul web service. The example taken here
shows how to select,update and insert data in the database using Hibernate queries. The
project is built using eclipse with Spring framework and Maven.
Create pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>restful</groupId>
<artifactId>restful</artifactId>
<packaging>war</packaging>
<version>0.1</version>
<description>restful</description>
<repositories>
<repository>
<id>java.net</id>
<url>http://download.java.net/maven/2/</url>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.0.1</version>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.3.2.GA</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.10</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>20030825.184428</version>
</dependency>
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>20030825.183949</version>
</dependency>
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>1.1</version>
</dependency>
<!-- Jackson JSON Mapper -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>3.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
<version>1.1.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<properties>
<org.springframework.version>3.1.1.RELEASE</org.springframework.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
This should automatically start downloading maven jar files related to the
pom.xml entries. If not, then
1) right click on project from project explorer
2) select Run As -> Maven Install
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>restful</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
spring-servlet.xml
This file contains information about the dispatcher servlet which will run. It also has
references to
Database connection properties
Hibernate configuration
Message bundle (optional)
Below is how the file looks like.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:lang="http://www.springframework.org/schema/lang"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee.xsd
http://www.springframework.org/schema/lang
http://www.springframework.org/schema/lang/spring-lang.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:annotation-config />
<context:component-scan base-package="com.restful" />
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSourc
e">
<property name="basename" value="classpath:messages" />
<property name="defaultEncoding" value="UTF-8" />
</bean>
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="/WEB-INF/jdbc.properties" />
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close" p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.databaseurl}" p:username="${jdbc.username}"
p:password="${jdbc.password}" />
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation">
<value>/WEB-INF/hibernate-cfg.xml</value>
</property>
<property name="configurationClass">
<value>org.hibernate.cfg.AnnotationConfiguration</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${jdbc.dialect}</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<tx:annotation-driven />
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="passwordEncoder"
class="org.springframework.security.authentication.encoding.ShaPasswordEncoder"
/>
<bean id="jacksonMessageConverter"
class="org.springframework.http.converter.json.MappingJacksonHttpMessageConvert
er"></bean>
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAd
apter">
<property name="messageConverters">
<list>
<ref bean="jacksonMessageConverter" />
</list>
</property>
</bean>
<mvc:annotation-driven />
</beans>
jdbc.properties
This file contains information about database connection details.
jdbc.driverClassName= com.mysql.jdbc.Driver
jdbc.dialect=org.hibernate.dialect.MySQLDialect
jdbc.databaseurl=jdbc:mysql://localhost/DATADB
jdbc.username=test_user
jdbc.password=test_pwd
hibernate-cfg.xml
This file contains details about the hibernate framework configuration. Entity mappings
with session registry are found here.
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<mapping class="com.restful.Entity.UserEntity"/>
</session-factory>
</hibernate-configuration>
import
import
import
import
import
org.springframework.stereotype.Controller;
org.springframework.web.bind.annotation.RequestMapping;
org.springframework.web.bind.annotation.RequestMethod;
org.springframework.web.bind.annotation.RequestParam;
org.springframework.web.bind.annotation.ResponseBody;
import com.restful.Entity.UserEntity;
import com.restful.Service.UserDataService;
@Controller
public class RestFulController {
@Autowired
UserDataService userDataService;
@RequestMapping(value = "dataRetrieval", method = RequestMethod.GET)
public @ResponseBody
List<UserEntity> getDataFromDatabase(@RequestParam Map<String, String>
requestParams, HttpServletResponse response) {
response.setContentType("application/json");
response.setStatus(200);
return userDataService.getAllUsers();
}
@RequestMapping(value = "saveData", method = { RequestMethod.GET,
RequestMethod.POST })
public @ResponseBody
String saveDatatoDatabase(@RequestParam Map<String, String> requestParams,
HttpServletResponse response) {
String
String
String
String
id = requestParams.get("id");
firstName = requestParams.get("firstname");
lastName = requestParams.get("lastname");
emailAddress = requestParams.get("emailaddress");
id = requestParams.get("id");
firstName = requestParams.get("firstname");
lastName = requestParams.get("lastname");
emailAddress = requestParams.get("emailaddress");
user.setID(Integer.parseInt(id));
user.setFirstName(firstName);
user.setLastName(lastName);
user.setEmailAddress(emailAddress);
response.setContentType("application/json");
response.setStatus(200);
if (userDataService.findUserByEmail(emailAddress).equals("SUCCESS"))
{
userDataService.updateUserDetails(user);
return "Data Updated !";
} else {
return "Data Not Updated !";
}
}
javax.persistence.Column;
javax.persistence.Entity;
javax.persistence.Id;
javax.persistence.Table;
@Entity
@Table(name="USER")
public class UserEntity {
@Id
@Column(name="ID", nullable=false, length=5)
private int ID;
@Column(name="FNAME", nullable=false, length=50)
private String firstName;
@Column(name="LNAME", nullable=false, length=50)
private String lastName;
@Column(name="EMAIL", nullable=false, length=50)
private String emailAddress;
/**
* @return the iD
*/
public int getID() {
return ID;
}
/**
* @param iD the iD to set
*/
public void setID(int iD) {
ID = iD;
}
/**
* @return the firstName
*/
public String getFirstName() {
return firstName;
}
/**
* @param firstName the firstName to set
*/
public void setFirstName(String firstName) {
this.firstName = firstName;
}
/**
* @return the lastName
*/
public String getLastName() {
return lastName;
}
/**
* @param lastName the lastName to set
*/
public void setLastName(String lastName) {
this.lastName = lastName;
}
/**
* @return the emailAddress
*/
public String getEmailAddress() {
return emailAddress;
}
/**
* @param emailAddress the emailAddress to set
*/
public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
}
import com.restful.Entity.UserEntity;
public interface UserDataService {
public List<UserEntity> getAllUsers();
public void saveUserDetails(UserEntity user);
public void updateUserDetails(UserEntity user);
public String findUserByEmail(String emailAddress);
}
UserDataServiceImpl.java
package com.restful.Service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.restful.DAO.UserDAO;
import com.restful.Entity.UserEntity;
@Service
public class UserDataServiceImpl implements UserDataService {
@Autowired
UserDAO userDAO;
@Transactional
@Override
public List<UserEntity> getAllUsers() {
return this.userDAO.getAllUsers();
}
@Transactional
@Override
public void saveUserDetails(UserEntity user)
{
this.userDAO.saveUserData(user);
}
@Transactional
@Override
public void updateUserDetails(UserEntity user)
{
this.userDAO.updateUserData(user);
}
@Transactional
@Override
public String findUserByEmail(String emailAddress) {
List<UserEntity> userLst = null;
userLst = this.userDAO.findUserByEmailAddress(emailAddress);
return "FAILURE";
UserDAOImpl.java
package com.restful.DAO;
import java.util.List;
import
import
import
import
org.hibernate.SessionFactory;
org.springframework.beans.factory.annotation.Autowired;
org.springframework.stereotype.Component;
org.hibernate.Query;
import com.restful.Entity.UserEntity;
@Component("UserDAO")
public class UserDAOImpl implements UserDAO {
@Autowired
private SessionFactory sessionFactory;
@SuppressWarnings("unchecked")
@Override
public List<UserEntity> getAllUsers() {
return userList;
Project Structure