SqlSessionFactory 的作用

SqlSessionFactory 是 MyBatis 框架中最核心的接口之一,它负责创建 SqlSession 对象。下面详细解析这个对象及其使用方法。

1. SqlSessionFactory 的作用

SqlSessionFactory 是 MyBatis 的工厂对象,主要职责:

  • 创建 SqlSession 实例(数据库会话)
  • 管理数据库连接和配置信息
  • 缓存已解析的映射文件

2. 创建 SqlSessionFactory 的方式

方式一:通过 XML 配置文件(最常用)

java 复制代码
// 基于 mybatis-config.xml 创建
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

对应的 mybatis-config.xml 配置文件:

xml 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis_test"/>
        <property name="username" value="root"/>
        <property name="password" value="password"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="mapper/UserMapper.xml"/>
  </mappers>
</configuration>

方式二:通过 Java 代码(编程式配置)

java 复制代码
// 创建数据源
DataSource dataSource = new PooledDataSource(
    "com.mysql.cj.jdbc.Driver",
    "jdbc:mysql://localhost:3306/mybatis_test",
    "root",
    "password"
);

// 配置事务工厂
TransactionFactory transactionFactory = new JdbcTransactionFactory();

// 创建环境
Environment environment = new Environment("development", transactionFactory, dataSource);

// 构建配置
Configuration configuration = new Configuration(environment);
configuration.addMapper(UserMapper.class);

// 创建 SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

方式三:在 Spring Boot 中自动配置

java 复制代码
@Configuration
@MapperScan("com.example.mapper")
public class MyBatisConfig {
    // Spring Boot 会自动配置 SqlSessionFactory
    // 只需要在 application.properties 中配置数据源
}

application.properties

properties 复制代码
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_test
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.example.entity

3. SqlSessionFactory 的核心方法

3.1 创建 SqlSession 的方法

java 复制代码
SqlSessionFactory sqlSessionFactory = ...; // 已创建的工厂实例

// 1. 创建默认的 SqlSession(需要手动提交事务)
SqlSession sqlSession = sqlSessionFactory.openSession();

// 2. 创建自动提交的 SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession(true);

// 3. 从特定连接创建 SqlSession
Connection connection = dataSource.getConnection();
SqlSession sqlSession = sqlSessionFactory.openSession(connection);

// 4. 指定事务隔离级别
SqlSession sqlSession = sqlSessionFactory.openSession(TransactionIsolationLevel.READ_COMMITTED);

// 5. 指定执行器类型
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);

3.2 获取配置信息

java 复制代码
Configuration configuration = sqlSessionFactory.getConfiguration();

// 获取所有已注册的Mapper
Collection<Class<?>> mapperClasses = configuration.getMapperRegistry().getMappers();

// 检查是否包含特定Mapper
boolean hasMapper = configuration.hasMapper(UserMapper.class);

4. SqlSessionFactory 的生命周期管理

单例模式(推荐)

java 复制代码
public class MyBatisUtil {
    private static SqlSessionFactory sqlSessionFactory;
    
    static {
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            throw new RuntimeException("初始化SqlSessionFactory失败", e);
        }
    }
    
    public static SqlSessionFactory getSqlSessionFactory() {
        return sqlSessionFactory;
    }
    
    public static SqlSession openSession() {
        return sqlSessionFactory.openSession();
    }
}

5. 完整使用示例

实体类和Mapper接口

java 复制代码
// 实体类
public class User {
    private Long id;
    private String name;
    private String email;
    // getter/setter
}

// Mapper接口
public interface UserMapper {
    User selectUserById(Long id);
    void insertUser(User user);
    void updateUser(User user);
    void deleteUser(Long id);
}

Mapper XML 文件

xml 复制代码
<!-- UserMapper.xml -->
<?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="com.example.mapper.UserMapper">
  
  <select id="selectUserById" parameterType="long" resultType="User">
    SELECT * FROM user WHERE id = #{id}
  </select>
  
  <insert id="insertUser" parameterType="User">
    INSERT INTO user (name, email) VALUES (#{name}, #{email})
  </insert>
  
</mapper>

使用 SqlSessionFactory 执行操作

java 复制代码
public class UserService {
    
    public User getUserById(Long id) {
        // 获取 SqlSessionFactory(单例)
        SqlSessionFactory sqlSessionFactory = MyBatisUtil.getSqlSessionFactory();
        
        // 创建 SqlSession
        try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
            
            // 方式一:通过Mapper接口(推荐)
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            User user = userMapper.selectUserById(id);
            
            // 方式二:通过命名空间直接调用(不推荐)
            // User user = sqlSession.selectOne("com.example.mapper.UserMapper.selectUserById", id);
            
            return user;
        } // 自动关闭SqlSession
    }
    
    public void addUser(User user) {
        SqlSessionFactory sqlSessionFactory = MyBatisUtil.getSqlSessionFactory();
        
        try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            userMapper.insertUser(user);
            sqlSession.commit(); // 手动提交事务
        }
    }
}

6. 最佳实践

  1. 单例模式 :在整个应用生命周期中只创建一个 SqlSessionFactory 实例
  2. 资源管理 :使用 try-with-resources 确保 SqlSession 正确关闭
  3. 事务管理:根据业务需求选择合适的提交方式
  4. 连接池配置:在生产环境中使用连接池提高性能
  5. 配置文件外部化:将数据库配置放在外部文件中,便于环境切换

7. 常见配置项

mybatis-config.xml 中的常用配置:

xml 复制代码
<configuration>
  <settings>
    <!-- 开启缓存 -->
    <setting name="cacheEnabled" value="true"/>
    <!-- 开启延迟加载 -->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!-- 数据库字段下划线转驼峰 -->
    <setting name="mapUnderscoreToCamelCase" value="true"/>
  </settings>
  
  <typeAliases>
    <package name="com.example.entity"/>
  </typeAliases>
</configuration>

SqlSessionFactory 是 MyBatis 的入口点,正确创建和管理这个对象是使用 MyBatis 的基础。掌握它的创建方式和使用方法,能够帮助你更好地构建 MyBatis 应用程序。

相关推荐
数据知道2 小时前
Go语言:Go 语言中的命令行参数操作详解
开发语言·后端·golang·go语言
代码匠心2 小时前
从零开始学Flink:实时流处理实战
java·大数据·后端·flink
爱隐身的官人3 小时前
JAVA代码审计总结
java·网络·安全
小杨勇敢飞3 小时前
拼图小游戏开发日记 | Day3(已完结)
java·数据结构·算法
hui函数3 小时前
Python全栈(基础篇)——Day05:后端内容(dict与set+while循环+for循环+实战演示+每日一题)
开发语言·后端·python
她说..3 小时前
Redis项目应用总结(苍穹外卖/黑马头条/乐尚代驾)
java·数据库·redis·缓存·消息队列·redisson·geo
摇滚侠3 小时前
Java进阶教程,全面剖析Java多线程编程,多线程和堆内存栈内存的关系,笔记20
java
小猪绝不放弃.3 小时前
一张图入门 Docker
java·开发语言
可可南木3 小时前
ICT 数字测试原理 8 - -VCL 的测试参数
开发语言·功能测试·测试工具·pcb工艺