0
点赞
收藏
分享

微信扫一扫

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

编程练习生J 2023-01-30 阅读 35

Xmind导图知识点

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. 一千万条数据的表, 如何分页查询
  1. MySQL怎么恢复半个月前的数据
  1. MySQL事务的隔离级别, 分别有什么特点
  1. 唯一索引比普通索引快吗, 为什么?

原因是:

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

Mybatis部分

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

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

  1. 使用MyBatis的mapper接口调用时有哪些要求?
  1. Mybatis如何执行批量操作

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

所以这个时候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 关注 获取

举报

相关推荐

0 条评论