Spring常用注解:
@Controlle,@Service,@Repository,@Component,@Bean,@AutoWired
SpringMVC常用注解:
@RequestController,@RequestMapping,@PostMapping,@GetMapping,@PutMapping,@DeleteMapping,@RequestBody(JSON),@RequestParam(key=value),@PathVariable(路径传参)
Springboot常用注解:
核心注解:
-
@SpringBootApplication声明在启动类上,由@SpringBootConfiguration(包含了Configuration)声明是一个spring应用程序配置类,
-
@EnableAutoConfiguration[包含了@AutoConfigurationPackage(包含了@Import)]本来有124个配置类,筛除重复、自己设定的、和不满足条件的后只剩下22个类。
-
@ComponentScan(可以自己设置扫描路径,如果不设置则默认扫描所在包下)注解组成。
-
@Import导入其它带有@Configuration注解的配置类。
-
@Rusoures按名称查找,如果找不到就按type类型查找。
-
@AutoWired按type类型查找。
@Transactional事务注解:
-
编程式:使用TransactionTemplate。
-
声明式:使用AOP思想,方法开始前创建事务,回滚时通过@Transactional即可回滚,主要用这个。
Java三大异常类:
-
Error(程序无法处理的异常,如内存溢出或被强行终止),
-
RuntimeException(代码编写方式不当而造成的异常),
-
Exception(最大的异常类,一般异常。)
-
@ControllerAdvice( 统一处理异常)
-
@ExceptionHandler(注解声明异常处理方法)
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) @ResponseBody String handleException(){ return "Exception Deal!"; } }
SpringCloud:
1
MySQL:
什么情况索引会失效:
-
索引列参与表达式计算:
-
SELECT 'sname' FROM 'stu' WHERE 'age' + 10 = 30;
-
-
函数运算:
-
SELECT 'sname' FROM 'stu' WHERE LEFT('date',4) < 1990;
-
-
%词语%–模糊查询:
-
SELECT * FROM 'manong' WHERE
uname
LIKE '码农%' -- 走索引 -
SELECT * FROM 'manong' WHERE
uname
LIKE '%码农%' -- 不走索引
-
-
字符串与数字比较不走索引:
-
EATE TABLE 'a' ('a' char(10));
-
EXPLAIN SELECT * FROM 'a' WHERE 'a'="1" — 走索引;
-
EXPLAIN SELECT * FROM 'a'WHERE 'a'=1 — 不走索引,同样也是使用了函数运算。
-
-
-
查询条件中有 or ,即使其中有条件带索引也不会使用。换言之,就是要求使用的所有字段,都必须建立索引:select * from dept where dname='xxx' or loc='xx' or deptno = 45;
-
正则表达式不使用索引。
-
MySQL 内部优化器会对 SQL 语句进行优化,如果优化器估计使用全表扫描要比使用索引快,则不使用索引。
MySQL性能优化:
-
服务器优化(增加CPU、内存、网络、更换高性能磁盘)
-
表设计优化(字段长度控制、添加必要的索引)
-
SQL优化(避免SQL命中不到索引的情况)
-
架构部署优化(一主多从集群部署)
-
编码优化实现读写分离
SQL内外连接外连接差别:
-
内连接:内连接li(inner join)就是join)利用where 子句对多表连接形成的笛卡尔积进行筛选。说白了内连接就是获取两个表之间的公共部分内容;
-
左外连接left join:如果要获取左边表中的全部内容,就使用左连接;
-
右连接right join:如果要获取右边表的全部内容,就使用右连接。
函数:
常见聚合函数:
-
count(col): 表示求指定列的总行数
-
max(col): 表示求指定列的最大值
-
min(col): 表示求指定列的最小值
-
sum(col): 表示求指定列的和
-
avg(col): 表示求指定列的平均值
去重
-
distinct。
存储引擎:
多表查询:
SELECT 查询列表 FROM 表1 [AS] 别名 [连接类型(LEFT、RIGHT、INNER)] JOIN 表2 [AS] 别名 ON 连接条件 WHERE 分组前筛选条件 GROUP BY 分组 HAVING 分组后筛选条件 ORDER BY 排序字段
MySQL的锁:
-
表级锁:
-
MyISAM,颗粒度大,开销小,获取和释放锁快,不会出现死锁,适用于查询为主少量更新的情况。
-
-
行级锁:
-
InnoDB,颗粒度小,开销大,获取和释放锁慢,容易出现死锁,适用于对事物完整性高的情况。
-
共享锁:读锁,多个事务访问同一数据的共享锁,都能访问但也只能访问不能修改,简称只读。
-
排它锁:写锁,不能和其它锁共存,事务获取一个数据行的排它锁后其它事务就不能再获取该数据行的其它锁,只有获取到排它锁的事务才能读取和修改。
-
-
MySQL事务四大特征:
原子性:
-
事务中的操作为一个整体,一旦出错就回滚错误,也就是要么都做,要么都不做。
一致性:
-
保证事务从一个”正确的状态“到另一个”正确的状态“,如A有50,B也有50,A最多给B50使B有100,而不可能A给B100使A有-50,B有150。
隔离性:
-
事务之间不能有干扰,并发事务之间需要隔离,即在一个事务看来,另一个事务要么在它执行之前已经结束,要么在它结束之后才开始执行。
持久性:
-
事务一旦提交对数据库的数据更改就是永久的,后续的故障等都不会有影响。
数据库优化:
-
服务器优化(硬件性能)。
-
表设计优化(字段长度控制,添加必要索引,一定辅助字段)。
-
SQL优化(避免索引无法命中)。
-
架构部署优化(主从集群)。
-
读写分离优化(主写从读)。
并发:
-
使用MVCC思想设计乐观锁,加辅助字段version,每次修改version+1,并发情况CPU抢回来后如果修改后version和之前的不相等则修改。
Java1.8新特性:
-
Lambda表达式;
-
Stream API;
-
DateTime API;
-
方法引用(Student::getName;)和构造器引用;
-
其它新特性。
多态:
优点:
-
消除类型之间的耦合关系;
-
可替换性;
-
可重复性;
-
可扩充性;
-
接口性;
-
灵活性;
-
简化性。
存在的三个必要条件:
-
继承;
-
重写;
-
父类引用指向子类对象。
People people = new Person();
接口和抽象类区别:
接口:
-
不能定义构造器;
-
可以定义抽象方法、静态方法、私有方法(前两者JDK8开始,后者JDK9开始);
-
成员可以是Private、Default、Protected、Public;
-
成员变量其实都是常量;
-
一个类可以实现多个接口。
抽象类:
-
可以定义构造器;
-
可以有抽象方法和具体方法(非/静态方法);
-
成员修饰符全部是Public;
-
可以定义成员变量(非/静态方法,常量);
-
有抽象方法的类必须声明未抽象类,但抽象类中可以有非抽象方法;
-
可以包含静态方法;
-
一个类只能继承一个抽象类(Java的单继承)。
线程用start和run执行的区别:
start:
线程处于就绪状态而非运行状态,JVM就可以用run()调度这个线程,run()方法结束后线程终止。
run():
直接当做普通函数调用。
也就是说start()是异步执行,run()是同步执行。
重载和重写的区别:
重载:
-
要求方法同名,但参数列表不同;
-
重载是多态编译时的表现。
重写:
-
子类重写父类方法;
-
方法名、参数列表、返回值都必须相同;
-
修饰符限制必须大于 被重写方法的修饰符限制;
-
重写的方法抛出的异常必须不能是新的,或者比被重写方法抛出的异常更宽泛。
-
重写是多态运行时的表现。
MyBatis和MyBatis-Plus:
Plus:
-
乐观锁;
-
分页插件;
-
代码生成器。