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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

线性数据结构:数组与链表的探索与应用

文章目录 1. 数组&#xff1a;连续存储的有序元素集合1.1 创建和访问数组1.2 数组的搜索与排序 2. 链表&#xff1a;非连续存储的动态数据结构2.1 单链表与双链表2.2 链表的操作与应用 3. 数组与链表的比较与应用3.1 数组与链表的比较3.2 数组与链表的应用 4. 总结与展望 &…

【Go 基础篇】切片:Go语言中的灵活数据结构

在Go语言中&#xff0c;切片&#xff08;Slice&#xff09;是一种强大且灵活的数据结构&#xff0c;用于管理和操作一系列元素。与数组相比&#xff0c;切片的大小可以动态调整&#xff0c;这使得它成为处理动态数据集合的理想选择。本文将围绕Go语言中切片的引入&#xff0c;介…

如何在有或没有WiF适配器的情况下把台式机接入WiFi

Wi-Fi在台式电脑中越来越普遍,但并不是所有的台式电脑都有。添加Wi-Fi,你就可以无线连接到互联网,并为其他设备托管Wi-Fi热点。 这是一个简单、廉价的过程。买一个合适的小适配器,你甚至可以随身携带,通过将一个小设备插入USB端口,可以快速将Wi-Fi添加到你遇到的任何桌面…

screen命令,可以断开服务器连接,依旧能运行你的程序了

可以参考博客1&#xff1a;https://blog.csdn.net/nima_zhang_b/article/details/82797928 可以参考博客2:https://blog.csdn.net/herocheney/article/details/130984403 Linux中的screen是一个命令行工具&#xff0c;可以让用户在同一个终端会话中创建多个虚拟终端。它非常有…

element-ui 弹窗里面嵌套弹窗,解决第二个弹窗被遮罩层掩盖无法显示的问题

当我们在 element-ui 中使用弹窗嵌套弹窗时&#xff0c;会出现第二个弹窗打开时被一个遮罩层挡着&#xff0c;就像下面这样&#xff1a; 下面提供两种解决方案 &#xff1a; 一、第一种方案 我们查询element-ui 官网可以发现 el-dialog 有这样几个属性&#xff1a; 具体使用就…

Android Looper Handler 机制浅析

最近想写个播放器demo&#xff0c;里面要用到 Looper Handler&#xff0c;看了很多资料都没能理解透彻&#xff0c;于是决定自己看看相关的源码&#xff0c;并在此记录心得体会&#xff0c;希望能够帮助到有需要的人。 本文会以 猜想 log验证 的方式来学习 Android Looper Ha…

Jmeter接口测试+压力测试

接口测试 Jmeter-http接口脚本 一般分五个步骤:&#xff08;1&#xff09;添加线程组 &#xff08;2&#xff09;添加http请求 &#xff08;3&#xff09;在http请求中写入接入url、路径、请求方式和参数 &#xff08;4&#xff09;添加查看结果树 &#xff08;5&#xff09;…

无涯教程-Python机器学习 - Stochastic Gradient Boosting函数

它也称为梯度提升机。在下面的Python食谱中,我们将通过使用pima Indians糖尿病数据集上的 sklearn 的 GradientBoostingClassifier 类来创建随机梯度Boostingensemble模型进行分类。 首先,导入所需的软件包,如下所示: from pandas import read_csv from sklearn.model_select…

LC1011. 在 D 天内送达包裹的能力(JAVA)

在 D 天内送达包裹的能力 题目描述上期经典算法 题目描述 leetcode 1011. 在 D 天内送达包裹的能力 难度 - 中等 传送带上的包裹必须在 days 天内从一个港口运送到另一个港口。 传送带上的第 i 个包裹的重量为 weights[i]。每一天&#xff0c;我们都会按给出重量&#xff08;we…

oracle 启停操作

1. 监听端口启停 # 根据实际情况 切换至oracle用户 su - oracle# 状态查看 lsnrctl stat# 启动1521端口监听 lsnrctl start# 关闭1521监听 lsnrctl stop 2. 数据库服务启停 # 立即关闭服务 shutdown immediate# 启动服务 startup

