springboot
解耦是一种很好的设计规范。Dao层负责解析数据,那么在service层里面,我们就需要new来自Dao层的实例对象来进行方法的调用。同理在Controller层我们需要new来自service层的对象,这样做如果后续Dao和Controller层的实现发生改变时,那么调用这两个的实例对象也需要修改。在spring里面也提供了解耦的方法,就是上交管理权限和容器注入。
把new实例对象的操作交给spring来使用,这样spring就会使用容器来管理存储这些对象,并在使用时通过调用容器的方式来传递参数。
解耦
将需要解耦的类使用Component,需要管理的对象使用AutoWired来进行注解。并且,为了更好的标注Component的作用,还衍生出了这些类的不同注解,例如:
- @Service:注解服务层
- @Controller:注解控制层
- @Repository:数据访问类
Mysql
在Mysql中,现在来总结一下事务和索引这两个不太熟悉的概念。
事务
只有InnodeDB支持事务,其它类型的数据库均不支持。
事务可以理解为一把锁。除此之外,当事物执行失败的时候,它还支持回归事物,即如果某条sql语句执行失败,那么可以通过事务回滚来回到执行前的状态。
一些八股
数据库为了解决并发场景提出了事务的概念,而事务包括下面几个特点
- 
原子性(A) 事务要么提交成功,要么提交失败后回滚,不存在事务中某一部分的值成功修改,而一部分值没有发生修改。其中失败回滚是通过日志系统来完成的,即在修改数据前先把旧的数据写入 undo_log里面,当需要失败回滚时,就可以把数据还原。
- 
一致性(C) 一致性是指事务确保了数据的合理性和正确性。合理性是指值的变量在一个合理的范围内 
- 
隔离性(I) 不同事务之间存在隔离性,并且隔离性也分等级,隔离等级越高,并发效果越好,但是效率越差。 
- 
持久性(D) 数据库就是专门为持久化数据而准备的 
在此,我们用两个事物A,B来分析一下可能出现的情况。
脏读
顾名思义,脏读就是读取了一个错误的数据。
假设一种情况,事务A修改了一些数据,但是还未来得及提交,此时事务B再读这些数据就是发生了脏读。
幻读
幻读也是发生在查询数据之间的,例如在事务A里面我们要进行查询数据,在两条查询语句之间,事务B插入了新的数据;
这会导致A查询出来的数据前后结果不一致,注意,幻读一般指查询的集合前后不一致,也就是查询出来的行数前后不同。
不可重复读
与幻读相似,不过一般指的是某个值而并非某一行数据不可重复读。
索引
索引是为了加快查询速度而抽象出来的一种数据结构。其中索引使用的数据结构是B+树。
B+ 树
B+树是一种特殊的数据结构,其数据全部存储在叶子结点,而非叶子结点存储的是下一级的物理地址,与B树不同的的地方有
- B+树的数据只在叶子结点保存
- 其叶子结点是双向链表连接
- 查询效率高
但是本质上还是空间换时间的机制来加快查找速度。
在mysql中,primary key以及unique值会自动创建索引,也就是默认索引,根据索引来查询数据的效率是最高的。
下面是创建索引的sql语句
|  |  | 
一般创建的索引命名如下
idx是代之索引index,user是表名,name是根据哪个字段创建索引,意思就是给user表的name字段创建一个索引。