使用RESTful Jersey框架搭建WebService,Hibernate框架访问数据库,MySQL存储数据

时间:2023-01-23 07:25:39

现在访问服务器数据的方式有很多种,主要有两种一个是通过JDBC连接数据库,访问数据库(直接访问),一种是通过将方法发布成服务通过wsdl或者客户端访问WebService(间接访问).本文就通过一种使用很方便地WebService框架Jersey,使用Hibernate框架访问数据库,Hibernate是轻量级框架,基本不需要写JDBC代码虽然Hibernate最后的实现使用的也是JDBC,SQL语句直接调用提供的方法会自动创建数据表或者更新数据表结构,为快速开发服务提供了方便,使用非常轻便的MySQL数据库存储数据。也在网上找了很多使用访问WebService的比较多但是通过这种方式访问数据库的还是比较少,自己主要在弄IOS,想通过WebService不需要直接连接到MySQL只需要使用连接字符串访问发布的方法。这样只需要在DAO层也就是数据访问层使用调用Webserve方法获得数据。下面有一个创建Jersey的样例,英文版的,也是官方的样例,很实用,特此分享。Jersey创建创建完Jersey只需要将DAO层的代码替换成Hibernate调用代码。下面是项目的一个展示:

使用RESTful Jersey框架搭建WebService,Hibernate框架访问数据库,MySQL存储数据
使用RESTful Jersey框架搭建WebService,Hibernate框架访问数据库,MySQL存储数据
BaseDAO.java代码
package com.hnu.hibernate.dao;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Session;

import com.hnu.hibernate.util.HibernateUtil;
public class BaseDAO<T> {
/**
* 插入数据
*
* @param object
*/
public int create(T object) {

Session session = HibernateUtil.getSessionFactory().openSession();

try {
session.beginTransaction();

session.persist(object);

session.getTransaction().commit();

} catch (Exception e) {
session.getTransaction().rollback();
return 1;
} finally {
session.close();
}
return 0;
}

/**
* 更新数据库
*
* @param object
*/
public int update(T object) {

Session session = HibernateUtil.getSessionFactory().openSession();
try {
session.beginTransaction();
session.update(object);
session.getTransaction().commit();
} catch (Exception e) {
session.getTransaction().rollback();
return 1;
} finally {
session.close();
}
return 0;
}

/**
* 从数据库中删除
*
* @param object
*/
public int delete(T object) {

Session session = HibernateUtil.getSessionFactory().openSession();

try {
session.beginTransaction();
session.delete(object);
session.getTransaction().commit();
} catch (Exception e) {
session.getTransaction().rollback();
return 1;
} finally {
session.close();
}
return 0;
}

/**
* 查找单个Entity Bean
*
* @param clazz
* @param id
* @return
*/
@SuppressWarnings("unchecked")
public T find(Class<? extends T> clazz, Serializable id) {

Session session = HibernateUtil.getSessionFactory().openSession();
try {
session.beginTransaction();
return (T) session.get(clazz, id);
} finally {
session.getTransaction().commit();
session.close();
}
}

/**
* 查找多个Entity Bean
*
* @param hql
* @return
*/
@SuppressWarnings("unchecked")
public List<T> list(String hql) {

Session session = HibernateUtil.getSessionFactory().openSession();
try {
session.beginTransaction();
return session.createQuery(hql).list();
} finally {
session.getTransaction().commit();
session.close();
}
}
}
HibernateUtil.java类
package com.hnu.hibernate.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;
}
}
hibernate.cfg.xml Hibernate配置文件
<?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">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>

<session-factory>
<property name="hbm2ddl.auto">update</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="connection.url">jdbc:mysql://localhost:3306/vocabularyadaptivetestingsystem?characterEncoding=UTF-8</property>
<property name="connection.username">root</property>
<property name="connection.password">123</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="show_sql">true</property>

<property name="current_session_context_class">thread</property>
<mapping class="com.hnu.hibernate.bean.FifthA"/>
<mapping class="com.hnu.hibernate.bean.FifthB"/>
<mapping class="com.hnu.hibernate.bean.FifthC"/>
<mapping class="com.hnu.hibernate.bean.FirstA"/>
<mapping class="com.hnu.hibernate.bean.FirstB"/>
<mapping class="com.hnu.hibernate.bean.FourthA"/>
<mapping class="com.hnu.hibernate.bean.FourthB"/>
<mapping class="com.hnu.hibernate.bean.FourthC"/>
<mapping class="com.hnu.hibernate.bean.Result"/>
<mapping class="com.hnu.hibernate.bean.SecondA"/>
<mapping class="com.hnu.hibernate.bean.SecondB"/>
<mapping class="com.hnu.hibernate.bean.Student"/>
<mapping class="com.hnu.hibernate.bean.ThirdA"/>
<mapping class="com.hnu.hibernate.bean.ThirdB"/>
</session-factory>