惠普NS1020激光打印机碳粉警告提示及添加碳粉方法

本文也适用于惠普NS1020、1020c 和 1020w 系列打印机。 通过碳粉量指示灯检查碳粉量。 如果碳粉量是满的或指示器显示 1&#xff0c;可选择添加一个碳粉或者忽略不添加。如果碳粉量指示灯显示 2或 2 和碳粉量警告感叹号图标 &#xff0c;则表示碳粉量不足或严重不足&#xff0…

Stable Diffusion Web UI的原理与使用

Stable Diffusion是一套基于Diffusion扩散模型生成技术的图片生成方案&#xff0c;随着技术的不断发展以及工业界对这套工程细节的不断优化&#xff0c;使其终于能在个人电脑上运行&#xff0c;本文将从github下载开始讲一讲如何使用Stable Diffusion Web UI进行AI图像的生成。…

Unity3D Pico VR 手势识别 二

Unity3D Pico VR 手势识别_Cool-浩的博客-CSDN博客 此篇主要讲解怎么手势追踪&#xff0c;手势姿态自定义预制识别&#xff0c;不会导入SDK和配置环境的请看上一章节 环境要求 SDK 版本&#xff1a;2.3.0 及以上PICO 设备型号&#xff1a;PICO Neo3 和 PICO 4 系列PICO 设备系…

老年人跌倒智能识别算法 opencv

老年人跌倒智能识别算法通过opencvpython深度学习算法框架模型&#xff0c;老年人跌倒智能识别算法能够及时发现老年人跌倒情况&#xff0c;提供快速的援助和救援措施&#xff0c;保障老年人的安全。Python是一种由Guido van Rossum开发的通用编程语言&#xff0c;它很快就变得…

封装公共el-form表单(记录)

1.公共表单组件 //commonForm.vue <script> import {TEXT,SELECT,PASSWORD,TEXTAREA,RADIO,DATE_PICKER } from /conf/uiTypes import { deepClone } from /utils export default {name: GFormCreator,props: {config: { // title/itemstype: Object,required: true}}…

【人工智能】—_贝叶斯网络、概率图模型、全局语义、因果链、朴素贝叶斯模型、枚举推理、变量消元

文章目录 频率学派 vs. 贝叶斯学派贝叶斯学派Probability&#xff08;概率&#xff09;:独立性/条件独立性&#xff1a;Probability Theory&#xff08;概率论&#xff09;:Graphical models &#xff08;概率图模型&#xff09;什么是图模型&#xff08;Graphical Models&…

L1-044 稳赢(Python实现) 测试点全过

题目 大家应该都会玩“锤子剪刀布”的游戏&#xff1a;两人同时给出手势&#xff0c;胜负规则如图所示&#xff1a; 现要求你编写一个稳赢不输的程序&#xff0c;根据对方的出招&#xff0c;给出对应的赢招。但是&#xff01;为了不让对方输得太惨&#xff0c;你需要每隔K次就…

React【React是什么?、创建项目 、React组件化、 JSX语法、条件渲染、列表渲染、事件处理】(一)

文章目录 React是什么&#xff1f; 为什么要学习React React开发前准备 创建React项目 React项目结构简介 React组件化 初识JSX 渲染JSX描述的页面 JSX语法 JSX的Class与Style属性 JSX生成的React元素 条件渲染&#xff08;一&#xff09; 条件渲染 &#xff0…

Gorilla LLM:连接海量 API 的大型语言模型

如果你对这篇文章感兴趣&#xff0c;而且你想要了解更多关于AI领域的实战技巧&#xff0c;可以关注「技术狂潮AI」公众号。在这里&#xff0c;你可以看到最新最热的AIGC领域的干货文章和案例实战教程。 一、前言 在当今这个数字化时代&#xff0c;大型语言模型&#xff08;LLM…

LeetCode--HOT100题(41)

目录 题目描述&#xff1a;102. 二叉树的层序遍历&#xff08;中等&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;102. 二叉树的层序遍历&#xff08;中等&#xff09; 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&am…