Mybatis核心原理梳理

news2024/11/15 21:09:58

文章目录

  • Mybatis的简单使用
  • Mybatis组件名词介绍
  • Mybatis主要工作流程
  • Mybatis如何控制事务
  • Mybatis中事务的生命周期
  • 一二级缓存分别如何生效
  • 一二级缓存分别如何失效
  • 一级缓存的实体可能会被修改
  • Mybatis中的已经存在PooledDataSource连接池为啥还选择Durid等
  • 为啥连接close之后被没有close而是归还了连接
  • 不使用Spring、Mybatis可以做到多数据源码
  • JPA、JdbcTemplate、Mybatis

Mybatis的简单使用

创建一个maven工程,在idea中File-new-Project-maven-next
在这里插入图片描述

在pom.xml中添加Mybatis依赖

	<dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.3.0</version>
        </dependency>
        <!--        不导入jdbc则将报错:Cause: java.lang.ClassNotFoundException: Cannot find class: com.mysql.jdbc.Driver-->
       	<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.45</version>
        </dependency>
    </dependencies>

在这里插入图片描述
添加一个实体Department和一个demo类,和mybatis配置文件和一个mapper配置文件

public class Department {
	private String id;

	private String name;

	private String tel;

  // geter seter tostring
  
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--    <settings>-->
<!--        <setting name="logImpl" value="LOG4J"/>-->
<!--    </settings>-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://******?characterEncoding=utf-8"/>
                <property name="username" value="*******"/>
                <property name="password" value="******"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/department.xml"/>
        <package name="mapper"/>
    </mappers>
</configuration>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="departmentMapper" >
    <select id="findAll" resultType="com.jaan.entity.Department" flushCache="true">
        select * from tbl_department
    </select>

    <select id="update" resultType="com.jaan.entity.Department">
        update tbl_department set tel = #{tel} where id = #{id}
    </select>
</mapper>

下面是demo类

public class ManualDemo {

	public static void main(String[] args) throws IOException {
		InputStream resource = Resources.getResourceAsStream("mybatis-config.xml");
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resource);
		final SqlSession sqlSession = sqlSessionFactory.openSession(false);
		Department d = new Department();
		d.setId("1");
		d.setTel("12900000000");
		sqlSession.update("departmentMapper.update",d);
		sqlSession.commit();
		final List<Department> list1 = sqlSession.selectList("departmentMapper.findAll");
		list1.forEach(department -> System.out.println(department));
	}
}

Mybatis组件名词介绍

  1. Configuration:读取xml或者注解配置然后转化为了Configuration,里面存有全局配置、别名配置、插件配置、环境配置(事务管理器、数据源)、mapper映射(具体的sql和sql id)等
  2. SqlSessionFactoryBuilder:只有build方法,build方法生成SqlSessionFactory。build方法有多个重载方法,有传入xml配置资源Reader的、有传入xml配置资源InputStream的,有直接传入Configuration的。若不是直接传入Configuration的build方法里会进行解析xml然后生成Configuration,然后再new SqlSessionFactory。
  3. SqlSessionFactory:是一个接口,只有openSession(多个重载)、getConfiguration两个方法,实现类DefaultSqlSessionFactory里只有一个属性configuration
  4. TransactionFactory:xml中environment标签里的transactionManager和dataSource将被解析为TransactionFactory和DataSource作为Environment(环境配置)对象的属性,Environment放在Configuration中,TransactionFactory就是从Configuration的Environment中获取
  5. Transaction:是个接口,有getConnection、commit、rollback、close这四个方法,主要实现类JdbcTransaction有属性Connection、DataSource、TransactionIsolationLevel、autoCommmit(boolean)
  6. DataSource:是个接口,只有getConnection方法,就是用来获取Connection连接的,PooledDataSource和MysqlDataSource是主要的实现类,前者是池化的,后者非池化
  7. Executor:是个接口,BaseExecutor是抽象类,BaseExecutor有Transaction。Executor是由Configuration#newExecutor创建,为啥由非要让创建呢,因为(Executor)this.interceptorChain.pluginAll(executor);
  8. SqlSession:是个接口,有各种增删改查方法、有getMapper方法等。SqlSession代表这一次会话,一般每个请求进来都会创建一个SqlSession,SqlSession一定只有一个Connection和一个Transaction,一个SqlSession可以执行多次事务并不是一个SqlSession会话只能提交一次事务。SqlSession通过SqlSessionFactory的openSession创建