</hibernate-configuration>
本文使用了Annotation方式实现JPA,将JavaBean对象和数据库对象对应起来,下面只列举一个类,其他类都是类似的。
Student.java类
package com.hnu.hibernate.bean;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.OneToMany;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
@Entity
@Table(name="student")
public class Student {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer userid;

@Column(name="username")
private String username;

@Column(name="password")
private String password;

@Column(name="realname")
private String realname;

@Column(name="age")
private Integer age;

@Column(name="nationality")
private String nationality;

@Column(name="language")
private String language;

@Column(name="year")
private float year;

@Column(name="studyabroadschool")
private String studyabroadschool;

public Integer getUserid() {
return userid;
}

public void setUserid(Integer userid) {
this.userid = userid;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String getRealname() {
return realname;
}

public void setRealname(String realname) {
this.realname = realname;
}

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}

public String getNationality() {
return nationality;
}

public void setNationality(String nationality) {
this.nationality = nationality;
}

public String getLanguage() {
return language;
}

public void setLanguage(String language) {
this.language = language;
}

public float getYear() {
return year;
}

public void setYear(float year) {
this.year = year;
}

public String getStudyabroadschool() {
return studyabroadschool;
}

public void setStudyabroadschool(String studyabroadschool) {
this.studyabroadschool = studyabroadschool;
}
}

WebService中的实体类中需要使用
@XmlRootElement
标签,Hibernate需要将Java类和数据库表对应起来。
StudentsResource.java是Student类的WebService类的实现,本文主要使用XML作为输入,XML作为输出,这种方式在网上很少见的,这也是很通用的做法,一般情况,是在连接字符串末尾添加?键值对的方法,XML方式主要讲输入的内容拼接成XML字符串然后将内容添加到Http Body里面传到服务中。 StudentsResource.java类
package com.hnu.hibernate.resources;

import java.util.List;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

import org.hibernate.Session;
import javax.ws.rs.PUT;
import com.hnu.hibernate.dao.BaseDAO;
import com.hnu.hibernate.util.HibernateUtil;
import com.hnu.hibernate.bean.*;

@Consumes("application/xml")
@Path("students")
public class StudentsResource {
private static BaseDAO<Student> baseDAO = new BaseDAO<Student>();
@POST
@Path("create")
@Produces("text/html")
@Consumes("application/xml")
public String create(Student model) {
return String.format("%d", baseDAO.create(model));
}

@POST
@Path("remove")
@Produces("text/html")
@Consumes("application/xml")
public String remove(Student model) {
return String.format("%d", baseDAO.delete(model));
}

@POST
@Path("modify")
@Produces("text/html")
@Consumes("application/xml")
public String modify(Student model) {
return String.format("%d", baseDAO.update(model));
}

@GET
@Path("findAll")
public List<Student> findAll() {
return baseDAO.list(" from Student ");
}

@POST
@Path("findById")
@Consumes("application/xml")
public Student findById(Student model) {
return baseDAO.find(Student.class, model.getUserid());
}

@POST
@Path("findByUseridAndPassword")
@Consumes("application/xml")
@Produces("application/xml")
public Student findByUseridAndPassword(Student model) {
Session session = HibernateUtil.getSessionFactory().openSession();
Student student=null;
try {
session.beginTransaction();
student= (Student)session.createQuery("select s from Student s where s.username='"+model.getUsername()+"' and s.password='"+model.getPassword()+"'").uniqueResult();
session.getTransaction().commit();
}catch (Exception e) {
session.getTransaction().rollback();

} finally {

session.close();
}
return student;
}

@POST
@Path("findByUsernameAndRealnameAndStudyabroadschool")
@Consumes("application/xml")
@Produces("application/xml")
public Student findByUsernameAndRealnameAndStudyabroadschool(Student model) {
Session session = HibernateUtil.getSessionFactory().openSession();
Student student=null;
try {
session.beginTransaction();
student= (Student)session.createQuery("select s from Student s where s.username='"+model.getUsername()+"' and s.realname='"+model.getRealname()+"' and s.studyabroadschool='"+model.getStudyabroadschool()+"'").uniqueResult();
session.getTransaction().commit();
}catch (Exception e) {
session.getTransaction().rollback();
return null;
} finally {

session.close();
}
return student;
}

@POST
@Path("modifyUserPasswordByUserid")
@Produces("application/xml")
@Consumes("application/xml")
public String modifyUserPasswordByUserid(Student model) {
Session session = HibernateUtil.getSessionFactory().openSession();
try {
session.beginTransaction();
//先查询到该对象
Student student=(Student)session.get(Student.class, model.getUserid());
student.setPassword(model.getPassword());
session.update(student);
session.getTransaction().commit();
} catch (Exception e) {
session.getTransaction().rollback();
return "1";
} finally {
session.close();
}
return "0";
}
}
这个类也是通过上面样例的方式添加进去的,本文主要的特色是在DAO中添加了Hibernate的方法调用数据库,一般本地访问时,只需要在DAO部分调用对应的方法就可以了,因为要发布成服务,所以可以在服务器端调用数据库。
log4j.properties
log4j.rootLogger=ERROR, stdout

log4j.category.org.hibernate.tool.hbm2ddl =DEBUG, file
log4j.category.org.hibernate.SQL =DEBUG, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n

log4j.appender.file = org.apache.log4j.FileAppender
log4j.appender.file.File = log.txt
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=Hibernate: %m%n
最后Run AS一下项目文件就可以将服务发布到Tomcat上去了。至此所有的代码部分都已经贴出来了,在使用Jersery开发过程中出现了许多问题,比如Hibernate的HibernateSession类总是出现不能实例化的问题,这个问题主要是Hibernate的版本问题,Hibernate从4.1以后使用HibernateSession和之前的方式有所不同,不需要配置XML方式或者Annotation方式的那部分代码。网上东西虽然很多,但是个性化的实现很难找到,需要不断尝试。希望本文对有这方面问题的朋友有帮助!!