当前位置: 首页 > news >正文

Mybatis原理

一. 为什么要使用Mybatis?

1.1 jdbc的使用步骤
首先,在pox.xml中引入MySQl驱动的依赖
第一步, Class.forName 注册驱动
第二步,获取一个Connection。
第三步,创建一个Statement对象。
第四步,execute()方法执行SQL。execute()方法返回一个ResultSet结果集。
第五步,通过ResultSet获取数据,给POJO的属性赋值。
最后,关闭数据库相关的资源,包括ResultSet,Statement,Connection

1.2 jdbc使用存在哪些问题?
重复代码
资源管理
结果集处理
SQL耦合(处理业务逻辑和处理数据的代码是耦合在一起的)

1.3 jdbc问题的解决
Apache在2003年Commons DbUtils工具类,简化对数据库的操作。
DbUtils提供了一个QueryRunner类,它对数据库的增删改查的方法进行了封装。

在这里插入图片描述

private static QueryRunner queryRunner;

在QueryRunner的构造函数里面,可以传入一个数据源,比如这里用Hikari,这样我们就不需要再去写各种创建和释放连接的代码了。

queryRunner = new QueryRunner(dataSource);

通过这个工具类,提供获取QueryRunner实例的方法。
方法封装解决了重复代码的问题,出入数据源解决了资源管理的问题。
怎么把结果集转换为对象呢?比如转换成POJO或者List或者Map? 肯定不能一个属性去set或者put .
我希望做到的是,只要指定一个类型,它就可以自动把结果集给我转换为这种类型。
为了避免给每种类型创建要给自动转换类,在DbUtils里面提供了一系列的支持泛型的ResultSetHandleer,比如:用来把结果集转换为JavaBean的,转换为List的,转换为Map的 等等。
在这里插入图片描述
只要在DAO层调用QueryRunner封装好的查询方法,传入一个指定了类型的Handler,它就可以自动把结果集转换为实体类Bean或者List或者Map。
com.gupaoedu.dbutils.dao.BlogDao.java
比如:传入一个BeanHandler或者BeanListHandler;
在这里插入图片描述
com.gupaoedu.dbutils.QueryRunnerTest测试一下,结果:
BlogDto{bid=3,name=‘丘山一郎’,quthorId=‘null’}

实现的原理

return rs.next()?this.convert.toBean(rs,this.type):null;
最后到了populateBean():
在这里插入图片描述
在这里插入图片描述
通过for循环,把rs的值填充到了指定的类型属性中。
输出的结果中,authorId为什么是空的?
这种自动映射,要求数据库的字段跟对象的属性名称完全一致,才可以实现自动映射。

spring-jdbc
除了DbUtils之外,Spring也对原生的JDBC进行了封装。
1.代码重复——Spring提供了一个模板方法JdbcTemplate,里边封装了各种各样的execute,query,和update方法。
JDBCTemplate这个类(类的注释)
它是JDBC的核心包装类。简化了JDBC的使用,可以避免常见的异常。它封装了JDBC的核心流程,应用只要提供SQL,提取结果集就可以了。它是线程安全的。
初始化的时候可以设置数据源,所以资源管理的问题也可以解决。

public JdbcTemplate(DataSource dataSource){setDataSource(dataSource);afterPropertiesSet();
}

对于结果集的处理,Spring JDBC提供了一个RowMapper接口,可以把结果集转换为Java对象,它作为JdbcTemplate的参数使用。
比如:要把查询tbl_emp表得到的结果集转换为Employee对象,就可以针对一个Employee创建一个RowMapper对象,实现RowMapper接口,并且重写mapRow()方法。在mapRow()方法里面完成对结果集的处理。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

DbUtils 和 Spring JDBC ,这两个对JDBC做了轻量级封装的框架,或者说 工具类里边,帮我们解决的问题:
在这里插入图片描述
在这里插入图片描述

ORM关系型数据库
什么是ORM?为什么叫ORM?
ORM的全称是Object Relaional Mapping,也就是对象与关系的映射,对象是程序里边的对象,关系是它与数据库里面的数据的关系。也就是说,ORM框架帮助我们解决的问题是程序对象和关系型数据库的相互映射的问题。
Hibernate是要给很流行的ORM框架,2001年的时候就出了第一个版本。在使用Hibernate的时候,我们需要为实体类建立一些hbm的xml映射文件。
然后通过Hibernate提供(session)的增删改查的方法来操作对象。
Session相关方法也可以通过继承JpaRepository活得,无需手动创建。
在这里插入图片描述

