用Jersey构建RESTful服务5--Jersey+MySQL5.6+Hibernate4.3

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

一、总体说明

本例运行演示了用Jersey构建RESTful服务中,如何同过Hibernate将数据持久化进MySQL的过程

二、环境

1.上文的项目RestDemo

2.MySQL5.6下载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

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

三、数据库准备

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;
2e2eb9389b504fc2df5cfca4e7dde71190ef6d0b

PS: userId 非自增长类型,需要在业务添加

四、引入Hibernate

1.解压Hibernate的包,在lib\required文件夹下所有jar引入进项目

a8ec8a13632762d04648e81ea2ec08fa513dc619

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客户端,可以看到数据库已经实现增删改查

完整项目架构如下:

42166d224f4a20a4f4a58f6692529822730ed0dc

本章源码https://github.com/waylau/RestDemo/tree/master/jersey-demo5-mysql-hibernate

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
10天前
|
关系型数据库 MySQL Apache
mysql5.7 本地计算机上的mysql 服务启动后停止 的问题解决
mysql5.7 本地计算机上的mysql 服务启动后停止 的问题解决
10 0
|
19天前
|
存储 Java 关系型数据库
社区医院管理服务系统【GUI/Swing+MySQL】(Java课设)
社区医院管理服务系统【GUI/Swing+MySQL】(Java课设)
24 1
|
1月前
|
JSON API 数据库
解释如何在 Python 中实现 Web 服务(RESTful API)。
解释如何在 Python 中实现 Web 服务(RESTful API)。
25 0
|
1月前
|
弹性计算 关系型数据库 MySQL
阿里云ECS使用docker搭建mysql服务
阿里云ECS使用docker搭建mysql服务
152 1
|
17天前
|
前端开发 Java API
构建RESTful API:Java中的RESTful服务开发
【4月更文挑战第3天】本文介绍了在Java环境中构建RESTful API的重要性及方法。遵循REST原则,利用HTTP方法处理资源,实现CRUD操作。在Java中,常用框架如Spring MVC简化了RESTful服务开发,包括定义资源、设计表示层、实现CRUD、考虑安全性、文档和测试。通过Spring MVC示例展示了创建RESTful服务的步骤,强调了其在现代Web服务开发中的关键角色,有助于提升互操作性和用户体验。
构建RESTful API:Java中的RESTful服务开发
|
23天前
|
安全 API 开发者
构建高效可扩展的RESTful API服务
在数字化转型的浪潮中,构建一个高效、可扩展且易于维护的后端API服务是企业竞争力的关键。本文将深入探讨如何利用现代后端技术栈实现RESTful API服务的优化,包括代码结构设计、性能调优、安全性强化以及微服务架构的应用。我们将通过实践案例分析,揭示后端开发的最佳实践,帮助开发者提升系统的响应速度和处理能力,同时确保服务的高可用性和安全。
25 3
|
25天前
|
关系型数据库 MySQL 数据库
使用Docker搭建MySQL数据库服务
本文介绍了如何使用Docker搭建MySQL数据库服务。首先,通过`docker pull mysql:5.7`命令拉取MySQL 5.7镜像,然后运行`docker run`命令创建并启动容器。接着,使用`docker exec`进入容器并创建MySQL用户及授权。最后,通过MySQL客户端如Navicat测试连接,验证安装成功。Docker简化了MySQL的部署和管理,确保环境一致性。
37 0
|
1月前
|
NoSQL 关系型数据库 MySQL
Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)
Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)
196 0
|
1月前
|
XML JSON API
通过Flask框架创建灵活的、可扩展的Web Restful API服务
通过Flask框架创建灵活的、可扩展的Web Restful API服务
|
2月前
|
XML JSON Java
基于springMVC的RESTful服务实现
  RESTful(RESTful Web Services)一种架构风格,表述性状态转移,它不是一个软件,也不是一个标准,而是一种思想,不依赖于任何通信协议,但是开发时要成功映射到某协议时也需要遵循其标准,但不包含对通信协议的更改
21 1