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

相关推荐
shehuiyuelaiyuehao1 小时前
1计算机是如何工作的
java·计算机网络
陈随易1 小时前
在Finch用了62亿词元,我认为这是新一代Agent工具之神
前端·人工智能·后端
letisgo52 小时前
JAVA 高级进阶07篇《@Transactional失效的8个场景:代理机制到传播行为》
java·面试·transactional·spring事务·aop动态代理
水域安全老周2 小时前
水趣钓鱼救生衣专利拆解:两级锁紧如何解决落水人衣分离
java·前端·网络
三8442 小时前
Java 模板注入(FreeMarker) · 02 · 模板引擎与 FreeMarker 语法
java·开发语言·web安全·freemarker
暮雨哀尘2 小时前
Java 基础练习(一):创建类并调用对象
java·开发语言
wing983 小时前
从codex转战workbuddy使用一周的感受
前端·人工智能·后端
想要入门的程序猿3 小时前
回调函数学习
java·网络·学习
EatFan3 小时前
Java接入支付宝 JSAPI 支付保姆教程(二):流程讲解与前后端代码讲解
前端·spring boot·后端·微信小程序·小程序·uni-app
泡海椒3 小时前
动态代理核心原理:JQuick-Java接口规则自动生成机制解析
java·开发语言·python