Mybatis主要工作流程

  1. 通过new SqlSessionFactoryBuilder().build(resource)构建SqlSessionFactory,一个项目中基本只实例化一个SqlSessionFactory,除非这个项目是多数据源的
  2. 使用SqlSessionFactory获取SqlSession
  3. 有了SqlSession后①可以直接通过statementId(mapper.xml中的增删改查的id)和参数来执行增删改查②可以通过getMapper,使用java类来操作,这种方式底层最终其实是与1方式一样的,只不过这种把方式1中的参数处理,返回值处理帮我们搞定了,还有就是这种也不用使用statementId,内部直接帮我们自动关联然后填入了
  4. 只有在最后执行的时候才会去获取连接,且一个SqlSession只会获取一次连接,获取的连接将会保存在SqlSession的Executor的Transaction的属性中,下次这个SqlSession在进行增删改的时候Transaction直接去自己属性里的
  5. 不同的SqlSession执行是不可能在一个事务里的,因为每个SqlSession都有自己Transaction,要想保证多次增删改查在一个事务里,就必须使用一个SqlSession来执行,或者通过同一个SqlSession获取的mapper来执行,Mybatis的SqlSessionFactory的openSession每次都是返回新的SqlSession,所以我们得自己维护同一个SqlSession。如果使用了Spring之后Spring可以帮我们做这些事情

Mybatis如何控制事务

Mybatis中事务的生命周期

一二级缓存分别如何生效

一二级缓存分别如何失效

一级缓存的实体可能会被修改

Mybatis中的已经存在PooledDataSource连接池为啥还选择Durid等

为啥连接close之后被没有close而是归还了连接

不使用Spring、Mybatis可以做到多数据源码

JPA、JdbcTemplate、Mybatis

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何获取 WWDC 视频对应的官方源代码?

零 概览 每年的 WWDC&#xff08;The Apple Worldwide Developers Conference&#xff09; 是 Apple 开发者的盛大节日&#xff0c;我们可以从 WWDC 海量官方视频中学到大量的知识。 不过&#xff0c;有些视频仅包含一些“惨不忍睹”&#xff08;由于网络质量差等原因&#…

【C++】C++ 入门(二)(引用)

目录 一、前言 二、引用 1、引用的概念 2、引用特性 3、使用场景 3.1、做参数 3.2、做返回值 4、传值、传引用效率比较 值和引用作为参数的性能比较 值和引用作为返回值类型的性能比较 5、常引用 6、引用和指针的区别 一、前言 上一篇文章我们讲解了 C 的命名空间…

IDEA快速生成实体类(加注释)

步骤&#xff1a; 1、点击右侧的datesource图标&#xff0c;要是没有该图标&#xff0c;请去自行百度 2、点击 号 3、选择 datasource 4、选择 mysql 1、填写一个连接名&#xff0c;随便填什么都行 2、不用选择&#xff0c;默认就行 3、填写数据库连接的 IP地址&#xff0c;比…

Android 时间工具类

最近总结了一下时间相关的用法&#xff0c;如下。 1、日期转换为字符串 默认"yyyy-MM-dd HH:mm:ss" 2、任意类型日期字符串转时间 3、获取当前对应格式的日期 4、获取当前对应格式的日期 默认"yyyyMMddHHmmssSSS" 5、计算该天是星期几 6、获取星期几…

XSS - 进阶篇(蓝莲花的基本使用)

数据来源 本文仅用于信息安全的学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若观众因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与本人无关。 xss漏洞接收平台-蓝莲花&#xff1a; 1&#xff09;下载并安装Phpstudy&#xff08;安…

分享157个ASP源码,总有一款适合您

ASP源码 分享157个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 157个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/1_IF9pFQX4NM-kmJyIAGBQQ?pwdcb55 提取码&#x…

RBAC简介

RBAC BAC基于角色的访问控制&#xff0c;RBAC认为权限授权的过程可以抽象地概括为&#xff1a;Who是否可以对What进行How的访问操作 RBAC简介 基于角色的权限访问控制模型 在RBAC模型里面&#xff0c;有3个基础组成部分&#xff0c;分别是&#xff1a;用户、角色和权限。RB…

微信公众号小程序怎么做?

​微信公众号小程序在当下已经成为人们日常生活中不可或缺的工具&#xff0c;在用户体验方面也做得很好&#xff0c;不仅可以实现沟通和交流&#xff0c;还可以通过微信公众号进行在线预约服务。那么关于微信公众号小程序怎么做&#xff0c;下面就给大家说说。 1、注册微信公众…

Cadence PCB仿真 使用 Allegro PCB SI 元器件端口设置的PDN分析功能介绍图文教程

