【MySQL】过年没有回老家,在出租屋里整理了一些思维导图

news2024/11/17 11:29:16

Xmind导图知识点

  • Mysql知识点
  • SQL知识点
  • Mybatis知识点
  • 面试题分享
    • MySQL部分
    • Mybatis部分

Mysql知识点

通过下面的图片可以看出,MySQL基础语法分为四部分:连接数据库,对数据库的操作,对表中的数据操作,对表操作等等。
在这里插入图片描述

SQL知识点

SQL相关的知识点就多了,SQL就是对数据库表进行操作,需要掌握的技术知识点就比较多了。
比如:

  • 如何创建表,更新表,删除表,重命名表。
  • 什么是组合查询,什么是子查询等等。
  • 如何过滤检索数据,分组数据,排序检索数据,快速检索数据。
  • 如何使用函数处理数据,SQL中会用到哪些函数?
  • 还要知道seclect查询语句的执行顺序。
  • 还需要知道聚集函数的使用。
  • 联表查询的实现方法。
    在这里插入图片描述

Mybatis知识点

包含了

  • 快速入门
  • mybatis缓存:一级缓存,二级缓存
  • Mapper代理知识点
  • 映射关系, 映射文件介绍
    在这里插入图片描述
    看上图知道了一级缓存就是基于sqlSession的缓存,Mybatis默认是开启一级缓存的。实现原理就是:通过一个Map来实现
    同一个sqlsession再次发出相同的sql,就从缓存中取不走数据库。如果两次中间出现commit操作(修改、添加、删除),本sqlsession中的一级缓存区域全部清空,下次再去缓存中查询不到所以要从数据库查询,从数据库查询到再写入缓存。
    与Spring整合之后,使用的是Mappper代理对应,一级缓存是失效的。为什么呢?因为在同一线程里面两次查询同一数据所使用的sqlsession是不相同的。
    二级缓存是基于Mapper(同一个命名空间)的缓存,Mybaits的二级缓存是需要自己在配置文件中配置的。查询结果映射的pojo需要实现 java.io.serializable接口,useCache=“false”。
    这就是mybatis中一级缓存和二级缓存。面试的时候也会并经常问到,一定要掌握闹牢固。

面试题分享

MySQL部分

  1. 一千万条数据的表, 如何分页查询

数据量过大的情况下, limit offset分页会由于扫描数据太多而越往后查询越慢. 可以配合当前页最后一条ID进行查询。

SELECT * FROM T WHERE id > #{ID} LIMIT #{LIMIT}。
当然, 这种情况下ID必须是有序递增的, 这也是有序ID的好处之一。

  1. MySQL怎么恢复半个月前的数据

需要前期是有定期的备份整个数据库的数据,如果有备份可以通过binlog日志进行恢复

  1. MySQL事务的隔离级别, 分别有什么特点

1. 读未提交(RU): 一个事务还没提交时, 它做的变更就能被别的事务看到.
2. 读提交(RC): 一个事务提交之后, 它做的变更才会被其他事务看到.
3. 可重复读(RR): 一个事务执行过程中看到的数据, 总是跟这个事务在启动时看到的数据是一致的. 当然在可重复读隔离级别下, 未提交变更对其他事务也是不可见的.
4. 串行化(S): 对于同一行记录, 读写都会加锁. 当出现读写锁冲突的时候, 后访问的事务必须等前一个事务执行完成才能继续执行

  1. 唯一索引比普通索引快吗, 为什么?

唯一索引不一定比普通索引快, 还可能慢.

原因是:

1. 查询时, 在未使用limit 1的情况下, 在匹配到一条数据后, 唯一索引即返回, 普通索引会继续匹配下一条数据, 发现不匹配后返回. 如此看来唯一索引少了一次匹配, 但实际上这个消耗微乎其微.
2. 更新时, 这个情况就比较复杂了. 普通索引将记录放到change buffer中语句就执行完毕了. 而对唯一索引而言, 它必须要校验唯一性, 因此, 必须将数据页读入内存确定没有冲突, 然后才能继续操作. 对于写多读少的情况, 普通索引利用change buffer有效减少了对磁盘的访问次数, 因此普通索引性能要高于唯一索引.

  1. 订单表数据量越来越大导致查询缓慢, 如何处理

