# 用Jersey構建RESTful服務5--Jersey+MySQL5.6+Hibernate4.3
## 一、總體說明
本例運行演示了用Jersey構建RESTful服務中,如何同過Hibernate將數據持久化進MySQL的過程
## 二、環境
1. 上文的項目RestDemo
2. MySQL5.6下載[http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.16-win32.zip](http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.16-win32.zip)
3. Hibernate4.3.4下載[http://sourceforge.net/projects/hibernate/files/hibernate4/4.3.4.Final/hibernate-release-4.3.4.Final.zip](http://sourceforge.net/projects/hibernate/files/hibernate4/4.3.4.Final/hibernate-release-4.3.4.Final.zip)
4. Java程序連接MySQL的驅動mysql-connector-java-5.1.29-bin.jar下載 [http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.29.zip](http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.29.zip)
## 三、數據庫準備
1. 搭建MySQL數據庫
2. 創建數據庫RestDemo ,及數據表t_user,結構如下
```
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`userId` varchar(50) NOT NULL,
`userName` varchar(50) NOT NULL,
`age` varchar(50) NOT NULL,
PRIMARY KEY (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```

**PS:** userId 非自增長類型,需要在業務添加
## 四、引入Hibernate
1. 解壓Hibernate的包,在lib\required文件夾下所有jar引入進項目

2. 解壓mysql-connector-java-5.1.29.zip,將mysql-connector-java-5.1.29-bin.jar引入進項目
3. 在項目的根目錄創建hibernate的配置文件hibernate.cfg.xml,內容如下:
```
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://127.0.0.1:3306/RestDemo</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">update</property>
<mapping resource="com/waylau/rest/bean/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
```
4. 在項目User.java 的同個目錄下,創建該類的映射文件User.hbm.xml
```
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.waylau.rest.bean">
<class name="User" table="T_USER">
<id name="userId" column="USERID" type="string" >
<generator class="assigned"/>
</id>
<property name="userName" type="string" />
<property name="age" type="string" />
</class>
</hibernate-mapping>
```
5. 創建包com.waylau.rest.util,在該包下創建HibernateUtil.java
```
package com.waylau.rest.util;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
/**
* Hibernate 初始化配置工具類
* @author waylau.com
* 2014-3-23
*/
public class HibernateUtil {
private static Configuration configuration;
private static SessionFactory sessionFactory;
private static StandardServiceRegistry standardServiceRegistry;
static {
try {
//第一步:讀取Hibernate的配置文件 hibernamte.cfg.xml文件
configuration = new Configuration().configure("hibernate.cfg.xml");
//第二步:創建服務注冊構建器對象,通過配置對象中加載所有的配置信息
StandardServiceRegistryBuilder sb = new StandardServiceRegistryBuilder();
sb.applySettings(configuration.getProperties());
//創建注冊服務
standardServiceRegistry = sb.build();
//第三步:創建會話工廠
sessionFactory = configuration.buildSessionFactory(standardServiceRegistry);
} catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
```
6. 在項目中建com.waylau.rest.dao包,在該包下建立User操作的接口UserDao.java
```
package com.waylau.rest.dao;
import java.util.List;
import com.waylau.rest.bean.User;
/**
* User Dao 接口
* @author waylau.com
* 2014-3-18
*/
public interface UserDao {
public User getUserById(String id);
public boolean deleteUserById(String id);
public boolean createUser(User user);
public boolean updateUser(User user);
public List<User> getAllUsers();
}
```
7. 在項目中建com.waylau.rest.dao.impl包,在該包下建立User操作接口的實現UserDaoImpl.java
```
package com.waylau.rest.dao.impl;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import com.waylau.rest.bean.User;
import com.waylau.rest.dao.UserDao;
import com.waylau.rest.util.HibernateUtil;
/**
* 用戶DAO實現
* @author waylau.com
* 2014-3-23
*/
public class UserDaoImpl implements UserDao {
@Override
public User getUserById(String id) {
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session s = null;
Transaction t = null;
User user = null;
try{
s = sessionFactory.openSession();
t = s.beginTransaction();
String hql = "from User where userId="+id;
Query query = s.createQuery(hql);
user = (User) query.uniqueResult();
t.commit();
}catch(Exception err){
t.rollback();
err.printStackTrace();
}finally{
s.close();
}
return user;
}
@Override
public boolean deleteUserById(String id) {
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session s = null;
Transaction t = null;
boolean flag = false;
try{
s = sessionFactory.openSession();
t = s.beginTransaction();
User user = new User();
user.setUserId(id);
s.delete(user);
t.commit();
flag = true;
}catch(Exception err){
t.rollback();
err.printStackTrace();
}finally{
s.close();
}
return flag;
}
@Override
public boolean createUser(User user) {
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session s = null;
Transaction t = null;
boolean flag = false;
try{
s = sessionFactory.openSession();
t = s.beginTransaction();
s.save(user);
t.commit();
flag = true;
}catch(Exception err){
t.rollback();
err.printStackTrace();
}finally{
s.close();
}
return flag;
}
@Override
public boolean updateUser(User user) {
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session s = null;
Transaction t = null;
boolean flag = false;
try{
s = sessionFactory.openSession();
t = s.beginTransaction();
s.update(user);
t.commit();
flag = true;
}catch(Exception err){
t.rollback();
err.printStackTrace();
}finally{
s.close();
}
return flag;
}
@Override
public List<User> getAllUsers() {
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session s = null;
Transaction t = null;
List<User> uesrs = null;
try{
s = sessionFactory.openSession();
t = s.beginTransaction();
String hql = "select * from t_user";
Query query = s.createSQLQuery(hql).addEntity(User.class);
query.setCacheable(true); // 設置緩存
uesrs = query.list();
t.commit();
}catch(Exception err){
t.rollback();
err.printStackTrace();
}finally{
s.close();
}
return uesrs;
}
}
```
8. 修改項目中 com.waylau.rest.resources包下的UserResource.java,使之前在內存中模擬CURD轉為在數據庫中實現
```
package com.waylau.rest.resources;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.Consumes;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import com.waylau.rest.bean.User;
import com.waylau.rest.dao.impl.UserDaoImpl;
/**
* 用戶資源
* @author waylau.com
* 2014-3-19
*/
@Path("/users")
public class UserResource {
private UserDaoImpl userDaoImpl = new UserDaoImpl();
/**
* 增加
* @param user
*/
@POST
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public void createUser(User user) {
userDaoImpl.createUser(user);
}
/**
* 刪除
* @param id
*/
@DELETE
@Path("{id}")
public void deleteUser(@PathParam("id")String id){
userDaoImpl.deleteUserById(id);
}
/**
* 修改
* @param user
*/
@PUT
@Consumes(MediaType.APPLICATION_XML)
public void updateUser(User user){
userDaoImpl.updateUser(user);
}
/**
* 根據id查詢
* @param id
* @return
*/
@GET
@Path("{id}")
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public User getUserById(@PathParam("id") String id){
User u = userDaoImpl.getUserById(id);
return u;
}
/**
* 查詢所有
* @return
*/
@GET
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public List<User> getAllUsers(){
List<User> users = new ArrayList<User>();
users = userDaoImpl.getAllUsers();
return users;
}
}
```
## 五、運行
1. 將服務端運行后
2. 運行UserClient客戶端,可以看到數據庫已經實現增刪改查
完整項目架構如下:

**本章源碼**:[https://github.com/waylau/RestDemo/tree/master/jersey-demo5-mysql-hibernate](https://github.com/waylau/RestDemo/tree/master/jersey-demo5-mysql-hibernate)
- 用Jersey構建RESTful服務
- 用Jersey構建RESTful服務1--HelloWorld
- 用Jersey構建RESTful服務2--JAVA對象轉成XML輸出
- 用Jersey構建RESTful服務3--JAVA對象轉成JSON輸出
- 用Jersey構建RESTful服務4--通過jersey-client客戶端調用Jersey的Web服務模擬CURD
- 用Jersey構建RESTful服務5--Jersey+MySQL5.6+Hibernate4.3
- 用Jersey構建RESTful服務6--Jersey+SQLServer+Hibernate4.3
- 用Jersey構建RESTful服務7--Jersey+SQLServer+Hibernate4.3+Spring3.2
- 用Jersey構建RESTful服務8--Jersey+SQLServer+Hibernate4.3+Spring3.2+jquery
- 用Jersey構建RESTful服務9--Jersey+SQLServer+Hibernate4.3+Spring3.2+AngularJS
- 用 Jersey 2 和 Spring 4 構建 RESTful web service