认识MyBatis

news2024/9/20 20:49:52

MyBatis是什么?

MyBatis是dao层(持久层)框架,它支持自定义SQL、存储过程以及高级映射。

MyBatis 免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的XML或注解来配置和映射原始类型、接口和Java POJo (Plain old java Objects,普通老式Java对象)为数据库中的记录。

MyBatis流行的主要原因在于它的简单性和易使用性。在Java应用程序中,数据持久化层涉及到的工作有:

  • 将从数据库查询到的数据生成所需要的Java对象
  • 将Java对象中的数据通SQL持久化到数据库中

MyBatis通过抽象底层的JDBC代码,自动化封装SQL结果集产生Java对象、Java对象的数据持久化数据库中的过程使得对SQL的使用变得容易

MyBatis的特点

Mybatis 的主要功能是 数据持久化
  • 消除了大量的JDBC冗余代码
  • 能很好地与传统数据库协同工作
  • 提供了与Spring框架的集成支持
  • 提供了与第三方缓存类库的集成支持
  • 引入了更好的性能
     

Mybatis的执行原理

  1. 读取MyBatis 配置文件mybatis-config.xml,加载数据源、事务等

      InputStream in= Resources.getResourceAsStream("mybatis-config.xml");
  2. 加载映射文件mapper.xml

     <mappers>
            <!--resource: sql映射文件的路径 -->
          <!--一次性加载某个包下所有sql映射文件
             要求: sql映射文件与接口必须位于同一个包下
          -->
            <package name="com.fs.shop.mapper"/>
        </mappers>
  3. 定义SQL语句,在上一步的文件中加载。

  4. 创建会话工厂。(SqlSessionFactory)

    private static SqlSessionFactory sqlSessionFactory;  
    sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
  5. 创建会话(SqlSession)

       sqlSession =  sqlSessionFactory.openSession();
  6. 通过Executor 操作数据库

  7. 输入参数和输出结果


mybatis应用程序通过SqlSessionFactoryBuilder从mybatis-config.xml配置文件中构建出SqlSessionFactory,然后,SqlSessionFactory的实例直接开启一个SqlSession,再通过SqlSession实例获得Mapper对象并运行Mapper映射的SQL语句,完成对数据库的CRUD和事务提交,之后关闭SqlSession。

public static void main(String[] args) throws IOException {
 
        // 加载mybatis配置文件
        Reader reader = Resources.getResourceAsReader("config/configuration.xml");
      //  InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
		
        //创建数据工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = builder.build(reader);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);

 
        // 获取mapper接口对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
 
        // 查询
        User user = mapper.selectByPrimaryKey("1");

        //释放会话
        sqlSession.clearCache();
        sqlSession.close();
    }

初始化

 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);

SqlSessionFactory build方法里的XMLConfigBuilder是专门解析mybatis的配置文件的类,parser.parse()的返回值是Configuration对象,Configuration对象的结构和xml配置文件的对象几乎相同。

xml中的配置标签有哪些:

properties(属性),settings(设置),typeAliases(类型别名),typeHandlers(类型处理器),objectFactory(对象工厂),mappers(映射器)等

读取了xml文件各个标签内容并封装到Configuration中的属性中。

解析xml是对把xml文件中的标签内容复制到Configuration中的属性中

SqlSession sqlSession = factory.openSession();

 

MappedStatement  Mybatis内部存储缓存

MappedStatement与Mapper配置文件中的一个select/update/insert/delete节点相对应。

mapper中配置的<select></select>等标签都被封装到了此对象中,然后存储在Configuration对象的mappedStatements属性中,mappedStatements 是一个HashMap,key为hashCode+sqlId+Sql语句 (全限定类名 + 方法名),value为从查询出来映射生成的java对象(MappedStatement对象)。

Map<String, MappedStatement> mappedStatements = new StrictMap<MappedStatement>("Mapped Statements collection")

进入 executor.query()

为本次查询创建缓存的Key,进入query的重载方法中,如果 A进程在对数据库操作的时候 B进程将sqlSession关闭了,会报throw new ExecutorException("Executor was closed."); 

如果缓存中没有本次查找的值,那么从数据库中查询。

从数据库查询,调用查询方法 finally localCache.removeObject(key); 清空该key的value后将再查询结果放入缓存,

SimpleExecutor中实现父类的doQuery抽象方法,传入参数创建StatementHanlder对象来执行查询,创建jdbc中的statement对象,是原生jdbc的执行,StatementHandler进行处理 return handler.query(stmt, resultHandler);  ResultHandler对象,用于对返回的结果进行处理

动态代理——通常的Mapper接口我们都没有实现的方法却可以使用

 当判断解析到接口时,会创建此接口对应的MapperProxyFactory对象,存入HashMap中, key = 接口的字节码对象,value = 此接口对应的MapperProxyFactory对象。

