Java-04 深入浅出 MyBatis - SqlSessionFactory 与 SqlSession DAO与Mapper 代理模式
点一下关注吧!!!非常感谢!!持续更新!!!
大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html
目前已经更新到了:
- MyBatis(正在更新)
映射概述
(续接上节,对剩余部分进行补充)
SqlSession 工厂构建器
SqlSessionFactoryBuilder,SqlSessionFactory 是 MyBatis 框架中的核心组件之一,它是创建 SqlSession 对象的工厂。SqlSessionFactory 的构建通常是通过 SqlSessionFactoryBuilder 类完成的。
SqlSessionFactoryBuilder 是 MyBatis 提供的一个用于构建 SqlSessionFactory 的辅助类。它的主要任务是通过配置文件或配置流读取 MyBatis 的配置信息,并构建 SqlSessionFactory 实例。
由于 SqlSessionFactory 是线程安全的且应该是单例模式,因此在项目中我们通常只需要在应用程序启动时构建一次 SqlSessionFactory,并将其存储以供后续使用。
常用的 API 是:SqlSessionFactory build(InputStream inputStream);
通过加载 XML 的方式来构建形成一个 SqlSessionFactory 对象
SqlSessionFactory 的构建流程
构建 SqlSessionFactory 的主要步骤如下:
加载配置文件
通过 Resources.getResourceAsStream() 或 Resources.getResourceAsReader() 加载 MyBatis 的 XML 配置文件。
解析配置文件
使用 XMLConfigBuilder 对配置文件进行解析,将 XML 配置文件转化为 MyBatis 的 Configuration 对象。
创建 SqlSessionFactory 实例
SqlSessionFactoryBuilder 将解析完成的 Configuration 对象封装到一个具体的 SqlSessionFactory 实现类中(通常是 DefaultSqlSessionFactory)。
String resource = "org/mybatis/builder/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);
其中,Resource 工具类,这个类在 org.apache.ibatis.io 包中,Resources 类帮助你从类路径下、文件系统或者一个 WEB URL 中加载资源文件。
SqlSessionFactory 的核心特点
线程安全
SqlSessionFactory 是线程安全的,可以在多个线程中共享,因此推荐在应用程序生命周期中使用单例模式创建和管理。
创建 SqlSession
SqlSessionFactory 的主要职责是创建 SqlSession 对象。每个线程都应该独立地使用一个 SqlSession 实例。
加载配置信息
SqlSessionFactory 内部维护了所有的配置信息,包括数据库连接池、事务管理器、SQL 映射语句等。
SqlSession 工厂对象
在 MyBatis 框架中,SqlSessionFactory 是一个非常重要的核心对象,它的作用是创建和管理 SqlSession 对象的实例。SqlSession 是 MyBatis 中用于执行 SQL 操作的主要对象,而 SqlSessionFactory 则是生成这些 SqlSession 的工厂。通过 SqlSessionFactory,可以实现对数据库会话的统一管理,保证资源的高效利用和线程安全。
SqlSessionFactory 有多个方法创建 SqlSession,比如:
- openSession:默认开启一个事务,但事务不会自动提交,也就意味着需要手动提交该事务,更新操作数据才会持久化到数据库中
- openSession(boolean autoCommit):参数为是否自动提交,如果设置为 true,那么不需要手动提交事务。
SqlSession 回话对象
SqlSession 实例在 MyBatis 中是非常强大的一个类,在这里你会看到所有执行语句、提交或回滚事务和获取映射器实例的方法。
执行语句的方法主要有:
<T> T selectOne(String statement, Object parameter)
<E> List<E> selectList(String statement, Object parameter)
int insert(String statement, Object parameter)
int update(String statement, Object parameter)
int delete(String statement, Object parameter)
操作事务的方法主要有:
void commit()
void rollback()
DAO层 实现
传统方式
package icu.wzk.dao;
import icu.wzk.model.UserInfo;
import java.util.List;
public interface UserInfoMapper {
UserInfo selectOne(String username);
List<UserInfo> selectList(UserInfo userInfo);
void insert(UserInfo userInfo);
void update(UserInfo userInfo);
void delete(UserInfo userInfo);
}
代理方式
方式介绍
采用 MyBatis 的代理开发方式实现 DAO 层开发,这种方式是我们后面进入企业的主流。
Mapper 接口开发方法只需要程序员编写 Mapper 接口,由 MyBatis 框架根据接口定义创建接口的动态代理对象,代理对象的方法同上边 DAO 接口实现类方法。
- Mapper XML 中 namespace 和 mapper 接口的全限定名相同
- Mapper 接口方法名和 Mapper XML 中定义的每个 statement id 相同
- Mapper 接口方法的输入参数和 Mapper XML中定义的每个 SQL 的 parameterType 的类型相同
- Mapper 接口方法的输出参数类型 和 Mapper XML 中定义的每个 SQL resultType 的类型相同
测试代理方法:
package icu.wzk;
import icu.wzk.mapper.UserInfoMapper;
import icu.wzk.model.UserInfo;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class WzkIcu05 {
public static void main(String[] args) throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserInfoMapper userInfoMapper = sqlSession.getMapper(UserInfoMapper.class);
List<UserInfo> dataList = userInfoMapper.selectList(new UserInfo());
dataList.forEach(System.out::println);
sqlSession.close();
}
}
编写代码的结果如下所示: