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();
    }
}

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

相关推荐
路在脚下@4 分钟前
spring boot的配置文件属性注入到类的静态属性
java·spring boot·sql
啦啦右一5 分钟前
Spring Boot | (一)Spring开发环境构建
spring boot·后端·spring
森屿Serien7 分钟前
Spring Boot常用注解
java·spring boot·后端
苹果醋31 小时前
React源码02 - 基础知识 React API 一览
java·运维·spring boot·mysql·nginx
Hello.Reader2 小时前
深入解析 Apache APISIX
java·apache
菠萝蚊鸭2 小时前
Dhatim FastExcel 读写 Excel 文件
java·excel·fastexcel
旭东怪2 小时前
EasyPoi 使用$fe:模板语法生成Word动态行
java·前端·word
007php0072 小时前
Go语言zero项目部署后启动失败问题分析与解决
java·服务器·网络·python·golang·php·ai编程
∝请叫*我简单先生2 小时前
java如何使用poi-tl在word模板里渲染多张图片
java·后端·poi-tl
别致的影分身2 小时前
使用C语言连接MySQL
数据库·mysql