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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

一、总体说明

本例运行演示了用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;

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

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
监控 关系型数据库 MySQL
深入了解MySQL主从复制:构建高效稳定的数据同步架构
深入了解MySQL主从复制:构建高效稳定的数据同步架构
166 1
|
2月前
|
关系型数据库 MySQL PHP
PHP与MySQL的无缝集成:构建动态网站的艺术####
本文将深入探讨PHP与MySQL如何携手合作,为开发者提供一套强大的工具集,以构建高效、动态且用户友好的网站。不同于传统的摘要概述,本文将以一个生动的案例引入,逐步揭示两者结合的魅力所在,最终展示如何通过简单几步实现数据驱动的Web应用开发。 ####
|
2月前
|
JSON 关系型数据库 测试技术
使用Python和Flask构建RESTful API服务
使用Python和Flask构建RESTful API服务
122 2
|
2月前
|
关系型数据库 MySQL Linux
Linux系统如何设置自启动服务在MySQL数据库启动后执行?
【10月更文挑战第25天】Linux系统如何设置自启动服务在MySQL数据库启动后执行?
198 3
|
2月前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
251 2
|
2月前
|
关系型数据库 MySQL PHP
PHP与MySQL的深度整合:构建高效动态网站####
在当今这个数据驱动的时代,掌握如何高效地从数据库中检索和操作数据是至关重要的。本文将深入探讨PHP与MySQL的深度整合方法,揭示它们如何协同工作以优化数据处理流程,提升网站性能和用户体验。我们将通过实例分析、技巧分享和最佳实践指导,帮助你构建出既高效又可靠的动态网站。无论你是初学者还是有经验的开发者,都能从中获得宝贵的见解和实用的技能。 ####
31 0
|
3月前
|
关系型数据库 MySQL 数据库
vertx 的http服务表单提交与mysql验证
本文介绍了如何使用Vert.x处理HTTP服务中的表单提交,并通过集成MySQL数据库进行验证,包括项目依赖配置、表单HTML代码和完整的Vert.x服务代码。
41 2
|
4月前
|
Go API 开发者
深入探讨:使用Go语言构建高性能RESTful API服务
在本文中,我们将探索Go语言在构建高效、可靠的RESTful API服务中的独特优势。通过实际案例分析,我们将展示Go如何通过其并发模型、简洁的语法和内置的http包,成为现代后端服务开发的有力工具。
|
4月前
|
SQL JavaScript 关系型数据库
Node服务连接Mysql数据库
本文介绍了如何在Node服务中连接MySQL数据库,并实现心跳包连接机制。
61 0
Node服务连接Mysql数据库
|
5月前
|
API Java Python
API的神秘面纱:从零开始构建你的RESTful服务
【8月更文挑战第31天】在现代网络应用开发中,RESTful API已成为数据交互的标准。本文通过比较流行的技术栈(如Node.js、Python的Django和Flask、Java的Spring Boot)及其框架,帮助你理解构建RESTful API的关键差异,涵盖性能、可扩展性、开发效率、社区支持、安全性和维护性等方面,并提供示例代码和最佳实践,指导你选择最适合项目需求的工具,构建高效、安全且易维护的API服务。
69 0

热门文章

最新文章