Khi làm việc với các project thì việc kết nối DB là không tránh khỏi. Có nhiều cách để app có thể giao tiếp vs DB và cũng tùy thuộc và dạng app mà bạn làm việc. Với JEE, bạn có nhiều cách như Spring Data JPA, Hibernate. Nổi tiếng và thông dụng nhất vẫn là Hibernate, tuy nhiên nếu bạn thích một kiểu giao tiếp mới DB ngoài Hibernate thì MyBatis là 1 lựa chọn không tồi.

 

PERSISTENCE FRAMEWORK

Là một tầng giữa trung gian hỗ trợ và tự động hóa việc giao tiếp giữa app và DB. Nó hoạt động như một lớp trừu tượng giữa app và DB, có thể gọi là cầu nối. Những framework phổ biến thường là kiểu ORM (object-relational mapping), map object trong app với dữ liệu trong DB. Khái niệm mapping có thể là kiểu XML hay các thẻ annotation metadata.

 

Một số framework dạng này nổi tiếng là Hibernate, iBatis, ...

 

MYBATIS

MyBatis là một framework giao tiếp với DB dạng persistence, bao gồm 1 cặp object và các store procedure đi kèm hoặc các mệnh đề SQL sử dụng kiểu định nghĩa XML. Nó là một phiên bản khác dựa trên iBatis.

 

MYBATIS CÓ GÌ HAY?

  • Không hoàn toàn giống như ORM framework, mybatis không map object java trực tiếp với các table trong DB mà map các method java trong object đó với các mệnh đề SQL được định nghĩa dạng XML.
  • mybatis hỗ trợ  và cho phép chúng ta sử dụng và khai thác hết tất cả các tính năng của DB như store procedure, view. truy vấn, hay các tính năng đặc biệt của loại DB đó cung cấp. Như vậy chúng ta có viết bất kỳ kiểu SQL chúng ta thích và hoàn toàn làm chủ được các truy vấn đó. Hibernate cũng làm được điều này nhưng chúng ta phải custom chúng một khác biệt so với ý tưởng của nó.
  • mybatis code đơn giản hơn và gần giống JDBC, các cấu truy vấn trực quan và dễ tìm kiếm
  • Cung cấp một cơ chế mapping, map kết quả SQL vào các đối tượng đầu ra thông qua việc định nghĩa tham số.
  • Các mệnh đề SQL được xây dựng trên cơ sở XML gần gũi
  • Có khả năng tích hợp mạnh với Spring thông qua mybatis-spring (sẽ nói sau).
  • mybatis hỗ trợ việc cache dữ liệu, khi một câu truy vấn được thực thi, các dữ liệu cần thiết sẽ được đưa vào cache và app sẽ get từ cache chứ không đánh thẳng vào DB.

MYBATIS vs HIBERNATE

Để có cái nhìn rõ hơn về 2 framework này. Chúng ta sẽ trường hợp với các dữ liệu phức tạp. Các giao tiếp chủ yếu của app với DB là:

1. CUD (create, update, delete) đối tượng phức tạp

2. R (retrieve), lấy dữ liệu (các truy vấn summation/aggregation)

  • Hibernate làm tốt trường hợp 1, cho phép chúng ta chỉ cần tạo 1 POJO object và thực hiện persist/update nó rất nhanh và dễ.
  • Mybatis là rất tuyệt vời cho trường hợp 2 với các query lớn và phức tạp. Hibernate sẽ cố gắng tải toàn bộ đối tượng và nếu không muốn, bạn sẽ cần phải bắt đầu điều chỉnh các truy vấn (bằng Lazy Loading) khi muốn làm việc với 1 object lớn. Hibernate chỉ cung cấp SQLQuery và bean Transformers trong trường hợp này với các kiểu dữ liệu lớn như BigDecimal. Trong khi đó, mybatis có thể dễ dàng map với 1 POJO object dạng non-entity và chúng ta có thể kiểm soát những gì chúng ta cần lấy thay vì load hết tất cả.

 

SỬ DỤNG

Các mệnh đề SQL trong mybatis có thể được định nghĩa bằng XML file hay thông qua annotation. Ta lấy 1 ví dụ BlogMapper để phân biệt các trường hợp.

 

1. Kiểu java annotation

package org.mybatis.example;
 
