目录
9、Spring中的Bean创建的⽣命周期有哪些步骤(简单步骤)
11、ApplicationContext和BeanFactory有什么区别
18、Spring中什么时候@Transactional会失效
1、Mybatis的优缺点
优点:
-
基于 SQL 语句编程,相当灵活,不会对应⽤程序或者数据库的现有设计造成任何影响,SQL 写在 XML ⾥,解除 sql 与程序代码的耦合,便于统⼀管理;提供 XML 标签, ⽀持编写动态 SQL 语 句, 并可重⽤。
-
与 JDBC 相⽐,减少了 50%以上的代码量,消除了 JDBC ⼤量冗余的代码,不需要⼿动开关连 接;
-
很好的与各种数据库兼容( 因为 MyBatis 使⽤ JDBC 来连接数据库,所以只要JDBC ⽀持的数据 库 MyBatis 都⽀持)。
-
能够与 Spring 很好的集成;
-
提供映射标签, ⽀持对象与数据库的 ORM 字段关系映射; 提供对象关系映射标签, ⽀持对象关 系组件维护。 ‘
缺点:
-
SQL 语句的编写⼯作量较⼤, 尤其当字段多、关联表多时, 对开发⼈员编写SQL 语句的功底有⼀ 定要求。
-
SQL 语句依赖于数据库, 导致数据库移植性差, 不能随意更换数据库。
2、#{}和${}的区别是什么?
-
${}的本质就是字符串拼接,#{}的本质就是占位符赋值
-
${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号
-
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调⽤ PreparedStatement 来赋值;
-
Mybatis在处理${}时,会将sql中的${}替换成变量的值,调⽤ Statement 来赋值;
-
使⽤#{}可以有效的防⽌ SQL 注⼊, 提⾼系统安全性。
3、什么情况下必须用${}
1.当参数不需要字符串包裹起来的时候
2.当sql中表名是从参数中取的情况 (动态拼接表名的时候)
3.order by排序语句中,因为order by 后边必须跟字段名,这个字段名不能带引号,如果带引号会被识别会字符串,而不是字段
4、Mybatis缓存
-
没有关闭或者提交SqlSession时,查询的数据会保存在一级缓存中,当我们关闭或者提交了SqlSession时,数据才会保存在二级缓存中
-
MyBatis的一级缓存,一级缓存是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库重新访问
一级缓存失效的四种情况:
1、不同的SqlSession对应不同的一级缓存
2、同一个SqlSession但是查询条件不同
3、同一个SqlSession两次查询期间执行了任何一次增删改操作,这样做的目的为了让缓存中存储的是最新的信息,避免脏读。
4、同一个SqlSession两次查询期间手动清空了缓存
-
MyBatis的二级缓存,二级缓存是SqlSessionFactory级别,通过同一个SqlSessionFactory创建的SqlSession查询的结果会被缓存;此后若再次执行相同的查询语句,结果就会从缓存中获取。
二级缓存开启的条件:
1)在核心配置文件中,设置全局配置属性cacheEnabled="true",默认为true,不需要设置
2)在映射文件中设置<cache> 标签表示当前这个 mapper 映射将使用二级缓存,区分的标准就看mapper的namespace值。
3)二级缓存必须在SqlSession关闭或提交之后才有效
4)查询的数据所转换的实体类类型必须实现序列化的接口
使二级缓存失效的情况:
两次查询之间执行了任意的增删改,会使一级和二级缓存同时失效
5、MyBatis缓存查询的顺序
-
先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用
-
如果二级缓存没有命中,再查询一级缓存
-
如果一级缓存也没有命中,则查询数据库
-
SqlSession关闭之后,一级缓存中的数据会写入二级缓存
6、谈谈你对IOC的理解
-
控制反转,把对象创建和对象内属性的赋值 ,交给Spring进行管理,
-
我们可以把控制反转拆开理解,所谓控制就是控制对象的创建 、对象内属性的赋值,
-
如果我们不⽤Spring,那我们得⾃⼰来做这两件事,反过来,我们⽤Spring,这两件事情就不⽤我们做 了,
-
我们要做的仅仅是定义类,以及定义哪些属性需要Spring来赋值(⽐如某个属性上加 @Autowired),
-
⽽这其实就是第⼆个问题的答案,这就是反转,表示⼀种对象控制权的转移。
总结:
IOC表示控制反转,表示如果⽤Spring,那么Spring会负责来创建对象,以及给对象内的属性赋值,也就是如果⽤Spring,那么对象的控制权会转交给Spring。
7、单例Bean和单例模式
-
单例模式表示JVM中某个类的对象只会存在唯⼀⼀个。
-
⽽单例Bean并不表示JVM中只能存在唯⼀的某个类的Bean对象。
8、Bean的作用域
-
在Spring里面,设置创建bean实例是单实例(只有一个对象,对象地址是一样的