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

2023MySQL+MyBatis知识点整理

文章目录

  • 主键 外键 的区别?
  • 什么是范式?
  • 什么是反范式?
  • 什么是事务?
  • MySQL事务隔离级别?
  • MySQL事务默认提交模式?
  • MySQL中int(1)和int(10)的区别
  • MySQL 浮点数会丢失精度吗?
  • MySQL支持哪几种时间类型?
  • MySQL中自增ID如果用完了,会怎么样?
  • 自增ID一定连续吗?
  • 什么是索引?
  • 索引有什么用?(优缺点)
  • 为什么索引能提交查询效率?
  • 索引的的设计有哪些原则?
  • 什么情况下应不建或少建索引?
  • 索引种类?
  • 索引常规命名规范
  • MySQL索引实现是什么数据结构?
  • MySQL索引为什么选用B+Tree?
  • B+树索引和哈希索引的区别?
  • 索引有哪些失效场景?
  • MySQL中的IN 和 NOT IN 会走索引吗?
  • MySQL中为什么不建议使用IN 和 NOT IN?
  • MySQL 统计 count(*) count(字段) count(1) 推荐用哪个?
  • 默认表引擎?
  • MySQL引擎MyISAM和InnoDB的区别?
  • char和varchar的区别?
  • MySQL联表查询时,用那个表做驱动表?
  • MySQL联表查询join有什么要注意的?
  • union 和 union all的区别?
  • 什么是存储过程?
  • 为什么要有存储过程?有什么优势?
  • 阿里巴巴为什么禁止使用存储过程?
  • 什么是触发器?
  • MySQL 的 drop、delete、truncate 区别?
  • MySQL 怎么实现分页查询?
  • MySQL高可用方案有哪些?
  • 如何分析一条SQL语句的执行计划和性能?
  • MySQL查询优化有哪些方法?
  • MySQL模糊查询会导致索引失效吗?
  • MySQL怎么记录慢查询语句?
  • 开启慢查询
  • 指定记录慢查询语句的日志文件
  • 指定慢查询阈值,超过这个值将记录日志,默认10s
  • MySQL支持查询结果缓存吗?
  • MySQL如何解决单表数据量过大,查询变慢的问题?
  • 怎么理解数据库中的乐观锁?
  • 怎么理解数据库中的悲观锁?
  • MySQL中 for update锁的是什么?
  • MySQL 中的 MVCC 是指什么?
  • MySQL InnoDB 的 MVCC 实现机制?
  • MySQL什么情况会发生死锁?
  • MySQL产生死锁有哪些必要条件?
  • MySQL 死锁怎么排查?
  • MySQL如何解决死锁?
  • MySQL如何避免死锁?
  • MySQL有哪些类型的日志?
  • MySQL中的binlog日志是什么?
  • MySQL中的binlog日志有什么用?
  • MySQL中的relay log日志是什么?
  • MySQL中的Change buffer是什么?
  • MySQL中的Buff Pool是什么?
  • MySQL中主从同步(异步复制)流程?
  • MySQL异步复制会丢失数据吗?
  • 什么是表分区?
  • 表分区有什么好处?
  • 表分区与分表的区别?
  • MySQL批量插入,如何不插入重复数据?
  • MySQL中为什么不建议使用UTF-8
  • MySQL为什么不建议用UUID做主键?
  • MySQL提高并发可以调整哪些参数?
  • MyBatis是什么框架?
  • 常用的ORM(对象关系映射)框架有哪些?
  • MyBatis为什么时半自动ORM映射?
  • MyBatis优点:
  • MyBatis缺点:
  • MyBatis 和 JDBC 的区别?
  • JPA是什么框架?
  • Spring Data JPA 和 JPA 的区别?
  • MyBatis和Hibernate的区别
  • MyBatis有哪些核心组件?
  • MyBatis执行流程是怎样的?
  • MyBatis中的SqlSession是线程安全的吗?
  • MyBatis中SqlSession有哪些实现?
  • MyBatis中的缓存机制有啥用?
  • MyBatis中 一级缓存 和 二级缓存的区别?
  • MyBatis一级缓存和二级缓存是什么数据结构?
  • MyBatis中的缓存什么时候会被清理?
  • MyBatis接口绑定有哪几种方式?
  • MyBatis中Mapper接口的实现原理?
  • MyBatis中 $ 和 # 传参的区别?
  • MyBatis怎么实现分页?
  • MyBatis如何防止SQL注入?
  • MyBatis如何获取自动生成的主键ID?
  • 什么是预编译?
  • 预编译有哪些好处?
  • MyBatis中的事务管理方式?
  • MyBatis中怎么开启事务?
  • MyBatis使用了哪些设计模式?
  • 简单介绍下MyBatis-Plus,说在它和MyBatis的区别?

主键 外键 的区别?

主键:记录的唯一表示,不能重复,不能为空,默认为聚集索引,用来保证数据完整性
外键:表的某列是另一表的逐渐,可以重复,可以为空,用来和其他表关联

什么是范式?

一系列设计数据库模型的规范。
第一范式:原子性约束,不可再分解
第二范式:唯一性约束
第三范式:字段没有冗余

什么是反范式?

性能优化策略,通过在表中增加冗余数据提高数据库读取性能。

什么是事务?

一系列操作要不全部成功,要不全部失败(只要其中一个环节失败就会触发回滚恢复到执行前状态)
ACID(原子性、一致性、隔离性、持久性)

脏读:一个事务读取到了其他事务还未提交的数据
不可重复读:相同SQL查到同一条数据值不一样
幻读:条数不一样

MySQL事务隔离级别?

读未提交:都不能避免
读已提交:避免脏读
可重复读:避免脏读、不可重复读(MySQL默认)
串行化:都能避免,效率最差,每次读都要获取表共享锁,读写阻塞

MySQL事务默认提交模式?

AUTO COMMIT自动提交,如果不显示的开启一个事务,每条SQL默认当作一个事务自动提交