操作对象根操作数据库的数据一样。Hibernate的框架内会自动帮我们生成SQL语句(可以屏蔽数据库差异),自动进行映射。这样我们呢的代码变得简洁了,程序的可读性也提高了。

总结Hibernate的特性:
1,根据数据方言自动生成SQL,移植性好;
2,自动管理理解资源(支持数据源);
3,实现了对象和关系型数据库的完全映射,操作对象就像操作数据库记录一样;
4,提供了缓存功能机制。

存在的问题:
但是Hibernate在业务复杂的项目中使用也存在一些问题:
1,比如使用get(),update(),save()对象的这种方式,实际操作的是所有字段,没有办法指定部分字段,换句话说就是不够灵活。
2,自动生成SQL的方式,如果要基于SQL去做一些优化的话,是非常困难的,也就是说可能出现性能的问题。
3,不支持动态SQL,比如分表中的表名,条件,参数变化等,无法根据条件自动生成SQL。
因此我们需要一个更加灵活的框架。

Mybatis的核心特性解决了那些问题?

  • 使用连接池对连接进行管理
  • SQL和代码分离,集中管理
  • 结果集映射
  • 参数映射和动态SQL
  • 重复SQL的提取
  • 缓存管理
  • 插件机制

Mybatis核心组件及其生命周期
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

核心配置:
在这里插入图片描述在这里插入图片描述
特殊的类型:typeHandlers
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

objectFactory
当我们把数据库返回的结果集转换为实体类的时候,需要创建对象的实例,由于我们不知道需要处理的类型是什么,右哪些属性,所以不能用new的方式去创建。只能通过反射来创建。

在这里插入图片描述
在这里插入图片描述
如果想要修改对象工厂在初始化实体类的时候的行为,就可以通过创建自己的对象工厂,继承DefaultObjectFactory来实现(不再需要实现ObjectFactory接口)。
例如:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

plugins

在这里插入图片描述
在这里插入图片描述

二.

相关文章:

Mybatis原理

一. 为什么要使用Mybatis? 1.1 jdbc的使用步骤 首先,在pox.xml中引入MySQl驱动的依赖 第一步, Class.forName 注册驱动 第二步,获取一个Connection。 第三步,创建一个Statement对象。 第四步,execute()方法执行SQL。execute()方…...

黑马头条day3-2 自媒体文章管理

前边还有一个 素材列表查询 没什么难度 就略过了 查询所有频道和查询自媒体文章也是和素材列表查询类似 就是普通的查询 所以略过了 文章发布 这个其实挺复杂的 一共三张表 一个文章表 一个素材表 一个文章和素材的关联表 区分修改与新增就是看是否存在id 如果是保存草稿…...

JinDouYun性能测试工具使用方法

1.功能介绍 2. 安卓端支持安卓6及以上的版本,ios支持大部分版本 3. 可以测试游戏,视频,普通应用的性能数据,数据精准,低延迟,无侵入 4.工具下载链接 筋斗云 5.后续功能添加,高版本支持&…...

操作系统 | 学习笔记 | | 王道 | 5.3 磁盘和固态硬盘

5.3 磁盘和固态硬盘 5.3.1 磁盘 磁盘结构 磁盘:磁盘的表面由一些磁性物质组成,可以用这些磁性物质来记录二进制数据 磁道:磁盘的盘面被划分成一个个磁道。这样的一个“圈”就是一个磁道 扇区:一个磁道又被划分成一个个扇区&am…...

【Oauth2整合gateway网关实现微服务单点登录】

