【mybatis】mybatis的工作原理

news2025/1/18 10:52:17

目录

        • 一、工作流程
        • 二、说明
          • 2.1 构建SqlSessionFactory
          • 2.2 SqlSession的获取
          • 2.3 SqlSession执行语句
        • 三、源码结构
          • 3.1 接口层
          • 3.2 核心处理
          • 3.3 核心处理层
        • 四、代码示例
          • 4.1 通过inputStream构建SqlSessionFactory
          • 4.2 通过configuration构建SqlSessionFactory
          • 4.3 mybatis-config.xml示例

一、工作流程

  • 1.系统启动会加载解析全局配置文件(如mybatis-config.xml),加载解析的信息存储在Configuration对象中
  • 2.通过建造者模式完成配置文件的解析与SqlSessionFactory对象的创建
  • 3.通过SqlSessionFactory对象(是单例的)获取SqlSession对象
  • 4.通过SqlSession中的api来操作数据库,有两种方式,可以通过名称空间和标签的id拼接成一个唯一的statement,还可以通过sqlSesion.getMapper拿到代理对象,通过代理对象去操作
  • 5.关掉sqlSession,清空缓存

二、说明

2.1 构建SqlSessionFactory
  • 1.每个基于mybatis的应用都是以一个SqlSessionFactory的实例为核心的。SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder获得
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  • 2.SqlSessionFactoryBuilder可以从XML配置文件或一个预先配置的Configuration实例来构建出SqlSessionFactory实例

  • 3.从XML文件中构建SqlSessionFactory实例,建议使用类路径下的资源文件进行配置。
    在这里插入图片描述

  • 4.也可以使用任意的输入流(InputStream)实例,例如文件路径字符串(file://)或者数据库URL构造输入流(xml格式与configuration格式)

  • 5.使用mybatis中Resource工具类,能简化从类路径或其它位置加载资源文件

  • 6.xml配置文件包括:获取数据库连接实例的数据源(DataSource)、决定事务作用域、控制方法的事务管理器(TransactionManager)。environment元素包含事务管理和连接池的配置。mappers元素包含映射器(mapper),映射器包含了sql代码和映射定义信息

2.2 SqlSession的获取
  • 1.通过SqlSession sqlSession = sqlSessionFactory.openSession();得到sqlSession
2.3 SqlSession执行语句
  • 1.通过sqlSession.api(“名称空间.标签名”, 1);
SqlSession sqlSession = sqlSessionFactory.openSession();
    Car car = (Car)sqlSession.selectOne("org.apache.ibatis.learning.mapper.CarMapper.selectCar", 1);
    System.out.println(car.getName());
  • 2.通过sqlSession.getMapper(CarMapper.class);获取代理对象,通过代理对象调用方法
package org.apache.ibatis.learning.mapper;
public interface CarMapper {
 Car selectCar(int id);
}
SqlSession sqlSession = sqlSessionFactory.openSession();
CarMapper carMapper = sqlSession.getMapper(CarMapper.class);
car = carMapper.selectCar(1);
System.out.println(car.getName());

三、源码结构

3.1 接口层
  • 1.SqlSession
3.2 核心处理
  • 1. 配置解析
  • 2. 参数映射
  • 3. sql解析
  • 4. sql执行
  • 5. 结果集映射
  • 6. 插件
3.3 核心处理层
  • 1. 数据源模块
  • 2. 事务管理模块
  • 3. 缓存模块
  • 4. Binding模块
  • 5.反射模块
  • 6.类型转换模块
  • 7.日志模块
  • 8.资源加载
  • 9.解析器模块

四、代码示例

4.1 通过inputStream构建SqlSessionFactory
package org.apache.ibatis.learning.sqlsessionfactory;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.learning.mapper.Car;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;

/**
 * @Author wangyouhui
 * @Description 通过inputStream构建SqlSessionFactory
 **/
public class SqlSessionFactoryByInputStream {
  public static void main(String[] args) throws Exception {
      String resource = "mybatis-config.xml";
      InputStream inputStream = Resources.getResourceAsStream(resource);
      SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
      SqlSession sqlSession = sqlSessionFactory.openSession();
      Car car = (Car)sqlSession.selectOne("org.apache.ibatis.learning.mapper.CarMapper.selectCar", 1);
      System.out.println(car.getName());
  }
}
4.2 通过configuration构建SqlSessionFactory
package org.apache.ibatis.learning.sqlsessionfactory;

import org.apache.ibatis.datasource.pooled.PooledDataSource;
import org.apache.ibatis.datasource.unpooled.UnpooledDataSource;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.learning.mapper.Car;
import org.apache.ibatis.learning.mapper.CarMapper;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.util.Properties;

/**
 * @Author wangyouhui
 * @Description 通过configuration构建SqlSessionFactory
 **/
public class SqlSessionFactoryByConfiguration {
  public static void main(String[] args) throws Exception {
    DataSource dataSource = createDataSource();
    TransactionFactory transactionFactory = new JdbcTransactionFactory();
    Environment environment = new Environment("Production", transactionFactory, dataSource);
    Configuration configuration = new Configuration(environment);
//    configuration.setLazyLoadingEnabled(true);
//    configuration.setUseActualParamName(false);
//    configuration.getTypeAliasRegistry().registerAlias(Car.class);
    configuration.addMapper(CarMapper.class);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
    SqlSession sqlSession = sqlSessionFactory.openSession();
    Car car = (Car)sqlSession.selectOne("org.apache.ibatis.learning.mapper.CarMapper.selectCar", 1);
    System.out.println(car.getName());
  }

  private static DataSource createDataSource() throws IOException {
    String resource = "jdbc.properties";
    Properties props = Resources.getResourceAsProperties(resource);
    PooledDataSource ds = new PooledDataSource();
    ds.setDriver(props.getProperty("driver"));
    ds.setUrl(props.getProperty("url"));
    ds.setUsername(props.getProperty("username"));
    ds.setPassword(props.getProperty("password"));
    ds.setDefaultAutoCommit(false);
    return ds;
  }
}
4.3 mybatis-config.xml示例
<?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>
  <properties resource="jdbc.properties"/>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"></transactionManager>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="org/apache/ibatis/learning/mapper/CarMapper.xml"></mapper>
  </mappers>
</configuration>

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

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

相关文章

groovy环境搭建

什么是DSL? 领域特定语言DSL&#xff08;全称&#xff1a;domain specific language&#xff09; 常见的DSL语言有&#xff1a;UML、HTML、SQL、XML、Groovy 作用&#xff1a;解决某一特定领域的问题 什么是groovy? groovy是一种基于JVM的敏捷开发语言。 结合了Python、Ruby和…

Vite4+Vuejs3项目初步搭建,并部署多个vue项目到nginx

前提条件 1、熟悉命令行 2、已安装 16.0 或更高版本的 Node.js 参照vuejs官网的步骤&#xff0c;创建一个vue前端项目 当前vuejs的版本&#xff1a;3.2.47 npm init vuelatestVue.js - The Progressive JavaScript Framework√ Project name: ... vuejs3-project√ Add Type…

BitDock桌面美化工具 一直在后台偷偷上传东西,具体上传什么东西不知,一天耗费我几十个G的流量

通过流量防火墙监控发现bitdock一直在上传东西&#xff0c;目前截止发现已上传了40G的流量 ――――――――――――――――――――――― 程序名称&#xff1a;SystemAudioDetection.exe 程序说明&#xff1a; 路径&#xff1a;D:\BitDock\AudioEngine\SystemAudioDetecti…

【C 字符串】02 字符串函数(命令行参数)

Navigator一、strlen()函数—统计长度二、strcat()函数—拼接三、strncat()函数—strcat()的升级四、strcmp()和strncmp()—比较五、strcpy()和strncpy()—拷贝六、sprintf()函数—合并多个字符串七、其他可能用到的字符串函数八、ctype.h中的字符函数九、把字符串转换为数字十…

在线文章生成工具-原创文章生成工具

在线文章生成器 在线文章生成器是指一种可以在线使用的自动化创造文章的工具。它可以使用自然语言处理&#xff08;NLP&#xff09;技术和人工智能算法提供需要的信息&#xff0c;基于标题、关键字&#xff0c;句子关联性等元素自动创造文章内容&#xff0c;涵盖各种类型&…

双端队列 码蹄集

题目来源&#xff1a;码蹄集 题目描述&#xff1a; 题意分析&#xff1a; 这道题目需要使用到双端队列的数据结构。我们可以借助 STL 中的 deque 来实现这个数据结构。具体来说&#xff0c;我们可以通过 deque 的 push_front 和 push_back 操作在队列的头部和尾部添加元素&am…

地球系统模式(CESM)实践技术应用

目前通用地球系统模式&#xff08;Community Earth System Model&#xff0c;CESM&#xff09;在研究地球的过去、现在和未来的气候状况中具有越来越普遍的应用。于2010年07月推出以来&#xff0c;一直受到气候学界的密切关注。近年升级的CESM2.0在大气、陆地、海洋、海冰、陆冰…

图形库EasyX的学习:)

最近学了一点做小游戏的基本知识&#xff0c;来总结一下&#xff0c;巩固一下记忆&#xff1a; 在这个基础上初学者要先明白vs的下载及基本使用还有图形库的下载及安装&#xff1b; 然后才是正题&#xff1a; 图形库里包含c语法&#xff0c;所以要用c文件&#xff0c;但是除…

Ubantu docker学习笔记(六)容器数据卷——补充实验

文章目录一、volume container二、 data-packed volume container三、利用数据卷驱动共享数据注意要在同一个网络配置下&#xff01;3.1服务端3.2客户端一、volume container 这里我觉得很好理解&#xff0c;volume container是专门为其他容器提供volume的容器。其实也就相当于…

深圳海运到墨西哥需要多长时间

目前&#xff0c;墨西哥的跨境电商商业正在高速发展&#xff0c;并且具有可观的红利。因此&#xff0c;从中国到墨西哥的运输需求很大&#xff0c;特别是海运&#xff0c;是很多跨境电商卖家主要选择的运输方式。 一般而言&#xff0c;中国到墨西哥的跨境卖家们普遍关注海运所需…

“终于我从字节离职了...“一个年薪40W的测试工程师的自白...

”我递上了我的辞职信&#xff0c;不是因为公司给的不多&#xff0c;也不是因为公司待我不好&#xff0c;但是我觉得&#xff0c;我每天看中我憔悴的面容&#xff0c;每天晚上拖着疲惫的身体躺在床上&#xff0c;我都不知道人生的意义&#xff0c;是赚钱吗&#xff1f;是为了更…