MyBatis初始化时对接口的处理:MapperRegistry是Configuration中的一个属性,它内部维护一个HashMap用于存放mapper接口的工厂类MapperProxyFactory,每个接口对应一个工厂类 

MapperMethod最终调用了执行的方法 .execute(sqlSession, args)

   command.getType() 判断mapper中的方法类型是insert还是delete,最终调用的还是SqlSession中的方法

 

此段为边阅读别人写的博客边复制的 (主要用于能够让自己读得下去。。)

原文链接:http://t.csdn.cn/Yl3Hv


掌握MyBatis的工作原理,要结合JDBC来理解MyBatis的工作原理往往才能更透彻。我们知道,JDBC有四个核心对象:
(1)DriverManager,用于注册数据库连接
(2)Connection,与数据库连接对象
(3)Statement/PrepareStatement,操作数据库SQL语句的对象
(4)ResultSet,结果集或一张虚拟表

而MyBatis也有四大核心对象:
(1)SqlSession对象,该对象中包含了执行SQL语句的所有方法【1】。类似于JDBC里面的Connection 【2】。
(2)Executor接口,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。类似于JDBC里面的Statement/PrepareStatement。
(3)MappedStatement对象,该对象是对映射SQL的封装,用于存储要映射的SQL语句的id、参数等信息。
(4)ResultHandler对象,用于对返回的结果进行处理,最终得到自己想要的数据格式或类型。可以自定义返回类型。

原文链接:http://t.csdn.cn/KlzWU

  •  通过Executor 操作数据库

 SqlSession: 是一个接口

SqlSession是MyBatis中用于和数据库交互的顶层类,通常将它与ThreadLocal绑定,一个会话使用一个SqlSession,并且在使用完毕后需要close。

使用的实现类: DefaultSqlSession

Executor接口的实现类:

BatchExecutor(重用语句并执行批量更新) 

SimpleExecutor(普通的执行器,默认)

执行sql语句的属性: select

  1. 调用CachingExecutor的query()方法, CachingExecutor( 二级缓存) 二级缓存名: transactionalCaches HashMap

  2. 调用BaseExecutor的query()方法 BaseExcutor(一级缓存) 一级缓存: localCache HashMap

  3. 调用SimpleExecutor的doQuery()方法: 从数据库查询

执行selectById selectOne()也是调用selectList() 三目运算

list.isEmpt() || list ==null ? null : list.get(0)

找cache缓存 二级再到一级

BaseExecutor是SimpleExecutor的父类 子类没有的方法 使用的是继承父类的方法

一级缓存没有 才去数据库查询

父类没的方法 是执行子类重写的方法

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

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

相关文章

2022 NCTF

MISC 炉边聚会 卡组代码是 Base64 编码的字节串&#xff0c;exp <?php $deckstring "AAEDAZoFKIwGngXIBrwFzgnQBfIHygf0CIgJkAiBogJ1gjMCPIHtgeeBeAD6AfyB7YHvgbgAAD4AO2B7wFkgnMCMwIga2B/QImgi6BJAIiAn2BOIJAAA"; #这是⼀个⾮常有趣的萨满卡组 $binary bas…

非零基础自学Golang 2 开发环境 2.2 配置GOPATH

非零基础自学Golang 学习文档地址&#xff1a;https://www.topgoer.cn/ 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删【已联系过文档作者】 文章目录非零基础自学Golang2 开发环境2.2 配置GOPATH2.2.1 配置GOPATH2.2.2 go的项目目录2.2.3 适合个人开发…

[附源码]Python计算机毕业设计Django剧本杀交流分享平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

年产2万吨山楂酒工厂的设计-发酵工段及车间的设计(lunwen+任务书+cad图纸)

目录 1前 言 1 2总论 2 2.1设计依据 2 2.2设计指导思想和原则 2 2.3设计范围 2 2.3.1生产部门 2 2.3.2设计图纸 3 2.4工艺设计基本数据和指标 3 2.5生产工艺概述 3 2.6生产设备概述 4 2.7生产工艺流程图 4 2.8生产方法的简单介绍 6 3全程物料衡算 7 3.1全程总物料概算 7 3.1.1山…

MySQL主从同步

©网络研究院 安装环境 基本需求 ——采用CentOS7系统搭建MySQL服务器 ——关闭防火墙 ——关闭SELinux ——软件 MySQL-5.7.17-1 安装MySQL 续&#xff08;1&#xff09; 从官方下载RPM软件包 ——http://dev.mysql.com/downloads/mysql/ ——适用于当前系统的b…

数图互通高校房产管理——校园电子地图

数图互通房产管理系统在这方面做得比较全面&#xff1b; 1、校园电子地图建设方案 支持地图和房间双向无缝对接。通过电子地图选择建筑物&#xff08;平面或立体&#xff09;能够查看建筑物信息、楼层平面布局图或立体图&#xff0c;点击楼层上的房间能够编辑或查看房间信息。…

非零基础自学Golang 2 开发环境 2.4 Git 安装