分库分表. 由于历史订单使用率并不高, 高频的可能只是近期订单,

因此, 将订单表按照时间进行拆分, 根据数据量的大小考虑按月分表或按年分表.
订单ID最好包含时间(如根据雪花算法生成), 此时既能根据订单ID直接获取到订单记录, 也能按照时间进行查询.

Mybatis部分

1.Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?

Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是 一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载 lazyLoadingEnabled=true|false。
它的原理是: 使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调 用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好 的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完 成a.getB().getName()方法的调用。

这就是延迟加载的基本原理。 当然了,不光是Mybatis,几乎所有的包括Hibernate,支持延迟加载的原理都是一样的。

2.#{}和${}的区别

#{}是占位符,预编译处理;${}是拼接符,字符串替换,没有预编译处理。

Mybatis在处理#{}时,#{}传入参数是以字符串传入,会将SQL中的#{}替换为?号,调用
PreparedStatement的set方法来赋值。
#{} 可以有效的防止SQL注入提高系统安全性 。后者不能防止SQL 注入#{} 的变量替换是在DBMS 中;${} 的变量替换是在 DBMS 外

  1. 使用MyBatis的mapper接口调用时有哪些要求?

1.Mapper接口方法名和mapper.xml中定义的每个sql的id相同。
2.Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相 同。
3.Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同。
4.Mapper.xml文件中的namespace即是mapper接口的类路径。

  1. Mybatis如何执行批量操作

使用foreach标签
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach标签的属性主 要有item,index,collection,open,separator,close。
item 表示集合中每一个元素进行迭代时的别名,随便起的变量名;
index 指定一个名字,用于表示在迭代过程中,每次迭代到的位置,不常用;
open 表示该语句以什么开始,常用“(”;
separator 表示在每次进行迭代之间以什么符号作为分隔符,常用“,”;
close 表示以什么结束,常用“)”。 在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是 在不同情况下,该属性的值是不一样的,
主要有一下3种情况:

  1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
  2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
  3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封 装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map 的, map的key就是参数名

所以这个时候collection属性值就是传入的List或array对象在自己封 装的map里面的key
具体用法如下:

<!-- 批量保存(foreach插入多条数据两种方法)int addEmpsBatch(@Param("emps") List<Employee> emps); -->
<!-- MySQL下批量保存,可以foreach遍历 mysql支持values(),(),()语法 --> //推荐使用
<insert id="addEmpsBatch">
INSERT INTO emp(ename,gender,email,did) VALUES
<foreach collection="emps" item="emp" separator=","> (#{emp.eName},#{emp.gender},#{emp.email},#{emp.dept.id})
</foreach>
</insert>
<!-- 这种方式需要数据库连接属性allowMutiQueries=true的支持 如jdbc.url=jdbc:mysql://localhost:3306/mybatis?allowMultiQueries=true -->
<insert id="addEmpsBatch">
<foreach collection="emps" item="emp" separator=";">
INSERT INTO emp(ename,gender,email,did) VALUES
(#{emp.eName},#{emp.gender},#{emp.email},#{emp.dept.id})
</foreach>
</insert>

使用ExecutorType.BATCH
Mybatis内置的ExecutorType有3种,
默认为simple,该模式下它为每个语句的执行创建一个 新的预处理语句,单条提交sql;而batch模式重复使用已经预处理的语句,并且批量执行所 有更新语句,显然batch性能将更优; 但batch模式也有自己的问题,比如在Insert操作时, 在事务没有提交之前,是没有办法获取到自增的id,这在某型情形下是不符合业务要求的 具体用法如下:
mapper和mapper.xml如下

//批量保存方法测试
@Test
public void testBatch() throws IOException{
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
//可以执行批量操作的sqlSession SqlSession openSession =
sqlSessionFactory.openSession(ExecutorType.BATCH);

//批量保存执行前时间
long start = System.currentTimeMillis(); try {
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
for (int i = 0; i < 1000; i++) { mapper.addEmp(new
Employee(UUID.randomUUID().toString().substring(0, 5), "b", "1"));
}

openSession.commit();
long end = System.currentTimeMillis();
//批量保存执行后的时间 System.out.println("执行时长" + (end - start));
//批量 预编译sql一次==》设置参数==》10000次==》执行1次 677
//非批量	(预编译=设置参数=执行 )==》10000次 1121
} finally {
openSession.close();
}

mapper和mapper.xml如下

public interface EmployeeMapper {
//批量保存员工
Long addEmp(Employee employee);
}
<mapper namespace="com.jourwon.mapper.EmployeeMapper"
<!--批量保存员工 -->
<insert id="addEmp">
insert into employee(lastName,email,gender) values(#{lastName},#{email},#{gender})
</insert>
</mapper>

写到最后,一直在技术路上前行…

昨天,删去,今天,争取,明天,努力

需要资料的VX 搜索 小冷coding 关注 获取

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

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

相关文章

python exe程序注册为window系统服务

1、使用pyinstaller将py打包成exe 1、安装 pip install pyinstaller2、打包成exe可执行文件 pyinstaller -F packTest.py #packTest.py为待打包的py文件打包成功后会在同级目录中生成两个文件夹和一个文件&#xff0c;分别为dist和build文件夹&#xff0c;以及一份与.py文件同…

Java——最大子数组和

题目链接 leetcode在线oj题——最大子数组和 题目描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 题目示例 输入&#xff1a;…

Vulnhub DC-4靶机渗透

环境准备DC-4靶机 ip&#xff1a;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;kali攻击机 ip&#xff1a;192.168.153.128一、信息收集kali攻击机中&#xff0c;使用 arp-scan -l 扫描c段&#xff08;-l为扫描c段&#xff09;确定靶…

自动驾驶——智能配电

一、汽车配电 汽车配电&#xff08;Power Distrubition Unit&#xff0c;PDU&#xff09;分为低压配电与高压配电&#xff0c;即低压PDU与高压PDU。 二、传统控制方式——PCB式电器盒 传统配电盒&#xff08;机电器件&#xff09;&#xff1a; &#xff08;1&#xff09;继…

为什么要做黑盒测试?黑盒测试有什么作用?

对于软件测试的从业者来说&#xff0c;黑盒测试是十分重要的测试方式&#xff0c;它可以弥补白盒测试检查不到的部分。可能刚刚入门的测试小白&#xff0c;对于为什么要做黑盒测试&#xff1f;黑盒测试有什么作用&#xff1f;仍然抱有很大的疑问。下面小编就来从黑盒测试的概念…

QT入门Buttons之QPushButton

目录 一、界面布局介绍 1、布局器中的位置及使用 2、控件的界面属性 3、常用基本属性介绍 3.1控件名称 3.2控件大小属性 3.3按钮上的文字设置 3.4设置按钮的样式 二、属性功能介绍 1、常用方法介绍 2、基本信号介绍 三、Demo展示 一、界面布局介绍 1、布局器中的位…

丰田埃尔法商务租车价格是多少,它的性能到底有多好呢

丰田埃尔法作为MPV之王。埃尔法的高腰线和深色玻璃也使内部更具神秘感&#xff0c;惹眼闪烁的进气格栅&#xff0c;类似盔甲一般的全镀铬饰条构成的霸道前脸和富于设计感的车身曲线&#xff0c;细节处采用36颗闪亮镀铬装饰点缀&#xff0c;有着很高的辨识性。保持了典型的MPV风…

需要代理上网的linux服务器,无法使用NTP同步时间,只需要这一行指令即可。

这将会是一篇让你对时间同步受益匪浅的文章&#xff01;如果你看完之后有收获&#xff0c;希望你能加个关注&#xff0c;如果你看完之后没有收获&#xff0c;希望你能留下你路过的痕迹。 由于工作需要&#xff0c;我们使用了一款神奇的调度框架&#xff0c;叫powerjob&#xff…

【职工管理系统】C++全栈体系(十四)

职工管理系统 第七章 添加职工 功能描述&#xff1a;批量添加职工&#xff0c;并且保存到文件中 一、功能分析 分析&#xff1a; 用户在批量创建时&#xff0c;可能会创建不同种类的职工 如果想将所有不同种类的员工都放入到一个数组中&#xff0c;可以将所有员工的指针维…

组织级过程资产库如何助力CMMI3-5级高效落地?

为了助力CMMI3-5级高效落地&#xff0c;近日CoCode旗下Co-ProjectV3.0智能项目管理平台全面升级&#xff0c;CMMI落地4大工具正式上线&#xff1a;CMMI成熟度自测工具、量化管理工具&#xff08;组织级过程改进工具和量化项目管理工具&#xff09;、组织级过程资产库。 组织级过…

tomcat下载安装步骤(笔记整理)

目录Tomcat下载安装以及配置&#xff08;详细教程&#xff09;tomcat下载安装步骤&#xff08;超详细&#xff09;Apache Tomcat下载、安装、配置图文教程Tomcat下载安装配置详细过程Tomcat下载及配置&#xff08;IDEA&#xff09;Tomcat 下载安装教程Linux系统中Tomcat下载安装…

振弦采集模块配置工具VMTool 扩展功能数据处理

振弦采集模块配置工具VMTool 扩展功能数据处理 数据存储 数据存储功能模块支持自动或手动将实时数据寄存器值存储到数据库&#xff0c; 并支持导出为 Excel文件功能。 &#xff08; 1&#xff09; 手动存储 每点击数据存储面板内的【 手动存储】按钮一次&#xff0c;将当前寄存…

Spring Cloud_Gateway新一代网关

目录一、概述简介1.官网2.是什么3.能干嘛4.微服务架构中网关在哪里二、三大核心概念1.Route(路由)2.Predicate&#xff08;断言&#xff09;3.Filter(过滤)4.总体三、Gateway工作流程1.官网总结2.核心逻辑&#xff1a;路由转发执行过滤器链四、入门配置1.新建Module2.POM3.YML4…

模板征集活动正式上线 | 加入我们,共创可视化内容!

本活动是由EasyV官方发布举办的定向主题模板征集活动&#xff0c;用户报名参加并使用EasyV进行创作后&#xff0c;通过素材广场上传作&#xff0c;经由官方进行作品评估&#xff0c;取得奖次的用户即可获得相应奖励。活动面向EasyV所有产品用户&#xff0c;以作品为维度独立参与…

tomcat下载与安装win11

目录 一、下载Tomcat及解压 1、选择下载版本&#xff08;本文选择tomcat 10版本为例&#xff09; 2、之后选择解压到任意一个盘&#xff0c;我解压到D盘&#xff0c;解压的路径一定要记住&#xff0c;后面系统环境变量配置的时候要用到。 二、配置环境 三、验证是否配置成功…

jvm 堆 栈大小设置

1、Eclise 中设置jvm内存: 改动eclipse的配置文件,对全部project都起作用 改动eclipse根文件夹下的eclipse.ini文件 -vmargs //虚拟机设置 -Xms40m //初始内存 -Xmx256m //最大内存 -Xmn16m //最小内存 -XX:PermSize128M //非堆内存 -XX:MaxPermSize256M 2、Eclise 中设置jvm内…

mybatis-plus02

目录一、乐观锁二、查询构造器三、分页查询四、逻辑删除五、Mybatis的应用一、乐观锁 配置示例&#xff1a; 在数据库表中加入version字段&#xff0c;表示数据版本号 修改实体类&#xff0c;在使用类中加入对应的version字段&#xff0c;并使用是乐观锁 //乐观锁 Version pr…

数据结构 第六章 二叉树与树(二叉树的性质)

玫瑰少年&#xff1a;点击收听 1 基本知识点 1、根结点&#xff1a;在一棵树中&#xff0c;(唯一)一个没有前驱的结点 2、叶子结点&#xff1a;在一棵树中&#xff0c;没有后继的结点 3、结点的度&#xff1a;是指结点后继的数量 4、树的度&#xff1a;是指所有结点度的最大值…

VMware ESXi 6.7 U3 Unlocker OEM BIOS 集成 REALTEK 网卡驱动和 NVMe 驱动 (集成驱动版)

ESXi-6.7.0-20221004001 Build 20497097 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-6-sysin/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org VMware ESXi 6.7.0 Update 3 Build 20497097 Unlocker &…

[Vulnhub] DC-7

下载链接&#xff1a;https://download.vulnhub.com/dc/DC-7.zip git信息泄露Drupal-CMS 拿shellnc反弹shell反弹shell写入root用户的cron定时任务&#xff0c;root执行提权 目录 <1> 信息搜集 (1) nmap扫靶机ip&端口服务 (2) github上DC-7项目信息泄露 <2&g…