MySQL中int(1)和int(10)的区别

int(1) 和 int(10) 在存储数据和取值范围上没有区别,它们都是 4 字节(32 位)的整数类型。它们的区别在于显示宽度,int(1) 在查询结果中会尽量以宽度为 1 的字符显示,而 int(10) 则会以宽度为 10 的字符显示。实际上,显示宽度只是一种控制输出格式的设置,并不影响存储或计算的实际数据。

MySQL 浮点数会丢失精度吗?

会(float/double存储的是近似值),对于精度比较高的,建议使用decimal(定点型数据结构,字符串形式保存)

MySQL支持哪几种时间类型?

DATE:1000-01-01 ~ 9999-12-31
DATETIME:1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
TIMESTAMP:1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC

MySQL中自增ID如果用完了,会怎么样?

如果用的是 INT UNSIGNED,最大值为42亿多,达到上限后再分配还是最大值,插入会报错主键冲突。

可以用范围大的BIGINT UNSIGNED。

自增ID一定连续吗?

不一定
1、删除记录
2、回滚操作
3、批量插入
4、主键冲突

什么是索引?

索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,相当于图书的目录,可以根据目录中的页码快速找到所需的内容(以B+树的形式存储在磁盘)。

索引有什么用?(优缺点)

优点:
加快检索速度
唯一索引保证数据唯一性
加速表连接(join 关联字段加索引)
缺点:
需要占用额外的物理空间
创建和维护索引耗费性能(所以写多读少不建议用索引)
对表中数据增删改时,索引也要动态维护,降低了数据的维护速度

为什么索引能提交查询效率?

索引时有序的(B+Tree)
因为有序,所以查询不用便利,二分查找即可,logN

索引的的设计有哪些原则?

对于经常查询的字段,建议创建索引
索引不是越多越好,因为会占用额外的磁盘空间,而且影响增删改的性能
数据量小的表不加索引,查询性能优化不明显,维护还要额外耗费性能
枚举类型字段不加索引(如性别),起不到优化效果
字段具有唯一性特征时,建议用索引,提高查询速度
可以使用组合索引(最左匹配原则)

什么情况下应不建或少建索引?

表中数据太少
经常插入、删除、修改的表
表数据重复(枚举型字段,如性别)

索引种类?

按照逻辑分组:
普通索引:只起到加速效果,允许重复和空
唯一索引:加速查询+列值唯一(可以有null)
主键索引:加速查询+列值唯一(可以有null)+ 表中只有一个(未指定也有默认的)
复合索引:多个列组成一个索引,最左匹配
全文索引:MySIAM&InnoDB支持,只能用在char、varchar、text字段,可以通过关键字找到该字段所属行
按照物理分组:
聚集索引:MySQL中默认主键为聚集索引,聚集索引分配数据时存储顺序与索引逻辑顺序相同,这样可以让数据做到范围检索,数据按序存储,通过聚集索引可以按需检索减少磁盘IO
非聚集索引(也叫二级索引):除主键外都是,索引顺序和表数据存储顺序不同,索引中存放数据地址,可在定位索引列后快速定位行记录

索引常规命名规范

主键索引(primary):pk_字段名
唯一索引(unique):uk_字段名
普通索引(index):idx_name_age

MySQL索引实现是什么数据结构?

InnoDB和MyISAM:B+Tree
Memory:Hash

一个表最多64个索引,复合索引最多16个列

MySQL索引为什么选用B+Tree?

提高索引查询时的磁盘IO效率,提交范围查询的效率(有序)
所有查询都要查找到叶子节点,查询性能稳定

B+树索引和哈希索引的区别?

1、哈希不能进行范围查询
2、哈希不支持联合索引
3、如果列重复数据较多,存在哈希碰撞,会减低检索效率

索引有哪些失效场景?

不符合最左匹配原则
like 模糊匹配以 %开头
索引列使用了函数、表达式计算
join 条件中索引列数据类型不一致
使用了 !=、 <>、 IN、 NOT IN、is null、is not null 判断条件
查询条件使用了or,要想索引生效,or中的每个列都要加上索引

MySQL中的IN 和 NOT IN 会走索引吗?

不一定。IN正常是走索引的,但如果IN范围过大会导致索引失效;NOT IN也一样,MySQL查询优化器会根据当前表的情况选择最优方案。

MySQL中为什么不建议使用IN 和 NOT IN?

如果条件范围过大,会导致索引失效而全表扫描
建议使用 EXISTS 或 NOT EXISTS代替 或 使用 JOIN 连接代替

MySQL 统计 count(*) count(字段) count(1) 推荐用哪个?

性能排序:count() > count(1) > count(主键) > count(字段)
因为MySQL优化器对count(
)做了深度优化

默认表引擎?

5.5前 MyIASM、5.5开始InnoDB

MySQL引擎MyISAM和InnoDB的区别?

MyISAM不支持事务,InnoDB支持事务
MyISAM只支持表级锁,InnoDB支持表级锁和行级锁
MyISAM不支持外键,InnoDB支持
MyISAM可以没有主键,InnoDB必有(默认也有)

char和varchar的区别?

char长度固定,varchar可变
char(10):值abc,存储为abc+7个空格,有补齐
varchar(10):值abc,存储就是abc(自动变成3个长度)
char最多255个字符,varchar最大长度 65535个字节

MySQL联表查询时,用那个表做驱动表?

小表驱动大表

MySQL联表查询join有什么要注意的?

超过3个表最好不要用join
需要join的字段,数据类型要保持一致,保证join字段用上索引
使用explain分析SQL性能,再决定是否用join

union 和 union all的区别?

union:对两个查询结果进行合并,不包括重复行,会进行默认排序
union all:对两个查询结果进行合并,包括重复行,不会进行排序
因为unnion 排序去重性能会很慢,一般建议用union all进行结果合并。

什么是存储过程?

存储过程是一组完成特定功能的SQL语句。存储过程可以理解为是一个函数,可以有输入、输出,它可以像写代码一样完成一系列的逻辑。
create procedure 存储过程名(参数列表)
begin
// 存储过程体
end;

为什么要有存储过程?有什么优势?

可以在数据库端实现特定、复杂功能
存储过程可以复用
一次编译,永久有效,减少与服务器连接交互次数
存储过程SQL参数化,可以有效预防SQL注入攻击
SQL每次执行都会进行编译,存储过程只需要编译一次,预先编译,可多次执行。

阿里巴巴为什么禁止使用存储过程?

难以调试和扩展
一致性较差

什么是触发器?

触发器也是数据库表有关的数据库对象,当满足预设的条件时触发,并执行触发器中定义的语句集合。
举个例子:
当删除A表的某条数据时,如果有触发器,就会触发删除B表的某条数据。
6种触发器(Before insert、After insert、Before Update、After Update、Before Delete、After Delete)
不建议使用
太消耗资源
难以调试扩展
移植性差
出现问题难以定位排查

MySQL 的 drop、delete、truncate 区别?

drop:删除表的数据及表结构,以及被依赖的约束、索引、触发器
truncate:清空物理文件,即清空表所有内容,但不删除表结构
delete:逻辑删除数据,按行删除,可以指定where条件
速度上:drop > truncate > delete

MySQL 怎么实现分页查询?

limit。传两个参数,分别是第一个记录的偏移量(从0开始)和返回记录行数。
如:查询第5-20行记录
select * from table limit 4,16

MySQL高可用方案有哪些?

主从复制
MySQL Cluster
MySQL + MMM
MySQL + MHA (成熟,常用)

如何分析一条SQL语句的执行计划和性能?

explain ${SQL}
通过explain可以知道:
表的读取顺序
数据读取操作的操作类型
哪些索引可以使用
哪些索引被实际使用
表直接的引用
每张表有多少行被优化器查询

MySQL查询优化有哪些方法?

不要在索引列使用表达式计算
不要在索引列使用 IS NULL 和 IS NOT NULL
用 EXISTS 替代 IN
使用索引避免全表扫描
不要select *
尽量别用外键
索引字段不用范围查询
避免大事务操作,提高系统并发能力
where判断null影响效率,尽量给字段一个默认值
学会用explain命令进行分析

MySQL模糊查询会导致索引失效吗?

用like模糊查询时,%(匹配多个字符) 和 _(只匹配一个字符) 通配符放在前面会导致索引失效(放后面不会)

MySQL怎么记录慢查询语句?

可以在MySQL中开启慢查询日志:

开启慢查询

slow_query_log=1

指定记录慢查询语句的日志文件

slow_query_log_file=slow_query.log

指定慢查询阈值,超过这个值将记录日志,默认10s

long_query_time=10

MySQL支持查询结果缓存吗?

MySQL如何解决单表数据量过大,查询变慢的问题?

1、表分区
2、分库分表
3、冷热归档

怎么理解数据库中的乐观锁?

相当于Java中的CAS,通过版本号比对的方式避免阻塞,适合读多写少场景。

怎么理解数据库中的悲观锁?

相当于java 中的 synchronized,阻塞,同期只有一个事务可以更新,其他需等待。适用写多读少场景。
如:update table set column=‘value’ for update 这种情况where条件一定要用索引字段,这样才会是行锁,否则是表锁会更慢。

MySQL中 for update锁的是什么?

索引字段:锁住行
普通字段:锁住整张表

MySQL 中的 MVCC 是指什么?

MVCC:Muti-Version Concurrency Control,多版本并发控制。
通过版本控制避免阻塞加锁,提升并发性能。
实现了非阻塞的读操作,写操作也只锁定必要的行。

MySQL InnoDB 的 MVCC 实现机制?

InnoDB既支持行级锁,也支持表级锁,默认行级锁

MySQL的行锁并不是直接锁记录,而是锁索引

MySQL什么情况会发生死锁?

两个或两个以上事务在执行过程中因争抢锁资源而造成的互相等待就是死锁。

MySQL产生死锁有哪些必要条件?

MySQL 死锁怎么排查?

MySQL如何解决死锁?

MySQL如何避免死锁?

MySQL有哪些类型的日志?

MySQL中的binlog日志是什么?

MySQL中的binlog日志有什么用?

MySQL中的relay log日志是什么?

MySQL中的Change buffer是什么?

MySQL中的Buff Pool是什么?

Change buffer:优化增删改性能
buffer pool:优化查询性能

MySQL中主从同步(异步复制)流程?

Master进行数据更新
Master将事务Binlog事件写入到Binlog文件中
Master的Dump线程通知Slave有新的事务并发送Binlog
Slave的IO线程接收到Binlog并写入到自己的relay log中
Slave的SQL线程再写入到本地数据库完成数据同步

MySQL异步复制会丢失数据吗?

什么是表分区?

表分区是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分。
从逻辑上看,分区只有一张表,但是底层却是由多个物理分区组成。

表分区有什么好处?

存储更多数据
优化查询性能
更容易维护
避免表扩展瓶颈

表分区与分表的区别?

分表:指的是通过一定规则,将一张表分解成多张不同的表,比如将用户订单记录根据时间分成多个表
分表与分区的区别在于:分区从逻辑上来讲只有一张表,而分表则是将一张表分解成多张表

MySQL批量插入,如何不插入重复数据?

MySQL中为什么不建议使用UTF-8

因为MySQL中的UTF-8不是真正的UTF-8。。。。。“utf8mb4” 才是。。。

MySQL为什么不建议用UUID做主键?

MySQL提高并发可以调整哪些参数?

max_connection:最大连接数,默认151
back_log:积压请求栈的大小,默认151
table_open_cache:打开表缓存的数量,默认为4000
thread_cache_size:数据库端连接池的大小,默认为9
innodb_lock_wait_timeout:行锁等待超时时间,默认为50s

MyBatis是什么框架?

常用的ORM(对象关系映射)框架有哪些?

Hibernate
MyBatis(半自动ORM)
Spring Data JPA(底层为Hibernate)

MyBatis为什么时半自动ORM映射?

MyBatis优点:

基于SQL,使用简单,可直接编写SQL语句
提供映射标签,支持对象与表的字段映射
提供了大量常用的api操作,简化开发工作
与Spring集成友好,可以快速搭建项目进行开发
支持二级缓存,可以避免重复的数据库请求,提升查询性能

MyBatis缺点:

和Hibernate比较需要有额外的SQL编写工作
SQL语句依赖具体的数据库,移植性相对较差

MyBatis 和 JDBC 的区别?

MyBatis是对JDBC的封装,它消除了几乎所有的JDBC代码和参数的手工设置。
MyBatis的优势如下:
优化连接的频繁获取和释放
可使用XML/注解方式编写SQL,可以更灵活的动态进行SQL处理,维护性更好
支持对结果集进行对象映射、缓存等性能优化

JPA是什么框架?

Spring Data JPA 和 JPA 的区别?

国内一般用MyBatis,因为编写SQL方便。

MyBatis和Hibernate的区别

MyBatis支持编写SQL,上手简单,调优自由,hibernate通过HQL语句自动生成SQL,性能无法优化
MyBatis是半ORM,需要手动映射类和表
MyBatis需要写原生SQL,不同数据库间移植性会差些

MyBatis有哪些核心组件?

SqlSessionFactoryBuilder:用于创建SqlSessionFactory的构建器
SqlSessionFactory:用于创建SqlSession的工厂
SqlSession:用于执行SQL语句和管理事务的接口
Mapper:用于定义SQL语句的接口
Configuration:MyBatis全局配置类,包括数据库连接池、缓存等
Executor:用于执行SQL语句的执行器
StatementHandler:用于处理SQL的处理器
ResultSetHandler:用于处理查询结果的处理器
TypeHandler:用于处理Java类型和数据库类型之间的转换

MyBatis执行流程是怎样的?

根据MyBatis配置文件创建SqlSessionFactory工厂对象
创建SqlSession会话对象,该对象中包含了执行SQL语句的所有方法,其中包括SQL的类型、ID、参数等信息
创建Executor执行期对象,它会根据SqlSession传递的参数动态生成SQL,同时负责查询索引的维护
通过StatementHandler对象执行SQL语句,并使用ParameterHandler处理参数
通过ResultSetHandler和TypeHandler将结果集映射为Java对象

MyBatis中的SqlSession是线程安全的吗?

MyBatis中SqlSession有哪些实现?

MyBatis中的缓存机制有啥用?

MyBatis中的缓存分为两级:一级缓存、二级缓存,MyBatis可以将数据库查询的结果缓存到内存中,下次查询时直接从内存中获取,避免了频繁对数据库的访问,从而提升查询效率。
数据查询流程:
在同一个SqlSession中,如果执行了相同的查询语句,MyBatis会首先检查一级缓存中是否存在缓存结果,如果存在,则直接返回缓存的结果,否则会执行查询并将查询结果缓存到一级缓存中
在新的SqlSession中,如果二级缓存开启,先判断二级缓存有没有数据,如果有就直接返回;如果没有,就查询一级缓存,如果有就返回,没有就查询数据库。

MyBatis中 一级缓存 和 二级缓存的区别?

一级缓存时一个在SqlSession内部共享的缓存区域,即SqlSession级别的缓存,它是基于对象引用实现的,它会缓存查询出来的结果对象,当SqlSession提交、关闭以及其他的更新数据库的操作发生后,一级缓存就会晴空
二级缓存是Mapper级别的缓存,是跨SqlSession的,同一个Mapper的SqlSession都共享一个二级缓存。二级缓存存储的是数据,当命中二级缓存时,通过存储的数据构造对象返回
只有当一级缓存SqlSession对象使用完并提交或者关闭时,才会提交到二级缓存中

MyBatis一级缓存和二级缓存是什么数据结构?

一级缓存即本地缓存,使用了一个HashMap集合对象来保存结果
二级缓存要看缓存类型,默认为LRU,使用LinkedHashMap集合对象来保存结果

MyBatis默认开启一级缓存,默认不开启二级缓存。原因是:
多个SqlSession共享,会出现数据一致性问题
频繁更新的数据,缓存命中率会降低,反而会增加频繁更新缓存的性能开销
占用额外的内存资源

MyBatis中的缓存什么时候会被清理?

MyBatis接口绑定有哪几种方式?

两种:XML配置文件 、 @Mapper注解

同样SQL编写形式也是这两种。

MyBatis中Mapper接口的实现原理?

MyBatis中 $ 和 # 传参的区别?

MyBatis怎么实现分页?

使用RowBounds对象实现分页
sqlSession.selectList(“getUserList”, null, new RowBounds(offset, limit))
通过SQL实现分页
select * from user limit #{offset}, #{limit}
使用分页插件 (MyBatis-Plus框架分页或者PageHelper分页插件)

MyBatis如何防止SQL注入?

不要使用 + 号拼接SQL
使用 #{} 传参数,不要使用 ${}
in 条件中的多个值使用 循环语法
后端逻辑中做好参数检查

MyBatis如何获取自动生成的主键ID?

什么是预编译?

预编译有哪些好处?

在这里插入图片描述

MyBatis中的事务管理方式?

MyBatis 提供了多种事务管理方式,包括 JDBC 事务管理、Spring 事务管理和手动控制事务。

MyBatis中怎么开启事务?

在 MyBatis 中,你可以通过以下方式来开启事务:
使用 XML 配置文件:
在 MyBatis 的 XML 配置文件中,你可以配置事务管理器和事务属性来开启事务。首先,需要配置一个数据源(DataSource)和一个事务管理器(TransactionManager)。然后,在需要开启事务的 SQL 语句执行的方法上添加 标签,并指定事务管理器的名称。例如:

使用注解:
在使用注解的方式时,你可以在需要开启事务的方法上添加 @Transactional 注解。同时,你需要配置一个事务管理器,并将其作为参数传递给 @Transactional 注解。例如:
@Mapper
public interface UserMapper {

@Transactional(transactionManager = “transactionManager”)
void insertUser(User user);

// 其他方法
}

手动控制事务:
如果你选择手动控制事务的方式,你可以在代码中显式地开启事务,并在事务中执行相应的 SQL 操作。例如:
SqlSession sqlSession = sqlSessionFactory.openSession();
Transaction transaction = sqlSession.getTransaction();
try {
transaction.begin();

// 执行 SQL 操作

transaction.commit();
} catch (Exception e) {
transaction.rollback();
} finally {
sqlSession.close();
}

需要注意的是,无论你选择哪种方式来开启事务,都需要确保在事务结束后进行提交或回滚操作,以保证数据的一致性和完整性。
总结起来,在 MyBatis 中可以通过 XML 配置文件、注解或手动控制的方式来开启事务。你可以根据具体需求选择适合的方式,并在事务结束后进行提交或回滚操作。

MyBatis使用了哪些设计模式?

MyBatis 使用了以下几种设计模式:
Builder 模式:
MyBatis 的配置文件(XML)中使用了 Builder 模式来构建配置对象。通过使用 Builder 模式,可以灵活地设置各种属性,并创建一个完整的配置对象。
Factory 模式:
MyBatis 使用了工厂模式来创建和管理 SqlSessionFactory、SqlSession 和 Mapper 等重要对象。通过工厂模式,可以将对象的创建和初始化过程进行封装,提供统一的接口来获取对象实例。
Proxy 模式:
MyBatis 使用了动态代理技术,基于接口生成 Mapper 接口的代理对象。这样,MyBatis 可以在运行时动态地生成代理类,并在代理类中执行相应的 SQL 操作。
Template 模式:
MyBatis 的 SqlSession 提供了模板模式的实现。SqlSession 提供了一系列方法,如 selectOne(), insert(), update() 等,这些方法定义了数据库操作的模板,用户只需要提供具体的 SQL 语句和参数即可。
Observer 模式:
MyBatis 中的映射文件(XML)使用了观察者模式。在映射文件中,可以通过 标签定义结果映射规则,将查询结果映射到 Java 对象上。这里的映射规则可以看作是观察者模式中的观察者,它观察数据库查询结果的变化并进行相应的映射。
Singleton 模式:
MyBatis 中的 SqlSessionFactory 是一个单例对象,通过单例模式来保证只有一个实例存在。这样可以避免重复创建 SqlSessionFactory 对象,提高性能和资源利用率。
总结起来,MyBatis 使用了 Builder、Factory、Proxy、Template、Observer 和 Singleton 等多种设计模式。这些设计模式使得 MyBatis 可以更好地实现功能的解耦、灵活性和可扩展性。

简单介绍下MyBatis-Plus,说在它和MyBatis的区别?

MyBatis-Plus 是一个基于 MyBatis 的增强工具,与 MyBatis 相比,它具有以下区别:
提供了更丰富的功能和方法,如分页查询、逻辑删除、条件构造器、代码生成器等。
简化了 CRUD 操作的编写,减少了重复的代码。
支持使用注解来配置实体类和 Mapper 接口,减少了 XML 配置文件的编写。
引入了 Lambda 表达式的支持,可以通过 Lambda 表达式进行条件查询,使代码更直观、简洁。
可以与 Spring、Spring Boot 等框架进行集成,提供了更便捷的配置和使用方式。
支持多种数据库,如 MySQL、Oracle、SQL Server 等。
完全兼容 MyBatis,可以无缝集成到已有的 MyBatis 项目中。
总结起来,MyBatis-Plus 是一个基于 MyBatis 的增强工具,相比于 MyBatis,它提供了更丰富的功能和方法,简化了 CRUD 操作的编写,支持注解配置和 Lambda 表达式,可以与其他框架集成,并支持多种数据库。同时,它与 MyBatis 完全兼容,可以无缝集成到已有的 MyBatis 项目中。

相关文章:

2023MySQL+MyBatis知识点整理

文章目录 主键 外键 的区别&#xff1f;什么是范式&#xff1f;什么是反范式&#xff1f;什么是事务&#xff1f;MySQL事务隔离级别&#xff1f;MySQL事务默认提交模式&#xff1f;MySQL中int(1)和int(10)的区别MySQL 浮点数会丢失精度吗&#xff1f;MySQL支持哪几种时间类型&a…...

【随笔】如何使用阿里云的OSS保存基础的服务器环境

使用阿里云OSS创建一个存储仓库&#xff1a;bucket 在Linux上下载并安装阿里云的ossutil工具 // 命令行&#xff0c;是linux环境 3. 安装ossutil。sudo -v ; curl https://gosspublic.alicdn.com/ossutil/install.sh | sudo bash 说明:安装过程中&#xff0c;需要使用解压工具…...

汽车电子笔记之:AUTOSA架构下的多核OS操作系统

目录 1、AUTOSAR多核操作系统 1.1、OS Application 1.2、多核OS的软件分区 1.3、任务调度 1.4、核间任务同步 1.5、计数器、报警器、调度表 1.6、自旋锁与共享资源 1.7、核间通信IOC 1.8、OS Object中元素交互 1.9、多核OS的启动与关闭 2、多核OS注意事项 2.1、最小…...

解决华为云ping不通的问题

进入华为云控制台。依次选择&#xff1a;云服务器->点击服务器id->安全组->更改安全组->添加入方向规则&#xff0c;添加一个安全组规则&#xff08;ICMP&#xff09;&#xff0c;详见下图 再次ping公网ip就可以ping通了 产生这一问题的原因是ping的协议基于ICMP协…...

数据结构入门 — 链表详解_双向链表

前言 数据结构入门 — 双向链表详解* 博客主页链接&#xff1a;https://blog.csdn.net/m0_74014525 关注博主&#xff0c;后期持续更新系列文章 文章末尾有源码 *****感谢观看&#xff0c;希望对你有所帮助***** 系列文章 第一篇&#xff1a;数据结构入门 — 链表详解_单链表…...

时序预测 | MATLAB实现PSO-KELM粒子群算法优化核极限学习机时间序列预测(含KELM、ELM等对比)

时序预测 | MATLAB实现PSO-KELM粒子群算法优化核极限学习机时间序列预测&#xff08;含KELM、ELM等对比&#xff09; 目录 时序预测 | MATLAB实现PSO-KELM粒子群算法优化核极限学习机时间序列预测&#xff08;含KELM、ELM等对比&#xff09;预测效果基本介绍模型介绍程序设计参…...

SSL/TLS协议的概念、工作原理、作用以及注意事项

个人主页&#xff1a;insist--个人主页​​​​​​ 本文专栏&#xff1a;网络基础——带你走进网络世界 本专栏会持续更新网络基础知识&#xff0c;希望大家多多支持&#xff0c;让我们一起探索这个神奇而广阔的网络世界。 目录 一、SSL/TLS协议的基本概念 二、SSL/TLS的工作…...

[Stable Diffusion教程] 第一课 原理解析+配置需求+应用安装+基本步骤

第一课 原理解析配置需求应用安装基本步骤 本次内容记录来源于B站的一个视频 以下是自己安装过程中整理的问题及解决方法&#xff1a; 问题&#xff1a;stable-diffusion-webui启动No Python at ‘C:\xxx\xxx\python.exe‘ 解答&#xff1a;打开webui.bat 把 if not de…...

uniapp结合Canvas+renderjs根据经纬度绘制轨迹(二)

uniapp结合Canvasrenderjs根据经纬度绘制轨迹 文章目录 uniapp结合Canvasrenderjs根据经纬度绘制轨迹效果图templaterenderjsjs数据结构 ​ 根据官方建议要想在 app-vue 流畅使用 Canvas 动画&#xff0c;需要使用 renderjs 技术&#xff0c;把操作canvas的js逻辑放到视图层运…...

VR全景加盟会遇到哪些问题?全景平台会提供什么?

想创业&#xff0c;你是否也遇到这些问题呢&#xff1f;我是外行怎么办&#xff1f;没有团队怎么办&#xff1f;项目回本周期快吗&#xff1f;项目靠谱吗&#xff1f;加盟平台可信吗&#xff1f;等等这类疑问。近几年&#xff0c;VR产业发展迅速&#xff0c;尤其是VR全景项目在…...

如何进行微服务的集成测试

集成测试的概念 说到集成测试&#xff0c;相信每个测试工程师并不陌生&#xff0c;它不是一个崭新的概念&#xff0c;通过维基百科定义可以知道它在传统软件测试中的含义。 Integration testing (sometimes called integration and testing, abbreviated I&T) is the pha…...

spark grpc 在master运行报错 exitcode13 User did not initialize spark context

程序使用sparksql 以及protobuf grpc &#xff0c;执行报错 ApplicationMaster: Final app status: FAILED, exitCode: 13, (reason: Uncaught exception: java.lang.IllegalStateException: User did not initialize spark context! 先说原因 &#xff1a; 1.使用了不具备权限…...

nginx 反向代理的原理

Nginx&#xff08;发音为"engine X"&#xff09;是一个高性能、轻量级的开源Web服务器和反向代理服务器。它的反向代理功能允许将客户端的请求转发到后端服务器&#xff0c;然后将后端服务器的响应返回给客户端。下面是Nginx反向代理的工作原理&#xff1a; 1.客户端…...

【SpringBoot】第二篇:RocketMq使用

背景&#xff1a; 本文会介绍多种案例&#xff0c;教大家如何使用rocketmq。 一般rocketmq使用在微服务项目中&#xff0c;属于分模块使用。这里使用springboot单体项目来模拟使用。 本文以windows系统来做案例。 下载rocketmq和启动&#xff1a; RocketMQ 在 windows 上运行…...

飞天使-vim简单使用技巧

此文是记录技巧使用&#xff0c;如果想节约时间&#xff0c;可以直接看最后一个章节 vim 的介绍 vim号称编辑器之神&#xff0c;唯快不破&#xff0c;可扩展&#xff0c;各种插件满天飞。 vi 1991 vim 1.14 vim四种模式 普通模式: 移动光标&#xff0c; 删除文本&#xff0c…...

分布式搜索引擎----elasticsearch

目录 1、初识elasticsearch 1.1、什么是elasticsearch 1.2.ELK技术栈 2、正向索引和倒排索引 2.1、正向索引 2.2、倒排索引 2.3、正向索引和倒排索引的区别 3、elasticsearch中的概念理解 3.1、文档和字段 3.2、索引和映射 3.3、mysql与elasticsearch 1、初识elasti…...

AnnotationConfigApplicationContext类和ClasspathXmlApplicationContext类的区别?

在 Spring Framework 中&#xff0c;AnnotationConfigApplicationContext 和 ClasspathXmlApplicationContext 是两个不同的应用程序上下文实现&#xff0c;用于配置和管理 Spring Bean 容器。它们之间的主要区别在于配置的方式和使用场景。 1. **AnnotationConfigApplication…...

使用VSCode SSH实现公网远程连接本地服务器开发的详细教程

文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…...

Codeforces Round 894 (Div. 3)

还是打一下卡!!! (A,B,C) 目录 A. Gift Carpet 链接 : 题面 : 题目意思 : 思路 : 代码 : B. Sequence Game 链接 : 题面 : ​编辑 题目意思 : 思路 : 代码 : C. Flower City Fence 原题链接 : 题面 : 题目意思 : 思路 : 代码 : A. Gift Carpet 链…...

ACL2023 Prompt 相关文章速通 Part 1

Accepted Papers link: ACL2023 main conference accepted papers 文章目录 Accepted PapersPrompter: Zero-shot Adaptive Prefixes for Dialogue State Tracking Domain AdaptationQuery Refinement Prompts for Closed-Book Long-Form QAPrompting Language Models for Lin…...

“R语言+遥感“水环境综合评价方法

详情点击链接&#xff1a;"R语言遥感"水环境综合评价方法 一&#xff1a;R语言 1.1 R语言特点&#xff08;R语言&#xff09; 1.2 安装R&#xff08;R语言&#xff09; 1.3 安装RStudio&#xff08;R语言&#xff09; &#xff08;1&#xff09;下载地址 &…...

数据结构之哈希

哈希 1. 哈希概念2. 哈希冲突3. 哈希冲突解决3.1 哈希表的闭散列3.2 哈希表的开散列 2. 哈希的应用2.1 位图2.2 布隆过滤器 哈希&#xff08;Hash&#xff09;是一种将任意长度的二进制明文映射为较短的二进制串的算法。它是一种重要的存储方式&#xff0c;也是一种常见的检索方…...

可视化绘图技巧100篇基础篇(七)-散点图(一)

目录 前言 适用场景 图例 普通散点图与可视化 曲线图 气泡图...

关于什么是框架

框架&#xff08;Framework&#xff09;是一个框子——指其约束性&#xff0c;也是一个架子——指其支撑性。 IT语境中的框架&#xff0c;特指为解决一个开放性问题而设计的具有一定 性的支撑结构。在此结构上约束可以根据具体问题扩展、安插更多的组成部分&#xff0c;从而更迅…...

iOS开发Swift-集合类型

集合基本类型&#xff1a;数组 Array (有序)&#xff0c; 集合 Set (无序不重复)&#xff0c; 字典 Dictionary (无序键值对) 1.数组 Arrays (1)数组的表示 Array<Element> [Element](2)创建空数组 var someInts: [Int] [] someInts.count //数组长度(3)带值数组 var…...

【keepalived双机热备与 lvs(DR)】

目录 一、概述 1.简介 2.原理 3.作用 二、安装 1.配置文件 2.配置项 三、功能模块 1.core 2.vrrp 3.check 四、配置双机热备 1.master 2.backup 五、验证 1.ping验证 2.服务验证 六、双机热备的脑裂现象 七、keepalivedlvs&#xff08;DR&#xff09; 1.作…...

C++笔记之静态成员函数可以在类外部访问私有构造函数吗?

C笔记之静态成员函数可以在类外部访问私有构造函数吗&#xff1f; code review! 静态成员函数可以在类外部访问私有构造函数。在C中&#xff0c;访问控制是在编译时执行的&#xff0c;而不是在运行时执行的。这意味着静态成员函数在编译时是与类本身相关联的&#xff0c;而不…...

最新SQLMap进阶技术

SQLMap进阶&#xff1a;参数讲解 &#xff08;1&#xff09;–level 5&#xff1a;探测等级。 参数“–level 5”指需要执行的测试等级&#xff0c;一共有5个等级&#xff08;1~5级&#xff09;&#xff0c;可不加“level”&#xff0c;默认是1级。可以在xml/payloads.xml中看…...

【BurpSuite常用功能介绍】

BurpSuite的使用 1.运行BurpSuite 2.代理设置 打开软件后&#xff0c;我们第一件事就应该去调试软件和浏览器的代理&#xff0c;让BURP能够正常工作抓包 proxy--options&#xff0c;我端口默认使用8080 然后我们打开一个浏览器&#xff0c;进入代理设置 (注意一点&#xff0…...

Leetcode 108. 将有序数组转换为二叉搜索树

108. 将有序数组转换为二叉搜索树 分析 给定一个有序数组&#xff0c;要求转换为二叉搜索树。 数组是有序的&#xff0c;并且要求二叉树。 这里看到数组是有序的&#xff0c;马上想到二分&#xff0c;但是又不需要完全二分 实现。 再复习二叉搜索树的结构特点&#xff1a; 左…...

小匠物联联合亚马逊云助力企业数智化出海

如何让家电企业出海产品数智化之路走上康庄大道&#xff1f;8月25日,亚马逊云科技[创新成长企业专列]这趟上云快车将开往宁波站&#xff0c;助力宁波的制造、软件等企业扬帆起航&#xff01;现场举办“亚马逊云科技助力企业出海数智沙龙”&#xff0c;小匠物联受邀出席。 会议现…...

(五)k8s实战-配置管理

一、ConfigMap 使用 kubectl create configmap -h 查看示例&#xff0c;构建 configmap 对象 1) 基于文件夹&#xff0c;加载文件夹下所有配置文件&#xff0c;创建 kubectl create configmap <configmapName> --from-file<dirPath>2) 指定配置文件&#xff0c;创…...

GPT---1234

GPT:《Improving Language Understanding by Generative Pre-Training》 下载地址:https://cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdfhttps://cdn.openai.com/research-covers/language-unsupervised/language_understa…...

计算机竞赛 基于大数据的时间序列股价预测分析与可视化 - lstm

文章目录 1 前言2 时间序列的由来2.1 四种模型的名称&#xff1a; 3 数据预览4 理论公式4.1 协方差4.2 相关系数4.3 scikit-learn计算相关性 5 金融数据的时序分析5.1 数据概况5.2 序列变化情况计算 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &…...

python进行数据分析:数据预处理

六大数据类型 见python基本功 import numpy as np import pandas as pd数据预处理 缺失值处理 float_data pd.Series([1.2, -3.5, np.nan, 0]) float_data0 1.2 1 -3.5 2 NaN 3 0.0 dtype: float64查看缺失值 float_data.isna()0 False 1 …...

百度Apollo:引领自动驾驶技术的创新与突破

文章目录 前言一、技术创新二、开放合作三、生态建设四、安全可靠性总结 前言 随着科技的迅猛发展&#xff0c;自动驾驶技术正成为未来交通领域的重要发展方向。在这个领域中&#xff0c;百度Apollo作为中国领先的自动驾驶平台&#xff0c;以其卓越的创新能力和开放合作精神&a…...

Python爬虫 异步、缓存技巧

在进行大规模数据抓取时&#xff0c;Python爬虫的速度和效率是至关重要的。本文将介绍如何通过异步请求、缓存和代理池等技巧来优化Python爬虫的速度和性能。我们提供了实用的方案和代码示例&#xff0c;帮助你加速数据抓取过程&#xff0c;提高爬虫的效率。 使用异步请求、缓…...

YOLOv5屏蔽区域检测(选择区域检测)

YOLOv5屏蔽区域检测以及选择区域检测 前期准备labelme选择mask区域 代码改动 前期准备 思路就是通过一个mask掩膜&#xff0c;对我们想要屏蔽或者选择的区域进行遮挡处理&#xff0c;在推理的时候&#xff0c;将有mask掩膜的图像输入&#xff0c;将最后的结果显示在原始图像上…...

记录一次presto sql执行报错 Error executing query的解决办法

在执行presto sql 时报错截图如下&#xff1a; 查看后台执行报错日志&#xff1a; java.sql.SQLException: Error executing query at com.facebook.presto.jdbc.PrestoStatement.internalExecute(PrestoStatement.java:307) at com.facebook.presto.jdbc.PrestoStatement.exe…...

Android Studio开发之路 (五)导入OpenCV以及报错解决

一、步骤 官网下载opencv包&#xff08;我下的是4.7.0&#xff09;并解压&#xff0c;openvc官网 先创建一个空项目&#xff0c;简单跑一下能正常输出helloworld 点击file->new->Import Module选择解压之后的opencv-android-sdk文件夹中的SDk文件夹&#xff0c; modu…...

vue3.3中ref和reactive原理源代码分析

源码是ts编写的,这里部分简化成js便于阅读 function ref(value) {return createRef(value, false) }function createRef(rawValue, shallow) { //shallow是否是浅层定义数据,用于区别ref和shallowRefif (isRef(rawValue)) {//如果已经是ref直接返回源数据return rawValue}retu…...

10.Oracle中decode函数

【函数格式】&#xff1a; decode ( expression, condition_01, result_01, condition_02, result_02, ......, condition_n, result_n, result_default) 【函数说明】&#xff1a; 若表达式expression值与condition_01值匹配&#xff0c;则返回result_01&#xff0c;…...

Podman安装部署kafka和管理界面(快速跑起来)

#1.拉取镜像 podman pull bitnami/zookeeper podman pull bitnami/kafka#2.创建子网 podman network create knet#3.创建zookeeper podman run -itd --name zookeeper-server -p 2181:2181 \ --net knet \ -e ALLOW_ANONYMOUS_LOGINyes \ bitnami/zookeeper:latest#3.1查看z…...

Hbase文档--架构体系

阿丹&#xff1a; 基础概念了解之后了解目标知识的架构体系&#xff0c;就能事半功倍。 架构体系 关键组件介绍&#xff1a; HBase – Hadoop Database&#xff0c;是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统&#xff0c;利用HBase技术可在廉价PC Server上搭建起…...

stm32基于HAL库驱动外部SPI flash制作虚拟U盘

stm32基于HAL库驱动外部SPI flash制作虚拟U盘 &#x1f4cc;参考文章&#xff1a;https://xiaozhuanlan.com/topic/6058234791&#x1f39e;实现效果演示&#xff1a; &#x1f516;上图中的读到的FLASH_ID所指的是针对不同容量&#xff0c;所对应的ID。 //W25X/Q不同容量对应…...

vue3-ts- element-plus新增组件-过滤

新增组件-所有值为空时过滤 <el-form-item label"家庭成员"><divclass"username-box"v-for"(item, index) in form.namelist":key"index"><div>姓名&#xff1a;<el-input v-model"item.name" placeho…...

PostgreSQL SQL优化

Oracle SQL优化 一、在字段里面写的子查询放到from后面&#xff0c;用left join&#xff0c;会大幅提高SQL查询速度。 一、在字段里面写的子查询放到from后面&#xff0c;用left join&#xff0c;会大幅提高SQL查询速度。...

debian12网络静态ip配置-OSSIM 安全漏洞扫描系统平台

本配置适合于服务器上的静态ip配置&#xff0c;该方法简单可靠。 1 临时配置 ifconfig eth0 192.168.1.97 netmask 255.255.255.0 broadcast 192.168.1.255 ip route add default via 192.168.1.1 2 主要的网络配置文件 /etc/network/interfaces /etc/resolv.conf 3 配置…...

微软 Visual Studio 现已内置 Markdown 编辑器,可直接修改预览 .md 文件

Visual Studio Code V1.66.0 中文版 大小&#xff1a;75.30 MB类别&#xff1a;文字处理 本地下载 Markdown 是一种轻量级标记语言&#xff0c;当开发者想要格式化代码但又不想牺牲易读性时&#xff0c;Markdown 是一个很好的解决方案&#xff0c;比如 GitHub 就使用 Markdo…...

阿里云通义千问开源第二波!大规模视觉语言模型Qwen-VL上线魔搭社区

通义千问开源第二波&#xff01;8月25日消息&#xff0c;阿里云推出大规模视觉语言模型Qwen-VL&#xff0c;一步到位、直接开源。Qwen-VL以通义千问70亿参数模型Qwen-7B为基座语言模型研发&#xff0c;支持图文输入&#xff0c;具备多模态信息理解能力。在主流的多模态任务评测…...