public interface BlogMapper {
    @Select("select * from Blog where id = #{id}")
    Blog selectBlog(int id);
}

Sau khi định nghĩa như trên thì ta gọi nó như sau:

BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);

 

2. Kiểu XML file

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<mapper namespace="org.mybatis.example.BlogMapper">
    <select id="selectBlog" parameterType="int" resultType="Blog">
        select * from Blog where id = #{id}
    </select>
</mapper>

Với kiểu này thì ta gọi như sau:

Blog blog = session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);

 

TÍCH HỢP VỚI SPRING

Cái này quan trọng, mybatis hỗ trợ tích hợp vào spring và các module của nó sẽ hoạt động như các spring transaction. mybatis sẽ build các mapper, session và chèn chúng vào các bean trong spring.

 

Đầu tiên, thêm dependency vào pom.xml

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>x.x.x</version>
</dependency>

 

Dưới đây là ví dụ cấu hình XML để build các mapper và chèn chúng vào bean có tên là BlogService

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
</bean>
 
<bean id="blogMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="sqlSessionFactory" ref="sqlSessionFactory" />
    <property name="mapperInterface" value="org.mybatis.example.BlogMapper" />
</bean>
 
<bean id="blogService" class="org.mybatis.example.BlogServiceImpl">
    <property name="blogMapper" ref="blogMapper" />
</bean>

 

Sau đó thì implement bean đó trên java:

public class BlogServiceImpl implements BlogService {
 
    private BlogMapper blogMapper;
 
    public void setBlogMapper(BlogMapper blogMapper) {
        this.blogMapper = blogMapper;
    }
 
    public void doSomethingWithABlog(int blogId) {
        Blog blog = blogMapper.selectBlog(blogId);
        ...
    }
}

 

Như vậy là ta đã định nghĩa 1 bean trong Blog service, thông qua Blog mapper để thực hiện việc giao tiếp vs Blog trong DB. Các giao tiếp khác hoàn toàn tượng tự. Quan trọng là nắm việc sử dụng bean trong spring và định nghĩa mapper cho mybatis.

 

Việc định nghĩa các mapper cũng có thể được sinh tự động qua các công cụ sinh mã mapper tự động. Tuy nhiên, nó chỉ hỗ trợ ta phần nào trong việc đình nghĩa các CRUD (create, retrieve, update, delete) thôi. Tìm hiểu thêm tại: http://mybatis.github.io/generator

 

SỰ HỖ TRỢ TỪ THƯ VIỆN MYBATIS-SPRING

Mybatis-Spring hỗ trợ tích hợp mybatis liền mạch với spring. Thư viện này cho phép mybatis giao tiếp với spring transaction, giúp build các mapper và session, chèn chúng vào các bean.

 

Tại sao lại có mybatis-spring?

Theo như thông báo từ cộng đồng phát triển mybatis, spring 2 chỉ hỗ trợ ibatis 2. Sau đó, họ đã cố gắng để mybatis 3 hỗ trợ spring 3. Tuy nhiên không may là spring 3 đã được phát hành trước khi mybatis 3 kịp cho release, họ không muốn đợi đội ngũ phát triển của mybatis. Vì vậy, cộng đồng mybatis đã quyết định xây dựng thư viện này để độc lập việc phát triển của 2 bên, thư viện này đơn giản là hỗ trợ tích hợp mybatis vào spring.

 

Theo mình, sẽ hay hơn nếu chúng ta sử dụng thư viện này với spring và nó cung cấp nhiều hỗ trợ hơn so với mybatis nguyên bản. Chi tiết thông tin về thư viện này có thể tham khảo ở đây: http://mybatis.github.io/spring/

 

SAMPLE CODE

Xem tại link: https://mybatis.github.io/spring/sample.html

 

LỜI KẾT

Sau blog này, có thể chúng ta sẽ tiếp tuc sử dụng Hibernate trên Spring vì những lợi ích và sự dễ dàng mà nó mang lại. Hibernate vẫn là framework tốt cho các project JEE. Tuy nhiên, hãy xem mybatis là sự lựa chọn mới và hấp dẫn khi muốn xử lý thô và phức tạp trên các mệnh đề truy vấn SQL, mybatis sẽ thể hiện sức mạnh của nó.


Leave a Comment

Fields with * are required.