IT Research Department @BKAP 2015 Page [1/20] Lab 11 Java Persistence API Mục tiêu - Sử dụng JPA với Java Application - Sử dụng JPA với EJB - JPA Queries Phần I Bài tập step by step
Trang 1IT Research Department @BKAP 2015 Page [1/20]
Lab 11
Java Persistence API
Mục tiêu
- Sử dụng JPA với Java Application
- Sử dụng JPA với EJB
- JPA Queries
Phần I Bài tập step by step
Bài 1.1:
Mục tiêu:
- Xây dựng Java Application
- Sử dụng Database service do Netbeans cung cấp
- Dùng JPA để thao tác với CSDL
STEP 1
Tạo CSDL PlayerDB với Java DB tích hợp sẵn trong Netbeans
Mở Service Tab -> Mở rộng Databases -> Chọn Java DB -> Start Server
Trên Output Console: kết nối tới Java DB server ở cổng 1527
Tạo CSDL PlayerDB
Java DB -> Create Database
Trang 2Password: 123456
Để connect tới CSDL PlayerDB: chọn jdbc:derby://localhost:1527/PlayerDB -> Connect
Đi kèm với bài thực hành này là file sql playerDB.sql để tạo tables và data
File -> Open File -> Browser to playerDB.sql
Trang 3IT Research Department @BKAP 2015 Page [3/20]
File playerDB.sql sẽ tự động mở ra với SQL Editor
Ở scroll box Connection -> Chọn jdbc:derby://localhost:1527/PlayerDB[root on ROOT] -> Run SQL
Câu lệnh SQL được thực hiện và tạo ra 2 table: Player và Team
ROOT -> Tables -> Player -> View Data
ROOT -> Tables -> Team -> View Data
Để xem dữ liệu của 2 bảng này
STEP 2
Với mỗi table trong CSDL chúng ta sẽ tạo ra các Entity class tương ứng để có thể sử dụng JPA
Trang 4File -> New Project -> Java -> Java Application -> JPAFirstExample -> Bỏ chọn Create Main Class -> Finish
Tạo các Entity Class:
New -> Entity Class from Database
Database Connection chọn: jdbc:derby://locahost:1527/PlayerDB[root on ROOT]
Chọn Add All để add cả 2 tables -> Next
Trang 5IT Research Department @BKAP 2015 Page [5/20]
Trang 6Ở package chọn entity -> Next -> Ở cửa sổ Mapping Options -> Chọn Finish
Mở package entity, sẽ có 2 classes được tạo ra: Player và Team
Mở thư mục META-INF sẽ thấy file persistence.xml chứa configuration của persistence unit
<?xml version="1.0" encoding="UTF-8"?>
<persistence version = "2.1" xmlns = "http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name = "JPAFirstExamplePU"
transaction-type = "RESOURCE_LOCAL">
<provider> org.eclipse.persistence.jpa.PersistenceProvider </provider> <class> entity.Player </class>
<class> entity.Team </class>
<properties>
<property name = "javax.persistence.jdbc.url"
value = "jdbc:derby://localhost:1527/PlayerDB"/>
<property name = "javax.persistence.jdbc.user" value = "root"/>
<property name = "javax.persistence.jdbc.driver"
value = "org.apache.derby.jdbc.ClientDriver"/>
Trang 7IT Research Department @BKAP 2015 Page [7/20]
<property name = "javax.persistence.jdbc.password" value = "123456"/>
</properties>
</persistence-unit>
</persistence>
Chúng ta cần chú ý, tên của persistence unit này là JPAFirstExamplePU
STEP 3
Tạo main class để test với persistence unit đã tạo
New -> Java Class -> Test
Tạo main method, trong hàm main, chúng ta sẽ sử dụng EntityManager để thực hiện thao tác với CSDL
package entity;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
Trang 8public class Test {
public static void main(String[] args) {
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("JPAFirstExamplePU" );
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Player p1 = new Player();
p1.setId(5);
p1.setFirstname( "Ian" );
p1.setJerseynumber(30);
p1.setLastname( "Thorpe" );
p1.setLastspokenwords( "I am in the best form" );
em.persist(p1);
Player p2 = new Player();
p2.setId(6);
p2.setFirstname( "Deigo" );
p2.setJerseynumber(40);
p2.setLastname( "Maradona" );
p2.setLastspokenwords( "I will be back" );
em.persist(p2);
em.getTransaction().commit();
em.close();
emf.close();
}
}
em.persist() sẽ thực hiện add thêm 2 bản ghi vào CSDL
Trước khi chạy ứng dụng, cần thêm library của Java DB
Libraries -> Add Library -> Java DB Driver
Trang 9IT Research Department @BKAP 2015 Page [9/20]
Build và Run project
Mở Service Tab -> View data của table Player -> Xác nhận CSDL đã thêm 2 bản ghi mới
Bài 1.2
Mục tiêu:
- Sử dụng JPA với Java EE Application
STEP 1
File -> New Project -> Java Web -> Web Application -> BookStore
Trang 10Chọn Glassfish -> Next -> Không chọn Frameworks -> Finish
STEP 2
Tạo CSDL BookStore giống bài trước dùng Database Server Java DB
Trang 11IT Research Department @BKAP 2015 Page [11/20]
Chọn jdbc:derby://localhost:1527/BOOKSTORE[root on ROOT] -> Connect -> Execute Command
Paste câu lệnh SQL sau:
CREATE TABLE BOOKS (
ID INTEGER NOT NULL Primary key GENERATED ALWAYS AS IDENTITY ( START WITH 1, INCREMENT BY 1),
BOOKNAME VARCHAR (255),
SIGNINGDATE DATE
);
INSERT INTO BOOKS ( BOOKNAME , SIGNINGDATE ) VALUES ( 'Harry Potter' , '2012-01-10' );
INSERT INTO BOOKS ( BOOKNAME , SIGNINGDATE ) VALUES ( 'Howl Castle' , '2011-10-10' );
Tạo ra bảng BOOKS và 2 bản ghi
STEP 3
New -> Entity Classes from Database
Data Source -> New Data Source
Name: jdbc/BookStore
Connection: jdbc:derby://localhost:1527/BookStore[root on ROOT]
Trang 13IT Research Department @BKAP 2015 Page [13/20]
Trang 14Class Books.java được tạo ra trong package entity của ứng dụng
Mở persistence.xml trong Configuration Files
<?xml version="1.0" encoding="UTF-8"?>
<persistence version = "2.1" xmlns = "http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name = "BookStorePU" transaction-type = "JTA">
<jta-data-source> jdbc/BookStore </jta-data-source>
<exclude-unlisted-classes> false </exclude-unlisted-classes>
<properties/>
</persistence-unit>
</persistence>
Tạo JDBC Resource tên jdbc/BookStore trên GlashFish server, sử dụng connection pool DerbyDB
STEP 4
Các thao tác với CSDL sẽ được thực hiện bởi một session bean
New -> Java EE -> Session Bean -> BooksDAO
package ejb;
import entity.Books;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
@Stateless
public class BooksDAO {
// Injected database connection:
@PersistenceContext
private EntityManager em ;
Trang 15IT Research Department @BKAP 2015 Page [15/20]
// Stores a new book:
public void persist(Books book) {
em persist(book);
}
// Retrieves all the books:
public List<Books> getAllGuests() {
TypedQuery<Books> query = em createQuery(
"SELECT g FROM Books g ORDER BY g.id" , Books class );
return query.getResultList();
}
}
Annotation @PersistenceContext sẽ tạo ra một instance của class EntityManager chứa persistence unit BookStorePU đã tạo ra ở STEP 3
STEP 5
Tạo BookServlet
New -> Servlet: BookServlet
Trang 17IT Research Department @BKAP 2015 Page [17/20]
package ejb;
import entity.Books;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
/**
*
* @author ThanDieu
*/
@ WebServlet(name = "BookServlet" , urlPatterns = { "/BookServlet" })
public class BookServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
// Injected DAO EJB:
@EJB
BooksDAO booksDao ;
@Override
protected void doGet(
HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Display the list of guests:
request.setAttribute( "books" , booksDao getAllBooks());
Trang 18request.getRequestDispatcher( "/book.jsp" ).forward(request, response); }
@Override
protected void doPost(
HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Handle a new guest:
String name = request.getParameter( "name" );
Books books = new Books();
books.setBookname(name);
books.setSigningdate( new Date());
if (name != null )
booksDao persist(books);
// Display the list of guests:
doGet(request, response);
}
}
Chúng ta thực hiện inject EJB BooksDAO vào servlet bằng annotation @EJB
STEP 6
Tạo trang book.jsp chứa form nhập và hiển thị các bản ghi có trong CSDL
<%@page import = entity.Books " %>
<%@page import = java.util.List " %>
<%@page contentType = "text/html" pageEncoding = "UTF-8" %>
<!DOCTYPE html>
Trang 19IT Research Department @BKAP 2015 Page [19/20]
<html>
<head>
<meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8">
<title>BookStore</title>
</head>
<body>
<form method = "POST" action = "BookServlet" >
Name: <input type = "text" name = "name" />
<input type = "submit" value = "Add" />
</form>
<hr><ol> <%
@SuppressWarnings ( "unchecked" )
List<Books> books = (List<Books>)request.getAttribute ( "books" );
if ( books != null) {
for (Books book : books) { %>
<li> <%= book %> </li> <%
}
} %>
</ol><hr>
</body>
</html>
Build và Chạy project được kết quả như sau:
Trang 20PHẦN 2: BÀI TẬP LÀM THÊM
Hãy tạo thêm bảng mới Readers cho BookStore: readerID, firstName, lastName, address Tạo ReadersDAO cho phép thêm mới, getAll và xoá readers từ CSDL Nhập ID để xoá và hiển thị tất cả các dữ liệu có trong bảng ra
HẾT