【云原生进阶之容器】第五章容器运行时5.8--容器热迁移

《云原生进阶之容器》专题索引: 第一章Docker核心技术1.1节——Docker综述第一章Docker核心技术1.2节——Linux容器LXC第一章Docker核心技术1.3节——命名空间Namespace第一章Docker核心技术1.4节——chroot技术第一章Docker核心技术1.5.1节——cgroup综述

MySQL-存储过程

什么是存储过程我们前面所学习的MySQL语句都是针对一个表或几个表的单条 SQL 语句&#xff0c;但是在数据库的实际操作中&#xff0c;并非所有操作都那么简单&#xff0c;经常会有一个完整的操作需要多条SQL语句处理多个表才能完成。例如&#xff0c;为了确认学生能否毕业&…

015 - C++ 类与结构体对比

今天这期我们主要解决一个问题&#xff0c;就是 C 中的类和结构体有什么区别。 上一期我们讲类的时候&#xff0c; 我们对类有了一些基本的介绍&#xff0c;在本期的学习开始之前你可以先看看那一期。 本期我们有两个术语&#xff0c;结构体 struct&#xff0c;它是 structur…

【终结扩散模型】Consistency Models.OpenAI开源新模型代码,一步成图,1秒18张

【终结扩散模型】Consistency Models.OpenAI开源新模型代码&#xff0c;一步成图&#xff0c;1秒18张0、前言Abstract1. Introduction2. Diffusion Models3. Consistency Models3.1 Definition3.2 Parameterization3.3 Sampling3.4 Zero-Shot Data Editing4. Training Consiste…

MySQL运维13-数据库性能测试

文章目录1、数据库性能指标1.1、事务吞吐率1.2、响应时间2、数据库性能测试的目的3、数据库性能测试的注意事项4、数据库性能测试工具选型4.1、sysbench4.2、mysqlslap5、sysbench测试介绍5.1、sysbench的安装5.1.1、sysbench的正常安装步骤5.1.2、安装中的异常处理5.2、sysben…

数据结构|二叉树的三种遍历方式,你掌握了几种?

目录 1、遍历方式 2、前序遍历 3、中序遍历 1、遍历方式 学习二叉树的结构&#xff0c;最简单的方式就是遍历二叉树。遍历二叉树就是通过某条线路对二叉树的各个结点进行一次访问&#xff0c;访问的方法有三种分为前序遍历、中序遍历、后续遍历&#xff0c;层序遍历它们的遍…

TryHackMe-Year of the Fox(Linux渗透测试)

Year of the Fox 你能熬过狡猾的狐狸吗&#xff1f; 端口扫描 循例nmap 有个域名&#xff0c;加入hosts SMB枚举 smbmap enum4linux -a&#xff0c;枚举到两个账户 Web枚举 进80发现需要登录 上hydra RCE to Getshell 进来可以查看一些文件 bp发现这里存在过滤 burpfuzz一…

数据结构---作业1时间复杂度

本专栏是对自我的平时作业错题及掌握知识不牢固的地方的总结专栏. 1.大O是一个渐进表示法&#xff0c;不会去表示精确的次数&#xff0c;cpu的运算速度很快&#xff0c;估计精确的没有意义。 2. 此函数有一个循环&#xff0c;但是循环没有被执行n次&#xff0c;i每次都是2倍进…

再不转型为ChatGPT程序员,有遭受降维打击的危险

Open AI在演示GPT-4的时候&#xff0c;有这么一个场景&#xff1a;给一个界面草图&#xff0c;就可以生成网页代码。这个演示非常简单&#xff0c;如果界面原型比较复杂呢&#xff1f;像这样&#xff1a;ChatGPT能不能直接生成HTML, CSS,JavaScript代码&#xff0c;把这个网页给…