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)。

java 复制代码
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 中是非常强大的一个类,在这里你会看到所有执行语句、提交或回滚事务和获取映射器实例的方法。

执行语句的方法主要有:

java 复制代码
<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)

操作事务的方法主要有:

java 复制代码
void commit()
void rollback()

DAO层 实现

传统方式

java 复制代码
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 的类型相同

测试代理方法:

java 复制代码
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();
    }
}

编写代码的结果如下所示:

相关推荐
北辰当尹几秒前
【实习之旅】Kali虚拟机桥接模式ping通百度
java·服务器·桥接模式
Just Dreamchaser6 分钟前
Pdf和Docx文件导出生成水印工具类
java·给pdf和docx文件添加水印
这个需求做不了8 分钟前
Java实现文件格式转换(图片,视频,文档,音频)
java
愿你天黑有灯下雨有伞13 分钟前
高性能Java并发编程:如何优雅地使用CompletableFuture进行异步编排
java
indexsunny13 分钟前
互联网大厂Java面试实战:基于电商场景的Spring Boot与微服务技术问答
java·spring boot·微服务·面试·hibernate·电商场景·技术问答
qq_124987075314 分钟前
基于Spring Boot的电影票网上购票系统的设计与实现(源码+论文+部署+安装)
java·大数据·spring boot·后端·spring·毕业设计·计算机毕业设计
无心水16 分钟前
【分布式利器:腾讯TSF】6、TSF可观测性体系建设实战:Java全链路Metrics+Tracing+Logging落地
java·分布式·架构·wpf·分布式利器·腾讯tsf·分布式利器:腾讯tsf
小鸡脚来咯18 分钟前
Java字符串详解
java·开发语言
麦兜*19 分钟前
【Spring Boot】 接口性能优化“十板斧”:从数据库连接到 JVM 调优的全链路提升
java·大数据·数据库·spring boot·后端·spring cloud·性能优化
廋到被风吹走25 分钟前
【Spring 】Spring Security深度解析:过滤器链、认证授权架构与现代集成方案
java·spring·架构