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

编写代码的结果如下所示:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/919084.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在Unity中使用Epplus写Excel

Overview 本文旨在帮助你快速入门,该库发展多年内容庞大(官方文档写的极好:https://github.com/EPPlusSoftware/EPPlus/wiki),有些功能在Unity环境可能你永远都不会使用. 官方的一个Demo: https://github.com/EPPlusSoftware/EPPlus.Samples.CSharp 如果你只有读的需求,可以…

leetcode 删除有序数组的重复项

26. 删除有序数组中的重复项 已解答 简单 相关标签 相关企业 提示 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 n…

HNUST-党校培训自动下一集油猴脚本

1.起初 好烦&#xff0c;这个系统看视频需要一直点按键&#xff0c;还没有自动下一集的功能&#xff0c;于是就有了这个js代码 2.效果 实现自动点击是否观看&#xff0c;检测按键自动播放下一集 3.代码(你需要下载油猴&#xff0c;打开管理面板&#xff0c;新建代码) // UserS…

深入了解 GIS 地理信息系统和前端五大 GIS 技术,GIS地理信息系统介绍及前端五大 GIS 技术解析

目录 前言 地理信息系统 (GIS) 是现代数据化社会的重要工具&#xff0c;广泛应用于智慧城市、环境保护、交通管理等领域。随着 Web 前端技术的发展&#xff0c;GIS 可视化在浏览器端的表现能力越来越强&#xff0c;成为许多开发者关注的焦点。这里分享记录 GIS 的基础知识&am…

美团单车上线暖手套,美团贴心服务会给市场带来什么?

首先&#xff0c;美团单车上线暖手套这一举措主要是为了提升市民在秋冬季节骑行共享单车、电单车的出行体验。这一贴心的设计能够解决骑行者在寒冷天气中手部受冻的问题&#xff0c;使得骑行更加舒适和安全。 其次&#xff0c;美团的这一贴心服务会对市场产生积极影响。一方面…

Mysql-DQL语句

文章目录 DQL 语句简单查询查询表所有数据查询指定列 别名查询清除重复值查询结果参与运算 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Mysql专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月16日11点39分 DQL 语句 DQL 语句数据…

【cpp中的继承】

什么是继承&#xff1f; 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象程序设计的层次结构&…

iOS 18 导航栏插入动画会导致背景短暂变白的解决

问题现象 在最新的 iOS 18 系统中,如果我们执行导航栏的插入动画,可能会造成导航栏背景短暂地变为白色: 如上图所示:我们分别向主视图和 Sheet 弹出视图的导航栏插入了消息,并应用了动画效果。可以看到,前者的导航栏背景会在消息插入那一霎那“变白”,而后者则没有任何…

《Java核心技术 卷I》Collection接口和迭代器

Collection接口 Java类库中&#xff0c;集合类的基本接口是Collection接口&#xff0c;两个基本方法&#xff1a; public interface Collection<E>{boolean add(E element);Iterator<E> iterator();...... } add方法用于向集合中添加元素&#xff0c;如果元素确…

《Python制作动态爱心粒子特效》

一、实现思路 粒子效果&#xff1a; – 使用Pygame模拟粒子运动&#xff0c;粒子会以爱心的轨迹分布并运动。爱心公式&#xff1a; 爱心的数学公式&#xff1a; x16sin 3 (t),y13cos(t)−5cos(2t)−2cos(3t)−cos(4t) 参数 t t 的范围决定爱心形状。 动态效果&#xff1a; 粒子…

109. UE5 GAS RPG 实现检查点的存档功能

在这一篇文章里&#xff0c;我们接着实现存档的功能&#xff0c;保存当前玩家的生成位置&#xff0c;游戏里有很多中方式去实现玩家的位置存储&#xff0c;这里我们采用检查点的方式&#xff0c;当玩家接触到当前检查点后&#xff0c;我们可以通过检查点进行保存玩家的状态&…

浅谈电力行业网络安全与防护

3月7日&#xff0c;委内瑞拉发生迄今为止最大规模停电事件&#xff0c;让这个身处危机之中的国家雪上加霜。千里之堤溃于蚁穴&#xff0c;切莫忽视任何不安全因素的存在。电力基础设施薄弱&#xff0c;设备维护不到位&#xff0c;技术人员水平低下&#xff0c;工业控制系统防护…

UE5 第一人称射击项目学习(一)

因为工作需要&#xff0c;需要掌握ue5的操作。 选择了视频资料 UE5游戏制作教程Unreal Engine 5 C作为学习。 第一个目标是跟着视频制作出一款第一人称射击项目。 同时作为入门&#xff0c;这个项目不会涉及到C&#xff0c;而是一个纯蓝图的项目。 项目目标 这个项目将实…

Excel数据动态获取与映射

处理代码 动态映射 动态读取 excel 中的数据&#xff0c;并通过 json 配置 指定对应列的值映射到模板中的什么字段上 private void GetFreightFeeByExcel(string filePath) {// 文件名需要以快递公司命名 便于映射查询string fileName Path.GetFileNameWithoutExtension(fi…

博客文章怎么设计分类与标签

首发地址&#xff08;欢迎大家访问&#xff09;&#xff1a;博客文章怎么设计分类与标签 新网站基本上算是迁移完了&#xff0c;迁移之后在写文章的过程中&#xff0c;发现个人的文章分类和标签做的太混乱了&#xff0c;分类做的像标签&#xff0c;标签也不是特别的丰富&#x…

solana链上智能合约开发案例一则

环境搭建 安装Solana CLI&#xff1a;Solana CLI是开发Solana应用的基础工具。你可以通过官方文档提供的安装步骤&#xff0c;在本地环境中安装适合你操作系统的Solana CLI版本。安装完成后&#xff0c;使用命令行工具进行配置&#xff0c;例如设置网络环境&#xff08;如开发网…

腾讯云存储COS上传视频报错

bug表现为&#xff1a;通过COS上传视频时报错"Class \"QCloud\\COSSTS\\Sts\" not found" 修复办法为&#xff1a;找到文件crmeb/services/upload/storage/Cos.php 将Sts引入由QCloud\COSSTS\Sts;改为crmeb\services\upload\extend\cos\Sts; 修改后重启服…

已有docker增加端口号,不用重新创建Docker

已有docker增加端口号&#xff0c;不用重新创建Docker 1. 整体描述2. 具体实现2.1 查看容器id2.2 停止docker服务2.3 修改docker配置文件2.4 重启docker服务 3. 总结 1. 整体描述 docker目前使用的非常多&#xff0c;但是每次更新都需要重新创建docker&#xff0c;也不太方便&…

Win11 24H2新BUG或影响30%CPU性能,修复方法在这里

原文转载修改自&#xff08;更多互联网新闻/搞机小知识&#xff09;&#xff1a; 一招提升Win11 24H2 CPU 30%性能&#xff0c;小BUG大影响 就在刚刚&#xff0c;小江在网上冲浪的时候突然发现了这么一则帖子&#xff0c;标题如下&#xff1a;基准测试&#xff08;特别是 Time…

C#桌面应用制作计算器

C#桌面应用制作简易计算器&#xff0c;可实现数字之间的加减乘除、AC按键清屏、Del按键清除末尾数字、/-按键取数字相反数、%按键使数字缩小100倍、按键显示运算结果等...... 页面实现效果 功能实现 布局 计算器主体使用Panel容器&#xff0c;然后将button控件排列放置Pane…