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 项目中。

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

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

相关文章

springcloud3 GateWay章节-Nacos+gateway动态路由负载均衡4

一 工程结构 1.1 工程 1.2 搭建gatewayapi工程 1.pom文件 <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version><scope>test</scope></dependency><!--gateway--&g…

复习之web服务器--apache

PS&#xff1a;Vim复制小技巧 一、实验环境 两台虚拟机 (nodea,nodeb)配置ip搭建软件仓库关闭selinux [rootftp Desktop]# hostnamectl set-hostname nodea.westos.org [rootftp Desktop]# hostname nodea.westos.org [rootftp Desktop]# ifconfig enp1s0: flags4163<UP,B…

大数据开发要学习什么?学完又能做什么

学习大数据需要掌握什么语言基础&#xff1f; 1、Java基础 大数据框架90%以上都是使用Java开发语言&#xff0c;所以如果要学习大数据技术&#xff0c;首先要掌握Java基础语法以及JavaEE方向的相关知识。 2、MySQL数据库 这是学习大数据必须掌握的知识之一。数据的操作语言是…

Vue2向Vue3过度核心技术组件通信

目录 1 组件基础知识scoped解决样式冲突1.1 默认情况&#xff1a;1.2 代码演示1.3 scoped原理1.4 总结 2 组件基础知识data必须是一个函数2.1 data为什么要写成函数2.2 代码演示2.3 总结 3 组件通信3.1 什么是组件通信&#xff1f;3.2 组件之间如何通信3.3 组件关系分类3.4 通信…

为什么使用Nacos而不是Eureka(Nacos和Eureka的区别)

文章目录 前言一、Eureka是什么&#xff1f;二、Nacos是什么&#xff1f;三、Nacos和Eureka的区别3.1 支持的CAP3.2连接方式3.3 服务异常剔除3.4 操作实例方式 总结 前言 为什么如今微服务注册中心用Nacos相对比用Eureka的多了&#xff1f;本文章将介绍他们之间的区别和优缺点…

【element-ui】el-dialog改变宽度

dialog默认宽度为父元素的50%&#xff0c;这就导致在移动端会非常的窄&#xff0c;如图1&#xff0c;需要限定宽度。 解决方法&#xff1a;添加custom-class属性&#xff0c;然后在style中编写样式&#xff0c;注意&#xff0c;如果有scoped限定&#xff0c;需要加::v-deep &l…

浅谈Spark的RDD、部署模式

一、RDD Spark RDD&#xff08;弹性分布式数据集&#xff09;&#xff0c;弹性是指Spark可以通过重新计算来自动重建丢失的分区。 从本质上讲&#xff0c;RDD 是数据元素的不可变分布式集合&#xff0c;跨集群中的节点进行分区&#xff0c;可以与提供转换和操作的低级 API 并行…

到目前为止,所有的关于安卓14的详细介绍

安卓14现在可能已经不远了,谷歌已经进行了五次测试,通常10月份的发布窗口时间很快就会到来。但除了在谷歌I/O 2023上进行简短讨论外,谷歌对正在发生的变化相对沉默。 可以肯定地说,Android 14不会是操作系统有史以来最大的一系列变化,但有很多改进和变化可以让Android保持…

【计算机网络】HTTPs 传输流程

HTTPS和HTTP的区别 1、HTTP协议传输的数据都是未加密的&#xff0c;是明文的&#xff0c;使用HTTP协议传输隐私信息非常不安 HTTPS协议是由SSLHTTP协议构建的可进行加密传输、身份认证的网络协议&#xff0c;要比http协议安全。 2、HTTPS协议需要到CA申请证书&#xff0c;一般…

apache的ab工具测试网页优化效果速度以及服务器承载

今天为大家介绍一款apache自带的一种的测试网页优化效果速度以及服务器承载的工具——ab.exe。 大家在工作中或者开发中可以使用apache的ab工具来测试自己的网站并发量大小&#xff0c;和某个页面的访问时间。 一、基本用法 如果你是用的是apache的话&#xff0c;那么只要进…

