MyBatis – Chim nhỏ nhưng làm được lâu!

1926

Bài viết được sự cho phép của tác giả Kiên Nguyễn

1. MyBatis là gì?. Con chim ngáo ngơ này là gì?.

Nhìn logo thôi cũng thấy con chim này nóng tính vcl. Bé tẹo tèo teo nhưng thực ra võ nghệ đầy mình.

MyBatis là một persistence framework mã nguồn mở. Được tạo ra nhằm đơn giản hóa việc kết nối đến CSDL của JDBC. Ngoài ra nó còn cung cấp các API để giúp việc thao tác với Database được dễ dàng hơn.

Tất nhiên, để hiểu được về MyBatis, các bạn cần có một chút kiến thức về JDBC (Java Database Conectivity), hãy tham khảo bài viết này.

  Mybatis separator – tiện lợi và nguy hiểm
  Cài đặt MySQL Community Server trên macOS

2. Những ưu điểm nổi bật.

2.1 Viết code JDBC ít đi.

Thật sự đây là một trong những điểm mình thích nhất ở MyBatis. Nhớ trước đây làm 3 dựa án convert từ Database từ Oracle sang Postgres. Mở đống source sử dụng JDBC toàn cộng chuỗi String bằng “+”, nhìn vào thôi là chả muốn cơm nước gì nữa. Dự án như là cực hình, phải thật cố gắng mới kết thúc dự án được (rất may không lỗ).

JDBC-cong-chuoi-stringSử dụng “+” để tạo chuỗi String query, nỗi ám ảnh một thời của lập trình viên.

Trớ trêu thay, việc Concat String kiểu này lại chỉ là nỗi ám ảnh cho người maintanance code, chứ người phát triển dự án từ đâu lại không có vấn đề gì =))).

2.2 Dễ hiểu, dễ sử dụng.

Một khi đã nắm chắc kiến thức về SQL và Java, rất dễ dàng để sử dụng MyBatis. Ngoài một lượng lớn document, chỉ có một số ít kiến thức mới cần phải học thêm.

Có rất nhiều tài liệu viết về MyBatis rất dễ đọc.

2.3 Dễ tích hợp cho Spring và Guice framework

Mặc dù các dự án Spring thường được “đính kèm” sử dụng với Hibernate. Tuy nhiên, cả Eclipse và IntelliJ đều hỗ trợ cài đặt con chim ngáo ngơ như là một plugin. Không jar, không file download, rất tiện. Ngoài ra, việc thay đổi giữa các phiên bản cũng không quá khó khăn.

MyBatis install trên IntelliJ tương đối dễ dàng.Cài đặt MyBatis trên IntelliJ cũng như Eclipse tương đối dễ dàng.

2.4 Hiệu năng truy vấn cao (High perfomance)

Với cơ chế cache và polling connectionMyBatis cho hiệu năng truy vấn cao hơn hẳn so với JDBC. Tuy nhiên, khi thực hiện Select ở lần đầu tiên, JDBC vẫn chưa hề tìm ra đối thủ, nó chỉ hụt hơn do lần nào SELECT cũng phải gọi tới Database, tất nhiên không thể bằng lấy kết quả từ cache.

“Con chim của chúng ta” xem ra thực sự vượt trội khi thực hiện update và delete nhiều record.

Hiệu năng chính là vấn đề chính chúng ta tìm hiểu ở bài viết này. Có 3 yếu tố làm tăng perfomance, chi tiết sẽ có ngày sâu đây.

3. Performance (hiệu năng).

Vậy tại sao sử dụng mybatis lại làm tăng hiệu suất của hệ thống?. Có 3 yếu tố ảnh hưởng trực tiếp:

3.1 Hỗ trợ connection polling.

Đối với các biện chưa biết về polling có thể tham khảo thêm bài viết về http polling và connection pool. Bình thường mỗi request yêu cầu mở kết nối tới database sẽ được tạo connection riêng. Khi sử dụng Mybatis, với cơ chế polling (sau khi một kết nối được tạo và sử dụng xong nó sẽ không đóng lại mà sẽ duy trì trong connection pool để dùng lại cho lần sau và chỉ thực sự bị đóng khi hết thời gian timeout). Chính việc sử dụng polling đã giảm bớt đáng kể chi phí khởi tạo connection, qua đó tăng perfomance của application.

mybatis sử dụng cơ chế polling để tiết kiệm chi phí khởi tạo kết nối tới database.Mybatis sử dụng cơ chế polling để tiết kiệm chi phí khởi tạo kết nối tới database.
<environments default = "development">
<environment id = "development">
<transactionManager type = "JDBC"/> 
<dataSource type = "POOLED">
<property name = "driver" value = "com.mysql.jdbc.Driver"/>
<property name = "url" value = "jdbc:mysql://localhost:3306/details"/>
<property name = "username" value = "root"/>
<property name = "password" value = "password"/>
</dataSource> 
</environment>
</environments>

Cấu hình polling trong MyBatis tương đối đơn giản. Kiểu của dataSource chỉ cần thiết lập type = “POOLED”.

3.2 Sử dụng cache cho query trùng lặp.

Cùng xem xét ví dụ sau đây:

public static void main(String[] args) throws IOException {
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User firstSelectWithCache = mapper.selectByIdWithCache(216);
System.out.println("first query with cache:" + firstSelectWithCache.getUserName());
User secondSelectWithCache = mapper.selectByIdWithCache(216);
System.out.println("second query with cache:" + secondSelectWithCache.getUserName());
sqlSession.commit();
} catch (PersistenceException e) {
e.printStackTrace();
} finally {
sqlSession.close();
}
}

Khi thực hiện, Mybatis sẽ chỉ thực hiện firstSelectWithCache. Tuy nhiên, khi gặp câu SQL thứ 2 giống hệt SQL1 và trong cùng sqlsession, nó sẽ lấy kết quả trực tiếp từ cache. Việc này tuy nhỏ, nhưng đối với những ứng dụng cần query dữ liệu nhiều lần, trùng lặp từ database, sử dụng Mybatis giúp tăng hiệu năng lên đáng kể.

  • The results of all queries are stored in the cache. Tất cả kết quả của queries đều được lưu vào cache.
  • End a transaction (or at the end of a query configured with autoCommit = true). Cache chỉ được xóa khi kết thúc transaction (hoặc khi query được thiết lập autoCommit = true).
  • Whenever an insert / update / delete query is made. Khi thực hiện các câu insert/ update/ delete.

Chi tiết hơn, Mybatis hỗ trợ 2 tầng cache. Thứ nhất là session cache, hai là global cache. Vấn đề này sẽ được tìm hiểu sâu hơn ở bài viết tiếp theo.

3.3 Không sử dụng proxy.

4. Kết luận.

Nếu câu query cần sử dụng nhiều điều kiện if else, hoặc cần for loop một dãy giá trị IN. Hiển nhiên MyBatis là lựa chọn tốt nhất.

5. Tham khảo.

  1. MyBatis cache.
  2. Connection Pool.
  3. MyBatis in Practice.
  4. Java Persistence with MyBatis 3.

Bài viết gốc được đăng tải tại kieblog.vn

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev