Phân tích mã nguồn MyBatis 2 - SqlSessionFactoryBuilder và SqlSessionFactory

  1. Xem ví dụ đơn giản về MyBatis
        String resource = "mybatis-config.xml";
        //1. Đọc file cấu hình MyBatis qua luồng dữ liệu
        InputStream stream = Resources.getResourceAsStream(resource); 
        //2. Tạo SqlSessionFactory từ file cấu hình
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(stream);
        //3. Tạo SqlSession thông qua SqlSessionFactory
        SqlSession session = sessionFactory.openSession();
        //4. Thực thi truy vấn SQL và lấy kết quả
        List<User> userList = session.selectList("selectAll");
        System.out.println(userList.size());

Quy trình gồm:

  1. Tải file cấu hình MyBatis dưới dạng luồng
  2. Sử dụng SqlSessionFactoryBuilder để tạo SqlSessionFactory
  3. Tạo SqlSession từ SqlSessionFactory
  4. Thực hiện truy vấn SQL thông qua SqlSession

Tiếp theo sẽ phân tích chi tiết về ba thành phần cốt lõi này:

I. Cơ chế hoạt động của SqlSessionFactoryBuilder

Là lớp khởi tạo SqlSessionFactory, có vai trò xây dựng đối tượng SqlSessionFactory từ file cấu hình XML. Xem đoạn mã sau:

 1 package org.apache.ibatis.session;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.io.Reader;
 6 import java.util.Properties;
 7 import org.apache.ibatis.builder.xml.XMLConfigBuilder;
 8 import org.apache.ibatis.exceptions.ExceptionFactory;
 9 import org.apache.ibatis.executor.ErrorContext;
10 import org.apache.ibatis.session.defaults.DefaultSqlSessionFactory;
11 
12 public class SqlSessionFactoryBuilder {
13 
14   public SqlSessionFactory build(Reader reader) {
15     return build(reader, null, null);
16   }
17 
18   public SqlSessionFactory build(InputStream inputStream) {
19     return build(inputStream, null, null);
20   }
21 
22   private SqlSessionFactory build(Configuration config) {
23     return new DefaultSqlSessionFactory(config);
24   }
25 }

View CodeCác phương thức chính:

  • 8 phương thức build() xử lý các trường hợp khác nhau (Reader/InputStream, có/không có environment, có/không có properties)
  • Tất cả đều quy về phương thức build(Configuration) để tạo DefaultSqlSessionFactory
  • Quy trình xử lý: XMLConfigBuilder → parse → Configuration → DefaultSqlSessionFactory

II. Giao diện SqlSessionFactory

 1 package org.apache.ibatis.session;
 2 
 3 import java.sql.Connection;
 4 
 5 /**
 6  * Cung cấp các phiên làm việc SqlSession
 7  */
 8 public interface SqlSessionFactory {
 9 
10   SqlSession openSession();
11 
12   SqlSession openSession(boolean autoCommit);
13   SqlSession openSession(Connection connection);
14   SqlSession openSession(TransactionIsolationLevel level);
15 
16   Configuration getConfiguration();
17 }

Giao diện định nghĩa:

  • 8 phương thức tạo SqlSession với các tham số khác nhau (autoCommit, Connection, TransactionIsolationLevel, ExecutorType)
  • 1 phương thức getConfiguration() để truy xuất cấu hình

III. Lớp DefaultSqlSessionFactory

  1 package org.apache.ibatis.session.defaults;
  2 
  3 import java.sql.Connection;
  4 import java.sql.SQLException;
  5 
  6 import org.apache.ibatis.executor.Executor;
  7 import org.apache.ibatis.mapping.Environment;
  8 import org.apache.ibatis.session.Configuration;
  9 import org.apache.ibatis.session.SqlSession;
 10 import org.apache.ibatis.session.TransactionIsolationLevel;
 11 import org.apache.ibatis.transaction.Transaction;
 12 import org.apache.ibatis.transaction.TransactionFactory;
 13 
 14 public class DefaultSqlSessionFactory implements SqlSessionFactory {
 15 
 16   private final Configuration configuration;
 17 
 18   public DefaultSqlSessionFactory(Configuration config) {
 19     this.configuration = config;
 20   }
 21 
 22   @Override
 23   public SqlSession openSession() {
 24     return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);
 25   }
 26 
 27   private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
 28     try {
 29       Environment env = configuration.getEnvironment();
 30       Transaction tx = env.getTransactionFactory().newTransaction(env.getDataSource(), level, autoCommit);
 31       Executor executor = configuration.newExecutor(tx, execType);
 32       return new DefaultSqlSession(configuration, executor, autoCommit);
 33     } catch (Exception e) {
 34       throw ExceptionFactory.wrapException("Lỗi tạo phiên làm việc", e);
 35     }
 36   }
 37 }

Đặc điểm chính:

  • Khởi tạo với đối tượng Configuration
  • Các phương thức mở phiên đều quy về openSessionFromDataSource hoặc openSessionFromConnection
  • Tạo DefaultSqlSession thông qua:
  1. Lấy TransactionFactory từ Environment
  2. Tạo Transaction mới từ DataSource
  3. Khởi tạo Executor từ Configuration
  4. Trả về DefaultSqlSession

Tổng kết quy trình:

  1. Đọc file cấu hình XML thành luồng dữ liệu
  2. SqlSessionFactoryBuilder phân tích cấu hình tạo đối tượng Configuration
  3. Tạo DefaultSqlSessionFactory dựa trên Configuration
  4. DefaultSqlSessionFactory tạo DefaultSqlSession theo các tham số truyền vào

Thẻ: mybatis sqlsessionfactory sqlsession Java orm

Đăng vào ngày 22 tháng 6 lúc 05:24