- 前言
- 面经4
- 说说Spring Boot常用的注解
- MyBatis 与 Hibernate 有哪些不同?
- MyBatis使用过程?生命周期?
- MyBatis 动态 SQL 是做什么的?都有哪些动态 SQL?能简述一下动态 SQL的执行原理不?
- MyBatis 是如何进行分页的?分页插件的原理是什么?
- MyBatis 有几种分页方式?
- Mybatis都有哪些Executor执行器?
- 拦截器与过滤器的区别?
- 全部系列
前言
记录收集到的常用Java面试题(系列4)
面经4 说说Spring Boot常用的注解
@SpringBootApplication:它是SpringBoot的核心注解,用于开启自动配置,准确的说是通过该注解内的@EnablAutoConfiguration注解实现的自动配置。
@EnableAutoConfiguration:自动配置注解,在启动Spring应用程序上下文时进行自动配置,自动配置通常是基于项目classpath中引入的类和已定义的bean来实现的。
@Import:@EnableAutoConfiguration的关键功能是通过@Import注解导入的ImportSelector来完成的。
@Congiguration:配置类注解,根据一些特定条件来控制bean的实例化的行为。
@ComponentScan:位置在SpringBoot的启动类上,Spring包扫描。
MyBatis 和 Hibernate不同,它不完全是一个 ORM 框架,因为 MyBatis 需要程序员自己编写 SQL 语句;Hibernate 对象/ 关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用 Hibernate 开发可以节省很多代码,提高效率;
MyBatis 直接编写原生态 SQL,可以严格控制 SQL 执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需求变化要求迅速输出成果。但是灵活的前提是 MyBatis 无法做到数据库无关性,如果需要实现支持多种数据库的软件,则需要自定义多套 SQL 映射文件,工作量大。
MyBatis使用过程?生命周期?1)创建SqlSessionFactory 2)通过SqlSessionFactory创建SqlSession 3)通过sqlsession执行数据库操作 4)调用session.commit()提交事务 5)调用session.close()关闭会话
SqlSessionFactoryBuilder
一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的生命周期只存在于方法的内部。
SqlSessionFactory
SqlSessionFactory 是用来创建SqlSession的,相当于一个数据库连接池,每次创建SqlSessionFactory都会使用数据库资源,多次创建和销毁是对资源的浪费。所以SqlSessionFactory是应用 级的生命周期,而且应该是单例的。
SqlSession
SqlSession相当于JDBC中的Connection,SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的生命周期是一次请求或一个方法。
Mapper
映射器是一些绑定映射语句的接口。映射器接口的实例是从 SqlSession 中获得的,它的生命周期在sqlsession事务方法之内,一般会控制在方法级。
MyBatis 动态 SQL 可以让我们在 XML 映射文件内,以标签的形式编写动态 SQL,完成逻辑判断和动态拼接 SQL 的功能;
MyBatis 提供了 9 种动态 SQL 标签:trim、where、set、foreach、if、choose、when、otherwise、bind;
执行原理:使用 OGNL 从 SQL 参数对象中计算表达式的值,根据表达式的值动态拼接 SQL,以此来完成动态 SQL 的功能
MyBatis 是如何进行分页的?分页插件的原理是什么?MyBatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而非物理分页。可以在 SQL 内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。
分页插件的基本原理是使用 MyBatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的 SQL,然后重写 SQL,根据 dialect 方言,添加对应的物理分页语句和物理分页参数
MyBatis 有几种分页方式?数组分页
SQL 分页
拦截器分页
RowBounds 分页
Mybatis都有哪些Executor执行器?Mybatis有三种基本的Executor执行器,SimpleExecutor、ReuseExecutor、BatchExecutor。
拦截器与过滤器的区别?①:拦截器是基于java的反射机制的,而过滤器是基于函数的回调。
②:拦截器不依赖于servlet容器,而过滤器依赖于servlet容器。
③:拦截器只对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
④:拦截器可以访问action上下文、值、栈里面的对象,而过滤器不可以。
⑤:在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥:拦截器可以获取IOC容器中的各个bean,而过滤器不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
全部系列
面经1:https://blog.csdn.net/Oliver__Twist/article/details/125459141?spm=1001.2014.3001.5501
面经2:https://blog.csdn.net/Oliver__Twist/article/details/125461522?spm=1001.2014.3001.5501
面经3:https://blog.csdn.net/Oliver__Twist/article/details/125461610?spm=1001.2014.3001.5501
面经4:https://blog.csdn.net/Oliver__Twist/article/details/125461632?spm=1001.2014.3001.5501
面经5:https://blog.csdn.net/Oliver__Twist/article/details/125461655?spm=1001.2014.3001.5501