科技资讯|三星再申请智能戒指商标,智能穿戴进入更小型化发展

三星正在积极扩展可穿戴设备生态&#xff0c;近日向英国知识产权局提交了名为“Samsung Curio”的新商标&#xff0c;其分类为“Class 9”&#xff0c;可能会用于未来的智能戒指。 智能戒指&#xff1a; 可穿戴计算机本质上的智能手环、智能项链、智能眼镜和智能戒指&#xff1…

【计算机网络】日志与守护进程

文章目录 日志日志的创建logmessage 函数日志左边部分实现日志右边部分实现 完整代码log.hpp(整体实现)err.hpp (错误信息枚举&#xff09; 守护进程PGID SID TTY 的介绍shell中控制进程组的方式结论 为什么要有守护进程存在&#xff1f;守护进程的创建使用守护进程的条件守护进…

算法 for GAMES

栈 #include <iostream> #include <stack>int main() {std::stack<int> intStack;// 压入元素到堆栈intStack.push(5);intStack.push(10);intStack.push(15);// 查看堆栈顶部元素std::cout << "Top element: " << intStack.top() <…

免费的png打包plist工具CppTextu,一款把若干资源图片拼接为一张大图的免费工具

经常做游戏打包贴图的都知道&#xff0c;要把图片打包为一张或多张大图&#xff0c;要使用打包工具TexturePacker。 TexturePacker官方版可以直接导入PSD、SWF、PNG、BMP等常见的图片格式&#xff0c;主要用于网页、游戏和动画的制作&#xff0c;它可以将多个小图片汇聚成一个…

kafka--技术文档-基本概念-《快速了解kafka》

学习一种新的消息中间键&#xff0c;卡夫卡&#xff01;&#xff01;&#xff01; 官网网址 Apache Kafka 基本概念 Kafka是一种开源的分布式流处理平台&#xff0c;由Apache软件基金会开发&#xff0c;用Scala和Java编写。它是一个高吞吐量的分布式发布订阅消息系统&#xf…

QCC_BES 音频重采样算法实现

+V hezkz17进数字音频系统研究开发交流答疑群(课题组) 这段代码是一个用于将音频数据进行立体声重采样的函数。以下是对代码的解读: 函数接受以下参数: pcm_buf:16位有符号整型的音频缓冲区,存储了输入的音频数据。pcm_len:音频缓冲区的长度。mic1:16位有符号整型的音频…

CSS内边距和外边距属性

外边距属性用margin&#xff1b;padding属性叫填充&#xff0c;或者也叫内边距&#xff1b; margin:标签与标签的距离&#xff0c;到包围它的元素的边框的距离&#xff1b; padding&#xff1a;内边距&#xff0c;用于控制内容与边框之间的距离&#xff1b; CSS padding&…

C 语言编程规范 -- 华为

1. 代码总体原则 1.1 清晰第一&#xff0c;清晰性是易于维护&#xff0c;易于重构的程序必须具备的特征 代码首先是给人读的&#xff0c;好的代码应当可以像文章一样发生朗诵出来&#xff0c;“程序必须为阅读它的人而编写&#xff0c;只是顺便用于机器执行” – Harold Abel…

视频集中存储/云存储平台EasyCVR国标GB28181协议接入的报文交互数据包分析

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。视频汇聚融合管理…

ChatGPT⼊门到精通(1):ChatGPT 是什么

⼀、直观感受 1、公司 OpenAI&#xff08;美国&#xff09; 2、官⽅⽹站 3、登录ChatGPT ![在这里插入图片描述](https://img-blog.csdnimg.cn/26901096553a4ba0a5c88c49b2601e6a.png 填⼊帐号、密码&#xff0c;点击登录。登录成功&#xff0c;如下 3、和ChatGPT对话 开始…