Trong bài viết trước, mình đã giới thiệu với các bạn về Database Connector để kết nối và thao tác với nhiều loại database trong ứng dụng Mule ESB. Bất tiện khi sử dụng Database Connector này là chúng ta phải sử dụng Native Query, mỗi loại database thì chúng ta phải có câu query có cú pháp phù hợp với loại database đó. Để giải quyết vấn đề này, chúng ta có thể sử dụng JPA specification với implementation của Hibernate trong ứng dụng Mule ESB của chúng ta thông qua Mule JPA module. Cụ thể như thế nào? Trong bài viết này, mình sẽ hướng dẫn các bạn.
Đầu tiên, các bạn cần cài đặt Mule JPA module vào Anypoint Studio trước nhé! Xem hướng dẫn ở bài viết này.
Bây giờ, mình sẽ tạo mới một Mule project để làm ví dụ:
Mule Flow của chúng ta sẽ có nội dung như sau:
Trong đó:
- HTTP Listener Connector Endpoint: dùng để tạo 1 request URL cho client có thể request tới ứng dụng Mule ESB của chúng ta và lấy tất cả thông tin của những sinh viên có tên được truyền trong request parameter.
- Java Peristence API Endpoint: dùng để kết nối và thao tác với database.
- Object to JSON Transformer Endpoint: transformer này dùng để convert kết quả từ database sang chuỗi JSON và trả kết quả về cho client.
Endpoint Object to JSON Transformer chúng ta không cần phải cấu hình gì cả.
Cấu hình HTTP Listener Connector
HTTP Listener Connector được cấu hình như sau:
General Settings:
Bạn nào chưa biết cách cấu hình HTTP Listener Connector thì có thể tham khảo bài viết này nhé!
Request URL trong ví dụ này sẽ có dạng như sau:
http://localhost:8081/jpa/student?name=Khanh
Cấu hình Java Persistence API
Trước khi đi vào phần cấu hình cho Mule JPA module, chúng ta cần chuẩn bị một số thứ trước đã.
- Đầu tiên là định nghĩa database structure để lưu thông tin của sinh viên và định nghĩa entity cho nó.
Để đơn giản, trong ví dụ này, mình chỉ định nghĩa một table chứa thông tin sinh viên với 2 cột như sau:
1 2 3 4 5 |
CREATE TABLE `student` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1; |
Entity của table student có nội dung như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
package com.huongdanjava.muleesbjpa.entity; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Table(name ="student") @Entity public class Student implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue private Long id; @Column private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + "]"; } } |
- Tiếp theo, để làm việc với JPA với implementation của Hibernate, chúng ta cần thêm dependencies của chúng.
Các bạn hãy mở tập tin pom.xml và thêm những dependencies sau:
Hibernate
1 2 3 4 5 6 7 8 9 10 11 |
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>4.3.11.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>4.3.11.Final</version> </dependency> |
MySQL Connector
1 2 3 4 5 |
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>6.0.6</version> </dependency> |
Lúc này, các bạn sẽ thấy trong Referenced Libraries có 2 phiên bản của thư viện Hibernate JPA API: 2.0 và 2.1.
Phiên bản 2.0 được include bởi mule-module-jpa library còn 2.1 thì được include bởi Hibernate. Để tránh bị conflict, các bạn nên exclude một phiên bản đi. Ở đây, mình sẽ exclude phiên bản 2.0 từ thư viện mule-module-jpa:
1 2 3 4 5 6 7 8 9 10 11 |
<dependency> <groupId>org.mule.modules</groupId> <artifactId>mule-module-jpa</artifactId> <version>1.2.0</version> <exclusions> <exclusion> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.0-api</artifactId> </exclusion> </exclusions> </dependency> |
- Để làm việc với JPA, chúng ta cần phải có tập tin cấu hình cho nó.
Các bạn hãy tạo mới tập tin persistence.xml nằm trong thư mục /src/main/resources/META-INF
Nội dung của tập tin này có thể là như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <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="mulePU" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <class>com.huongdanjava.muleesbjpa.entity.Student</class> <exclude-unlisted-classes /> <properties> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.format_sql" value="false" /> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" /> <property name="hibernate.connection.driver_class" value="com.mysql.cj.jdbc.Driver" /> <property name="javax.persistence.validation.mode" value="none" /> </properties> </persistence-unit> </persistence> |
Tuỳ nhu cầu của các bạn, hãy chỉnh sửa cho phù hợp.
- Bước cuối cùng của việc chuẩn bị đó là chúng ta sẽ khai báo đối tượng EntityManagerFactory trong Spring container.
Đây là bước nhất định phải có vì xí nữa, các bạn sẽ dùng nó để cấu hình nó cho Mule JPA module.
Ở đây, mình tạo mới tập tin spring.xml nằm trong thư mục /src/main/resources và khai báo đối tượng EntityManagerFactory như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/muleesb_jpa" /> <property name="username" value="root" /> <property name="password" value="123456" /> </bean> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="persistenceUnitName" value="mulePU" /> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> </property> </bean> </beans> |
Và đưa nó vào tập tin Mule Flow mule-esb-jpa.xml của chúng ta:
1 2 3 |
<spring:beans> <spring:import resource="classpath:spring.xml" /> </spring:beans> |
OK, vậy là chúng ta đã hoàn thành việc chuẩn bị rồi đó các bạn, giờ sẽ là lúc chúng ta cấu hình cho Mule JPA module thôi!
Phần cấu hình của Mule JPA module có nội dung như sau:
Như các bạn thấy, ở đây chúng ta có 2 phần cần phải cấu hình cho Mule JPA module:
- Thứ nhất là phần Config Reference.
Phần này nếu các bạn nhấp vào dấu cộng ở bên cạnh drop-down menu, các bạn sẽ thấy cửa sổ sau:
Ở đây, các bạn có thể thấy, chúng ta cần cấu hình Entity Manager Factory Reference, đây chính là cấu hình trỏ tới đối tượng EntityManagerFactory mà chúng ta đã khai báo nó trong Spring container đó các bạn. Các bạn hãy điền vào id của đối tượng EntityManagerFactory như sau:
- Phần thứ hai chính là phần cấu hình Operation mà chúng ta muốn thực thi.
Ở đây, chúng ta có các Operation như sau:
Trong ví dụ này, mình sẽ chọn Operation là Query. Lúc này, phần General của mình sẽ như sau:
Chúng ta có nhiều field để cấu hình:
- Criteria Reference
- Named Query
- Statement
- Query Parameters Reference.
Ở đây, mình sẽ khai báo trực tiếp câu SQL trong phần ô Statement để tìm tất cả những sinh viên theo tên sinh viên:
1 |
FROM Student student WHERE student.name = :name |
Trong ô Query Parameters Reference, chúng ta sẽ cấu hình một đối tượng Map object chứa một key “name” và phần value sẽ là tên sinh viên mà chúng ta muốn tìm. Cấu hình của mình như sau:
Ở đây, mình lấy request parameter từ inboundProperties của Mule Message luôn. Nó là một đối tượng Map nên mình không cần phải chuyển đổi gì cả.
…
OK, vậy là mình đã hoàn thành việc cấu hình cho Mule Flow của mình.
Giả sử database có nội dung như sau:
Thì khi chạy ví dụ của chúng ta, kết quả sẽ như sau:
Một lưu ý là để ứng dụng của chúng ta khi chạy có thể kết nối tới MySQL database hoặc một hệ thống database nào khác, các bạn phải copy JDBC Driver dependency của nó vào thư mục mule/lib/boot trong thư mục cài đặt của Mule Runtime Server. Nếu các bạn chạy trên Anypoint Studio thì có thể trong phần Run Configuration của ứng dụng, chọn tab Classpath, chọn Bootstrap Entries rồi chọn Add External JARs…, chọn đến file .jar của JDBC Driver dependency.
Của mình như sau: