- 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:
- Tải file cấu hình MyBatis dưới dạng luồng
- Sử dụng SqlSessionFactoryBuilder để tạo SqlSessionFactory
- Tạo SqlSession từ SqlSessionFactory
- 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:
- Lấy TransactionFactory từ Environment
- Tạo Transaction mới từ DataSource
- Khởi tạo Executor từ Configuration
- Trả về DefaultSqlSession
Tổng kết quy trình:
- Đọc file cấu hình XML thành luồng dữ liệu
- SqlSessionFactoryBuilder phân tích cấu hình tạo đối tượng Configuration
- Tạo DefaultSqlSessionFactory dựa trên Configuration
- DefaultSqlSessionFactory tạo DefaultSqlSession theo các tham số truyền vào