MyBatis核心类用法详解

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。其核心类构成了 MyBatis 框架的基础,理解这些核心类的用法对于掌握 MyBatis 至关重要。以下是对 MyBatis 核心类及其用法的详细介绍:

1. SqlSessionFactoryBuilder

这是 MyBatis 的初始化类,负责从配置文件或配置类构建 SqlSessionFactory 对象。

用法示例

java 复制代码
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;

public class MyBatisUtil {
    private static SqlSessionFactory sqlSessionFactory;
    
    static {
        try {
            // 加载 MyBatis 配置文件
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            
            // 构建 SqlSessionFactory
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public static SqlSessionFactory getSqlSessionFactory() {
        return sqlSessionFactory;
    }
}

关键方法

  • build(InputStream inputStream):从 XML 配置文件构建 SqlSessionFactory
  • build(Configuration config):从自定义的 Configuration 对象构建 SqlSessionFactory

2. SqlSessionFactory

SqlSessionFactory 是 MyBatis 的核心工厂类,负责创建 SqlSession 对象。一个应用通常只需要一个 SqlSessionFactory 实例。

用法示例

java 复制代码
// 获取 SqlSessionFactory 实例
SqlSessionFactory sqlSessionFactory = MyBatisUtil.getSqlSessionFactory();

// 创建 SqlSession
try (SqlSession session = sqlSessionFactory.openSession()) {
    // 执行数据库操作
}

关键方法

  • openSession():创建一个非自动提交的 SqlSession
  • openSession(boolean autoCommit):指定是否自动提交事务。
  • openSession(ExecutorType executorType):指定执行器类型(SIMPLEREUSEBATCH)。

3. SqlSession

SqlSession 是 MyBatis 的核心接口,它提供了执行 SQL 语句、管理事务等方法。每个线程都应该有自己独立的 SqlSession 实例。

用法示例

java 复制代码
try (SqlSession session = sqlSessionFactory.openSession()) {
    // 方式一:通过全限定名获取 Mapper 方法
    User user = session.selectOne("com.example.mapper.UserMapper.selectUserById", 1);
    
    // 方式二:通过 Mapper 接口获取代理对象
    UserMapper userMapper = session.getMapper(UserMapper.class);
    User user = userMapper.selectUserById(1);
    
    // 插入操作
    User newUser = new User("John", "Doe");
    userMapper.insertUser(newUser);
    
    // 提交事务(非自动提交模式下)
    session.commit();
}

关键方法

  • selectOne(String statement, Object parameter):查询单个结果。
  • selectList(String statement, Object parameter):查询列表结果。
  • insert(String statement, Object parameter):插入数据。
  • update(String statement, Object parameter):更新数据。
  • delete(String statement, Object parameter):删除数据。
  • getMapper(Class<T> type):获取 Mapper 接口的代理对象。
  • commit():提交事务。
  • rollback():回滚事务。

4. Mapper 接口

Mapper 接口是 MyBatis 推荐的编程方式,它通过接口方法和注解(或 XML)绑定 SQL 语句。

Mapper 接口示例

java 复制代码
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface UserMapper {
    // 使用注解定义 SQL
    @Select("SELECT * FROM users WHERE id = #{id}")
    User selectUserById(int id);
    
    // 也可以通过 XML 文件定义 SQL,只需方法签名匹配
    void insertUser(User user);
}

关键点

  • Mapper 接口无需实现类,MyBatis 会自动生成代理对象。
  • 方法名和参数需与 XML 或注解中的 SQL 定义匹配。

5. Configuration

Configuration 是 MyBatis 的全局配置对象,包含了所有 MyBatis 的配置信息。

用法示例

java 复制代码
// 手动创建 Configuration 对象
Configuration config = new Configuration();
config.setLazyLoadingEnabled(true);
config.setCacheEnabled(true);

// 注册映射器
config.addMapper(UserMapper.class);

// 构建 SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(config);

常见配置项

  • settings:各种全局设置(如延迟加载、缓存等)。
  • typeAliases:类型别名注册。
  • mappers:映射器注册。
  • environments:数据库环境配置。

6. Executor

Executor 是 MyBatis 的执行器,负责 SQL 语句的执行和缓存的维护。

执行器类型

  • SIMPLE:默认执行器,每个 SQL 都会创建新的预处理语句(PreparedStatement)。
  • REUSE:复用预处理语句,提高性能。
  • BATCH:批量执行器,适用于批量插入、更新操作。

配置方式

xml 复制代码
<!-- mybatis-config.xml -->
<settings>
    <setting name="defaultExecutorType" value="REUSE"/>
</settings>

7. TypeHandler

TypeHandler 用于实现 Java 类型与 JDBC 类型之间的转换,MyBatis 内置了许多常用的类型处理器。

自定义 TypeHandler 示例

java 复制代码
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.*;
import java.time.LocalDateTime;

public class LocalDateTimeTypeHandler extends BaseTypeHandler<LocalDateTime> {
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, LocalDateTime parameter, JdbcType jdbcType) throws SQLException {
        ps.setTimestamp(i, Timestamp.valueOf(parameter));
    }
    
    @Override
    public LocalDateTime getNullableResult(ResultSet rs, String columnName) throws SQLException {
        Timestamp timestamp = rs.getTimestamp(columnName);
        return timestamp != null ? timestamp.toLocalDateTime() : null;
    }
    
    // 其他方法实现...
}

注册自定义 TypeHandler

xml 复制代码
<!-- mybatis-config.xml -->
<typeHandlers>
    <typeHandler handler="com.example.handler.LocalDateTimeTypeHandler"/>
</typeHandlers>

总结

MyBatis 的核心类通过工厂模式、代理模式和构建者模式协作,形成了一个灵活且高效的持久层框架。

相关推荐
zzzzzz3101 小时前
别让大模型直接碰业务:我在 Spring Boot 里给 AI 操作加了一道“可拒绝的闸门”
人工智能·spring boot·spring
数聚天成DeepSData1 小时前
数聚天成 DeepSData 数据价值落地实战指南
java·maven·devops
techdashen1 小时前
Go设计取舍之四: map不变时能否并发修改不同value
开发语言·后端·golang
小小小米粒2 小时前
阿姆达尔定律(Amdahl‘s Law)
java·开发语言
知彼解己2 小时前
Java 版本演进
java·开发语言·spring boot
极客先躯2 小时前
高级java每日一道面试题-2026年05月11日-实战篇[Docker]-如何容器化金融产品推荐系统?
java·运维·docker·容器·金融·高级面试·金融产品推荐系统
朱容zr3331332 小时前
为什么推荐使用自增主键?使用UUID作为主键的优缺点是什么?
java·运维·数据库·后端·mysql·面试·性能优化
用户608186527902 小时前
一文吃透 Avalonia 布局容器|Grid 到 UniformGrid 核心用法 + 语法糖实战
后端
Ai拆代码的曹操3 小时前
Dubbo 线程池爆满排坑:Linux 用户线程数限制,一个容易被忽略的根因
后端·源码阅读
知彼解己3 小时前
Eclipse Temurin:企业级 Java JDK 发行版的最佳实践
java·ide·eclipse