🏡《总目录》   🏡《分目录》 目录 1,概述2,启动方法3,功能介绍3.1,元器件设置列表(Device)3.2,端口设置列表(Ports)4,总结1,概述 在进行PDN分析时需要对电源网络涉及到的所有元器件的指定端口的参数进行配置。本文介绍PDN网络元器件端口设置的功能。 2,启动…

【寒假day3】leetcode刷题

&#x1f308;一、选择题 ❤第1题&#xff1a;关于重载函数,&#xff08; &#xff09;说明是正确的。 A: 函数名相同&#xff0c;参数类型或个数不同 B: 函数名相同&#xff0c;返回值类型不同 C: 函数名相同&#xff0c;函数内部实现不同 D: 函数名称不同答案&#xff1a…

数据挖掘-特征选择方法:方差过滤,相关性过滤

目录特征选择1、Filter过滤法方差过滤1&#xff0c;消除方差为0的特征2&#xff0c;只留下一半的特征3&#xff0c;特征是二分类时2、相关性过滤法2.1 卡方过滤2.2 F检验2.3 互信息法3、 Embedded嵌入法4、Wrapper包装法5、总结特征选择 数据预处理完成后&#xff0c;就进入特…

常见网络报文数据包格式

当我们应用程序用TCP传输数据的时候&#xff0c;数据被送入协议栈中&#xff0c;然后逐个通过每一层&#xff0c;知道最后到物理层数据转换成比特流&#xff0c;送入网络。而再这个过程中&#xff0c;每一层都会对要发送的数据加一些首部信息。整个过程如下图。以太网帧格式以太…

Mybatis框架(二)再遇Mybatis之Mybatis配置文件与映射文件

本文是本人专栏【Java开发后端系列框架】里的文章&#xff0c;文章根据各框架官网与网上资料加上本人工作经验&#xff0c;进行修改总结发布在这个专栏&#xff0c;主要目的是用于自我提升&#xff0c;不用于获取利益。如果系列文章能到帮到您本人将感到荣幸&#xff0c;如果有…

2023年3月5日DAMA-CDGA/CDGP数据治理认证考试报名入口

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

【每日阅读】前端进阶知识点(一)

如何更改网页中语言属性值 声明当前语言类 html标签更改属性值 lang属性中不区分大小写 en-us en-US 一致 具体可使用 window,document.querySelector(“html”)?.setAttribute(“lang”,newValue); qs库 qs是一个流行的查询参数序列化和解析库。可以将一个普通的object序列…

OpenPPL PPQ量化(2):离线静态量化源码剖析

目录 模型支持 量化onnx原生模型&#xff1a;quantize_onnx_model 输入输出 执行流程 ONNX格式解析 后记 模型支持 openppl支持了三种模型&#xff1a;onnx、caffe、pytorch&#xff0c;其中pytorch和caffe是通过quantize_torch_model和quantize_caffe_model&#xff0c…

Elasticsearch:Terms set 查询

什么是 terms set 查询&#xff1f; Terms set 查询根据匹配给定字段的精确术语的最少数量返回文档。 terms set 查询与 term 查询有何不同&#xff1f; Terms set query 和 Terms query 之间的唯一区别是你可以提供必须匹配的最少数量的术语才能检索特定文档。 什么是 minim…

【Ansys Meshing】Fluent Meshing和Ansys Meshing在划分边界层网格能力上的对比

一、几何模型展示 如下图所示&#xff0c;一端的圆柱是流体入口&#xff0c;另一端的圆柱是流体出口&#xff0c;中间都是导热管。 二、在spaceclaim中进行切割实体 2.1 切割手段 切割平面的位置如图两根线所示&#xff0c;最终得到左右两边两个有圆柱的大块&#xff0c;以…

【SAP Abap】X档案:SAP 快速提供基础数据给第三方系统访问的几种方法(附常用基础数据)

SAP 快速提供基础数据给第三方系统访问的几种方法1、数据封装2、开放RFC访问3、开放接口服务4、开放DB访问5、常用基础数据1、数据封装 在企业信息系统建设过程中&#xff0c;少不了的就是系统集成数据对接。 尤其是SAP系统中大量的基础数据集成&#xff0c;如各种字段值域&am…

C语言:操作符详解

往期文章 C语言&#xff1a;初识C语言C语言&#xff1a;分支语句和循环语句C语言&#xff1a;函数C语言&#xff1a;数组 目录往期文章前言1. 操作符分类2. 算术操作符3. 移位操作符4. 位操作符5. 赋值操作符6. 符合赋值符7. 单目操作符8. 关系操作符9. 逻辑操作符10. 条件操作…