文章目录
- 主键 外键 的区别?
- 什么是范式?
- 什么是反范式?
- 什么是事务?
- 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 项目中。