Tạo RESTful Web Service trong Java với Jersey và Oracle
Đăng lúc: 10:41 AM - 24/11/2023 bởi Charles Chung - 2084Trong bài này tôi sẽ hướng dẫn các bạn tạo ứng dụng RESTful Web Service sử dụng thư viện Jersey trong Eclipse. CRUD với Database Oracle sử dụng Hibernate

Chuẩn bị dữ liệu
- Tạo cơ sở dữ liệu "bkap" trong Oracle
- Tạo bảng "students" trong bkap database
- Code SQL tham khảo
Create table Students
(
studentid varchar2(10),
fullname nvarchar2(100),
gender number(1,0),
birthday date,
email varchar2(100),
phone varchar2(100),
address nvarchar2(200),
active number(1,0),
primary key(studentid)
);
insert into Students values('B001',N'Nguyễn Thanh Nam',1,to_date('15/07/2000','dd/MM/yyyy'),'namnt@gmail.com','0912344543',N'Hà Nội',1);
insert into Students values('B002',N'Nguyễn Thanh Tùng',1,to_date('20/01/2000','dd/MM/yyyy'),'tungnt@gmail.com','0955346633',N'Hà Nội',1);
insert into Students values('B003',N'Hoàng Hải Hữu',1,to_date('16/04/2001','dd/MM/yyyy'),'haihh@gmail.com','03456687878',N'Hà Giang',1);
insert into Students values('B004',N'Lê Thu Thủy',0,to_date('12/05/1998','dd/MM/yyyy'),'thuylt@gmail.com','0932435465',N'Hà Nội',1);
insert into Students values('B005',N'Nguyễn Văn Long',1,to_date('23/01/2002','dd/MM/yyyy'),'longnv@gmail.com','0895675565',N'Ninh Bình',1);
insert into Students values('B006',N'Trần Mỹ Linh',0,to_date('28/02/2000','dd/MM/yyyy'),'linhtm@gmail.com','0337688576',N'Quảng Ninh',1);
Tạo ứng dụng RESTful Webservice
Bước 1: Tạo Dynamic Web Project (xem chi tiết bài Phát triển ứng dụng RESTful Web Service trong Java với thư viện Jersey )
- Khởi động Eclispe IDE -> vào menu File -> New -> Dynamic Web Project -> Nhập tên "RestfulWebServiceJerseyOracle"
- Tiêp tục kích vào Next -> Next -> Chọn Generate web.xml deyployment desciptor
Bước 2: Convert sang Maven Project
- Kích chuột phải vào Project vừa tạo -> Configure -> Convert to Maven Project -> Finish
Bước 3: Khai báo các Maven Dependencies cần thiết
- Mở file pom.xml và cấu hình các Maven Dependencies gồm: jersey server, gson, hibernate, oracle, jaxb api
<dependencies>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.26.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc10 -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc10</artifactId>
<version>19.20.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-server -->
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.9</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
</dependencies>
Bước 4: Cấu hình ứng dụng Jersey Servlet
- Mở tệp web.xml và cấu hình vào bên trong thẻ <web-app> như sau:
<!-- khai báo servlet container -->
<servlet>
<servlet-name>jerseyServlet</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>bkap.services</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>jerseyServlet</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
Bước 5: Tạo các package và các class theo cấu trúc sau
- Tệp cấu hình hibernate.cfg.xml (cấu hình kết nối cơ sở dữ liệu oracle và hibernate)
<?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>
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:bkap</property>
<property name="hibernate.connection.password">1234$</property>
<property name="hibernate.connection.username">system</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.dialect">org.hibernate.dialect.Oracle12cDialect</property>
<mapping class="bkap.entities.Student" />
</session-factory>
</hibernate-configuration>
- Tạo lớp bkap.entities\Student.java (entity maped với bảng students trong database)
package bkap.entities;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
@Table(name = "students")
public class Student implements Serializable {
// @Id
// @GeneratedValue(strategy = GenerationType.IDENTITY) //mã tự động tăng
// private int studentId;
@Id
private String studentId;
private String fullName;
private int gender;
@Temporal(TemporalType.DATE)
private Date birthDay;
private String email;
private String phone;
private String address;
private int active;
public Student() {
}
public Student(String studentId, String fullName, int gender, Date birthDay, String email, String phone,
String address, int active) {
super();
this.studentId = studentId;
this.fullName = fullName;
this.gender = gender;
this.birthDay = birthDay;
this.email = email;
this.phone = phone;
this.address = address;
this.active = active;
}
public String getStudentId() {
return studentId;
}
public void setStudentId(String studentId) {
this.studentId = studentId;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
public Date getBirthDay() {
return birthDay;
}
public void setBirthDay(Date birthDay) {
this.birthDay = birthDay;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getActive() {
return active;
}
public void setActive(int active) {
this.active = active;
}
}
- Tạo lớp bkap.entities\Result.java (entity chứa thông báo trả về cho client)
package bkap.entities;
public class Result {
private int code;
private String message;
public Result(int code, String message) {
super();
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
- Tạo lớp bkap.dao\HibernateUtil.java (đọc thông tin cấu hình trong tệp hibernate.cfg.xml và tạo sessionfactory)
package bkap.dao;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
public static SessionFactory getSessionFactory() {
SessionFactory sf = new Configuration().configure().buildSessionFactory();
return sf;
}
}
- Tạo lớp bkap.dao\StudentDAO.java (xử lý các nghiệp vụ CRUD với database)
package bkap.dao;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import bkap.entities.Student;
public class StudentDAO {
SessionFactory sf = HibernateUtil.getSessionFactory();
public List<Student> getAll() {
Session session = sf.openSession();
List<Student> data = new ArrayList<>();
Query query = session.createQuery("from Student");
data = query.getResultList();
session.close();
return data;
}
public List<Student> search(String name) {
Session session = sf.openSession();
List<Student> data = new ArrayList<>();
Query query = session.createQuery("from Student where fullName like :name").setParameter("name", "%" + name +"%");
data = query.getResultList();
session.close();
return data;
}
public Student getById(String studentId) {
Session session = sf.openSession();
Student student = session.get(Student.class, studentId);
session.close();
return student;
}
public void insert(Student st) {
Session session = sf.openSession();
session.beginTransaction();
session.save(st);
session.getTransaction().commit();
session.close();
}
public void update(Student st) {
Session session = sf.openSession();
session.beginTransaction();
session.update(st);
session.getTransaction().commit();
session.close();
}
public Student delete(String studentId) {
Session session = sf.openSession();
session.beginTransaction();
Student student = session.get(Student.class, studentId);
if (student != null) {
session.remove(student);
session.getTransaction().commit();
}
session.close();
return student;
}
}
- Tạo lớp bkap.services\StudentService.java (restfule webservice)
package bkap.services;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import com.google.gson.Gson;
import bkap.dao.StudentDAO;
import bkap.entities.Result;
import bkap.entities.Student;
@Path("/students")
public class StudentService {
StudentDAO dao = new StudentDAO();
@GET
@Path("/")
@Produces(MediaType.APPLICATION_JSON)
public String getStudents() {
var gson = new GsonBuilder().setDateFormat("dd/MM/yyyy").create();
return gson.toJson(dao.getAll());
}
@GET
@Path("/search/{name}")
@Produces(MediaType.APPLICATION_JSON)
public String search(@PathParam("name") String name) {
var gson = new GsonBuilder().setDateFormat("dd/MM/yyyy").create();
return gson.toJson(dao.search(name));
}
@GET
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
public String getStudent(@PathParam("id") String id) {
var gson = new GsonBuilder().setDateFormat("dd/MM/yyyy").create();
return gson.toJson(dao.getById(id));
}
@POST
@Path("/")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public String post(String student) {
var gson = new GsonBuilder().setDateFormat("dd/MM/yyyy").create();
Student st = gson.fromJson(student, Student.class);
dao.insert(st);
return gson.toJson(new Result(200, "Thêm thành công"));
}
@PUT
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public String update(@PathParam("id") String id, String student) {
var gson = new GsonBuilder().setDateFormat("dd/MM/yyyy").create();
var st = gson.fromJson(student, Student.class);
if (st.getStudentId().equals(id)) {
dao.update(st);
return gson.toJson(new Result(200, "Sửa thành công"));
} else {
return gson.toJson(new Result(404, "Mã số không khớp"));
}
}
@DELETE
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
public String delete(@PathParam("id") String id) {
var gson = new Gson();
if(dao.delete(id)!=null)
return gson.toJson(new Result(200, "Xóa thành công"));
else
return gson.toJson(new Result(404, "Mã số không tồn tại"));
}
}
Bước 6: Run application
- Kích chuột phải vào project chọn Run As -> Run on Server -> Tomcat v9.0
- Mở phần mềm Postman để test
GET:
GET:/{id}
POST:
PUT:/{id}
DELETE:/{id}
Video demo
Link download source code bài viết Tạo RESTful Web Service trong Java với Jersey và Oracle
thay lời cảm ơn!
Các bài cũ hơn
- Phát triển ứng dụng RESTful Web Service trong Java với thư viện Jersey (12:52 PM - 22/11/2023)
- Tổng hợp các câu hỏi phỏng vấn về Spring Core-Spring MVC (09:36 AM - 21/11/2023)
- Microservices sử dụng ASP.NET Core 6 và Deploy với Docker (08:41 AM - 20/11/2023)
- Đọc thông tin Metadata Attribute của Controller và Action trong ASP.NET Core 6 sử dụng Reflection (08:35 AM - 15/11/2023)
- Ghi nhật ký truy cập Action-Controller trong ASP.NET Core 6 sử dụng ActionFilterAttribute (10:36 PM - 14/11/2023)