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

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).

Performance is one of the key factors for the success of any software application. There are lots of things to consider for better performance, but for many applications, the persistence layer is a key for overall system performance.

Hiệu năng chính là chìa khóa cho thành công đối với mọi phần mềm. Có rất nhiều thứ có thể làm tăng hiệu năng. Đối với nhiều ứng dụng, lớp đặc tả giao diện chính là chìa khóa cho hiệu suất tổng thể của hệ thố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.

MyBatis supports database connection pooling that eliminates the cost of creating a database connection on demand for every request.

MyBatis hỗ trợ kết nối database polling, điều này giúp giảm chi phí khởi tạo connection tới database cho tất cả request.

Đố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.

MyBatis has an in-built cache mechanism which caches the results of SQL queries at the SqlSession level. That is, if you invoke the same mapped select query, then MyBatis returns the cached result instead of querying the database again.

MyBatis có cơ chế cache lại kết quả từ SQL queries, trên cấp độ SqlSesssion. Điều đó có nghĩa răng, nếu bạn gọi lại một câu select query đã được ánh xạ vào bộ đệm (cache), thì Mybatis sẽ không thực hiện query ở database nữa, nó sẽ lấy kết quả trực tiếp từ cache.

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.

MyBatis doesn’t use proxying heavily and hence yields better performance compared to other ORM frameworks that use proxies extensively.

4. Kết luận.

MyBatis may not be the ideal or best solution.If your application is driven by an object model and wants to generate SQL dynamically, MyBatis may not be a good ft for you. Also, if you want to have a transitive persistence mechanism (saving the parent object should persist associated child objects as well) for your application, Hibernate will be better suited for it.

Mybatis có thể không là lựa chọn tốt nhất. Nếu ứng dụng của bạn cung cấp những cấu SQL động (dynamically), MyBatis có thể không tốt cho bạn. Tuy nhiên, nếu bạn muốn một cơ chế lưu trữ lâu dài (các object cha được lưu trữ và giữ liên kết tới các object con) thì Hibernate sẽ là trong những lựa chọn không tồi.

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