文章目录 一.什么是单点登录?二.Oauth2整合网关实现微服务单点登录三.时序图四.代码实现思路1.基于OAuth2独立一个认证中心服务出来2.网关微服务3产品微服务4.订单微服务5.开始测试单点登录 一.什么是单点登录? 单点登录(Single Sign On&…...

WEB领域是不是黄了还是没黄

进入2024年后,WEB领域大批老表失业,一片哀嚎,个个饿的鬼叫狼嚎,为啥呢,下面是我个人的见解和看法。 中国程序员在应用层的集中 市场需求:中国的互联网行业在过去几年中经历了爆炸性增长,尤其是…...

Android系统:系统架构

文章目录 分层设计分块设计总结 分层设计 自上而下分为:应用层、应用架构层、系统运行层、硬件抽象层、Linux内核层 应用层 封装一系列系统App 应用架构层(Framework) 封装一系列运行App需要的Java框架 提供App开发需要的API 系统运行层(Libraries) 封装一系…...

NCNN 源码(1)-模型加载-数据预处理-模型推理

参考 ncnn 第一个版本的代码。 0 整体流程 demo:squeezenet ncnn 自带的一个经典 demo:squeezenet 的代码: // 网络加载 ncnn::Net squeezenet; squeezenet.load_param("squeezenet_v1.1.param"); squeezenet.load_model("squeezenet_…...

重修设计模式-结构型-享元模式

重修设计模式-结构型-享元模式 复用不可变对象,节省内存 享元模式(Flyweight Pattern)核心思想是通过共享对象方式,达到节省内存和提高性能的目的。享元对象需是不可变对象,因为它会被多处代码共享使用,要避…...

JavaScript 运算符

JavaScript 中的运算符可以根据其功能和用途分为几类。以下是主要的运算符类型及其用法: 1. 算术运算符 用于执行基本的数学运算。 : 加法 let sum 5 3; // 8- : 减法 let difference 5 - 3; // 2* : 乘法 let product 5 * 3; // 15/ : 除法 let quotient 5…...

3.js - 运动曲线

这个球,绕着这个红色的线圈转 代码 import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControlslet scene,camera,renderer,controls nulllet moon,earth null// 根据,一系列的点,创建曲线 le…...

免费ppt模板哪里找?职场必备这些利器

一眨眼,9月份的尾声渐近,无论是学生还是职场人士,都开始准备着新一轮的演讲和报告。在这个忙碌的时期,一份精美的PPT模板能够大幅提升你的工作效率,让你的演示更加引人入胜。 不用担心高昂的版权费用,市场…...

wampserve 配置本地域名,出现错误

概述 今天更换了电脑,在本地安装和配置docker的时候,想用自定义域名访问NGINX容器,127.0.0.1和localhost都可以访问,但是自定义域名无法访问, 接着去捯饬已经使用的wampserver的集成环境,出现了同样的问题…...

MySQL慢查询优化指南

​ 博客主页: 南来_北往 系列专栏:Spring Boot实战 前言 当遇到慢查询问题时,不仅影响服务效率,还可能成为系统瓶颈。作为一位软件工程师,掌握MySQL慢查询优化技巧至关重要。今天,我们就来一场“数据库加速之旅…...

怎么录制游戏视频?精选5款游戏录屏软件

对于热爱游戏的你来说,记录游戏中的精彩瞬间并分享给朋友或粉丝,无疑是一种享受。然而,在众多录屏软件中,如何选择最适合你的那一款?今天,我们就为大家精选了五款游戏录屏软件,需要的朋友快来选…...

论文阅读 - MDFEND: Multi-domain Fake News Detection

https://arxiv.org/pdf/2201.00987 目录 ABSTRACT INTRODUCTION 2 RELATED WORK 3 WEIBO21: A NEW DATASET FOR MFND 3.1 Data Collection 3.2 Domain Annotation 4 MDFEND: MULTI-DOMAIN FAKE NEWS DETECTION MODEL 4.1 Representation Extraction 4.2 Domain Gate 4.…...

LabVIEW软件出现Bug如何解决

在LabVIEW开发中,程序出现bug是不可避免的。无论是小型项目还是复杂系统,调试与修复bug都是开发过程中的重要环节。下文介绍如何有效解决LabVIEW软件中的bug,包括常见错误类型、调试工具、错误处理机制。 1. 常见Bug类型分析 在LabVIEW中&am…...

【数据结构-栈】力扣844. 比较含退格的字符串

给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。 注意:如果对空文本输入退格字符,文本继续为空。 示例 1: 输入:s “ab#c”, t “…...

DataFrame生成excel后为什么多了一行数字

问题描述 python查询数据生成excel文件,生成的excel多了第一行数字索引,1,2,3,4,5...... 代码: df pd.DataFrame(data)df.to_excel(filename, sheet_name用户信息表, indexFalse) 解决: 原理也很简单,就是设置个参…...

linux 内存屏障(barrier)分析

谈起内存屏障,大家感觉这个"玩意儿"很虚,不太实际,但是内核代码中又广泛地可以看到起身影。内存屏障,英文barrier,这个"玩意儿"它还不太好去定义它。barrier,中文翻译为栅栏,栅栏大家都见过,现实生活中就是防止他人或者动物非法闯入而用来进行隔…...

【人工智能】Transformers之Pipeline(十九):文生文(text2text-generation)

目录 一、引言 二、文生文(text2text-generation) 2.1 概述 2.2 Flan-T5: One Model for ALL Tasks 2.3 pipeline参数 2.3.1 pipeline对象实例化参数 2.3.2 pipeline对象使用参数 ​​​​​​​ 2.3.3 pipeline返回参数 ​​​​​​​​​​​…...

如何使用ssm实现基于VUE的儿童教育网站的设计与实现+vue

TOC ssm676基于VUE的儿童教育网站的设计与实现vue 第一章 课题背景及研究内容 1.1 课题背景 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全…...

MODBUS TCP 转 CANOpen

产品概述 SG-TCP-COE-210 网关可以实现将 CANOpen 接口设备连接到 MODBUS TCP 网络中。用户不需要了解具体的 CANOpen 和 Modbus TCP 协议即可实现将CANOpen 设备挂载到 MODBUS TCP 接口的 PLC 上,并和 CANOpen 设备进行数据交互。 产品特点 &#xf…...

vue2+elementUI实现handleSelectionChange批量删除-前后端

功能需求&#xff1a;实现选中一个或多个执行批量删除操作 在elementUI官网选择一个表格样式模板&#xff0c;Element - The worlds most popular Vue UI framework 这里采用的是 将代码复制到前端&#xff0c;这里是index.vue <template><el-button type"dang…...

LLMs之OCR:llm_aided_ocr(基于LLM辅助的OCR项目)的简介、安装和使用方法、案例应用之详细攻略

LLMs之OCR&#xff1a;llm_aided_ocr(基于LLM辅助的OCR项目)的简介、安装和使用方法、案例应用之详细攻略 目录 llm_aided_ocr的简介 1、特性 2、详细技术概览 PDF处理和OCR PDF到图像转换 OCR处理 文本处理流程 分块创建 错误校正与格式化 重复内容移除 标题和页码…...

低代码平台后端搭建-阶段完结

前言 最近又要开始为跳槽做准备了&#xff0c;发现还是写博客学的效率高点&#xff0c;在总结其他技术栈之前准备先把这个专题小完结一波。在这一篇中我又试着添加了一些实际项目中可能会用到的功能点&#xff0c;用来验证这个平台的扩展性&#xff0c;以及总结一些学过的知识。…...

暑假考研集训营游记

文章目录 摘要&#xff1a;1.对各大辅导机构考研封闭集训营的一些个人看法&#xff1a;2.对于考研原因一些感想&#xff1a;结语 摘要&#xff1a; Ashy在暑假的时候参加了所在辅导班的为期一个月的考研封闭集训营&#xff0c;有了一些全新的感悟&#xff0c;略作记录。 1.对…...

C#中的报文(Message)

在C#中&#xff0c;报文&#xff08;Message&#xff09;通常是指在网络通信中交换的数据单元。报文可以由多种不同的组成部分构成&#xff0c;具体取决于通信协议和应用场景。 以下是一些常见的报文组成部分&#xff1a; 头部&#xff08;Header&#xff09;&#xff1a;包含…...

Python知识点:如何使用Python与Java进行互操作(Jython)

开篇&#xff0c;先说一个好消息&#xff0c;截止到2025年1月1日前&#xff0c;翻到文末找到我&#xff0c;赠送定制版的开题报告和任务书&#xff0c;先到先得&#xff01;过期不候&#xff01; Jython 是一种完全兼容 Java 的 Python 实现&#xff0c;它将 Python 代码编译成…...

ffmpeg解封装解码

文章目录 封装和解封装封装解封装 相关接口解封装的流程图关于AVPacket的解释如何区分不同的码流&#xff0c;视频流&#xff0c;音频流&#xff1f;第一种方式av_find_best_stream第二种方式 通过遍历流 代码 封装和解封装 封装 是把音频流 &#xff0c;视频流&#xff0c;字…...