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):指定执行器类型(SIMPLE、REUSE、BATCH)。
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 的核心类通过工厂模式、代理模式和构建者模式协作,形成了一个灵活且高效的持久层框架。