非零基础自学Golang 学习文档地址&#xff1a;https://www.topgoer.cn/ 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删【已联系过文档作者】 文章目录非零基础自学Golang2 开发环境2.4 Git 安装2.4.1 安装git2 开发环境 2.4 Git 安装 2.4.1 安装git 虽…

Web 性能测试

Web 性能测试 作为网站应用的开发者或维护者&#xff0c;我们需要时常关注网站当前的健康状况&#xff0c;譬如在主流程运行正常的情况下&#xff0c;各方面性能体验是否满足期望&#xff0c;是否存在改进与提升的空间&#xff0c;如何进行快速且准确的问题定位等&#xff0c;…

mongoDB操作文档(全部)

mongoDB 1、创建、查询数据库 创建数据库 use dade 查询数据库 show dbs 2、创建集合、查看 创建集合插入数据 db.集合名.insert({}) db.dade.insert({dade:大得,age:18}) ​ 查看集合 show tables ​ 查看集合中的数据 db.集合名.find() 查询所有 db.dade.find() ​ db.集…

微服务框架 SpringCloud微服务架构 16 SpringAMQP 16.1 基本介绍

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构16 SpringAMQP16.1 基本介绍16.1.1 什么是SpringAMQP16 SpringAMQP 16.1 …

Android -- 每日一问:你在Android开发中遇到的技术难题是什么,你是怎么解决的?

经典回答 一个工作过几年的程序员肯定会有工作中遇到技术难点问题&#xff0c;虽然这个问题有可能对于别人不是技术难点&#xff0c;但只要对于当时的你是技术难点&#xff0c;只要让你抓耳挠腮毫无头绪就往往会在你的大脑中留下深刻的印象。 这个问题&#xff0c;我也比较难…

【三维目标检测】VoteNet(二)

VoteNet数据和源码配置调试过程请参考上一篇博文&#xff1a;【三维目标检测】VoteNet&#xff08;一&#xff09;_Coding的叶子的博客-CSDN博客。本文主要详细介绍VoteNet网络结构及其运行中间状态。 1 VoteNet模型总体过程 VoteNet核心思想在于通过霍夫投票的方法实现了端到…

[附源码]计算机毕业设计基于SpringBoot的高校课程知识库

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

1550_AURIX_TC275_锁相环的操作

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 继续SCU模块的学习&#xff0c;这一次主要是看一下锁相环的操作。锁相环之前接触的不少了&#xff0c;其实主要的一个功能就是提升单片机的时钟主频。 1. 备份时钟其实也是稳定可靠的&…

供应荧光染料FITC-PEG-FA,Folic acid-PEG-Fluorescein,荧光素-聚乙二醇-叶酸

An English name&#xff1a;FITC-PEG-FA&#xff0c;Folic acid-PEG-Fluorescein Chinese name&#xff1a;荧光素-聚乙二醇-叶酸 Item no&#xff1a;X-GF-0247-5k CAS&#xff1a;N/A Formula&#xff1a;N/A MW&#xff1a;荧光素-聚乙二醇5-叶酸、FITC-PEG 2-FA、荧光…

使用Python和SAS Viya分析社交网络

本示例使用Python和SAS分析了预防高危药物研究的结果。这个社交网络有194个节点和273个边&#xff0c;代表药物、使用者之间的联系。最近我们被客户要求撰写关于社交网络的研究报告&#xff0c;包括一些图形和统计输出。 背景 SAS Viya的最新版本提供了用于探索实验问题的全套创…

GIT分布式版本控制系统 | 命令讲解入门

Git概述 Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。 也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件&#xff1b;分布式相比于集中式的最大区别在于开发者可以提交到本地&#xff0c…

车间调度|基于帝王蝶优化算法的车间调度(Matlab代码实现)

目录 1 概述 2 蝴蝶优化算法 3 车间调度 3.1 车间调度描述 3.2 数学模型 4 运行结果 5 参考文献 6 Matlab代码实现 1 概述 随着智能化在制造业中的普及&#xff0c;解决车间生产调度的问题能有效提高车间的工作学习效率&#xff0c;实现车间现场管理的有序化、智能化…

极客时间Kafka - 01 Kafka术语|生产者|消费者|主题|分区|副本|ISR|OSR|AR|HW|LEO|Offset

文章目录1. 为什么需要消息引擎&#xff1f;2. Kafka 相关术语3. Kafka 基本概念1. 为什么需要消息引擎&#xff1f; 答案就是“削峰填谷”。 所谓的“削峰填谷”就是指缓冲上下游瞬时突发流量&#xff0c;使其更平滑。特别是对于那种发送能力很强的上游系统&#xff0c;如果没…

Java—hashCode、equals

文章目录hashCode()介绍hashCode()hashCode方法作用为什么要有hashCode()&#xff1f;equals()equals()作用&#xff1f;为什么重写equals方法必须重写hashcode方法&#xff1f;128陷阱&#xff1f;equals和hashCode的关系——————————————————————————…