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

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

相关推荐
zmd-zk几秒前
flink学习(3)——方法的使用—对流的处理(map,flatMap,filter)
java·大数据·开发语言·学习·flink·tensorflow
CSDN专家-赖老师(软件之家)4 分钟前
养老院管理系统+小程序项目需求分析文档
vue.js·人工智能·小程序·mybatis·springboot
昵称20214 分钟前
flink1.16+连接Elasticsearch7官方例子报错解决方案
java·flink·es7
爱编程的小生15 分钟前
Easyexcel(6-单元格合并)
java·excel
小白不太白95025 分钟前
设计模式之 迭代器模式
java·设计模式·迭代器模式
闲人一枚(学习中)27 分钟前
设计模式-创建型-单例模式
java·单例模式·设计模式
Coderfuu39 分钟前
Java技术复习提升 10异常
java·开发语言
愿天垂怜1 小时前
【C++】C++11引入的新特性(1)
java·c语言·数据结构·c++·算法·rust·哈希算法
CoderJia程序员甲1 小时前
重学SpringBoot3-Spring Retry实践
java·spring boot·spring·retry·重试机制
淡写青春2091 小时前
计算机基础---进程间通信和线程间通信的方式
java·开发语言·数据结构