前言:前几天有粉丝问我,网上java面试题总是参差不齐,希望我为他整理一套全面的java面试题,并且这套java面试题有个要求,必须能够让他20天就能看完这些面试题,他说现在很多面试题我看都得看3个月才能看完,然后我才能去找工作,但是自己得时间有限所以想让我帮他总结一套万能面试java求职笔记。接下来我将会至少分为12个章节进行阐述这套Java求职笔记,感兴趣的可以坚持看完!觉得不错的可以点个赞。
1为什么写这套Java求职笔记
很早的时候我就想写一些Java求职方向的一些文章,由于很长时间耽搁了加上,有粉丝后台问我,可不可以帮他总结一些java求职笔记,他看了很多Java技术有很多技术,很迷茫不知道学哪些,我笑着说,不要着急,无论你到什么时候你都会迷茫,因为技术一直在更新,谢谢你信任我,解救你的迷茫唯一办法就是多看LRyab博客,就是这样我带着粉丝的问题,开始编写了这套Java求职笔记,看完这套求职笔记,我相信很多人都会找到属于自己的心仪工作。
思来想去,本来不想放这套思维大纲技术图,但是很多大佬都喜欢放思维导图,那么我也放一张思维大脑图,方便大家以后学习,在java求职的时候可以带上这张脑图。
3Mybaties持久层框架面试考点
✅说一下Mybaties吧?
Mybatis是一款优秀的持久层框架,它对JDBC的操作数据库的过程进行了封装,使得开发者只需要关注SQL本身,不需要花费精力去处理一些重复和繁琐的步骤。通过java对象和statement中的SQL进行映射生成最终执行的SQL语句,最后由mysql框架执行SQL并将结果映射成java对象并返回。
✅ORM和半ORM:
ORM:关系对象映射,简单点就是将数据库中的表和java中的对象建立映射关系,可以让我们操作对象来间接的操作数据库。
半ORM:在查询关系对象或者关联集合对象时,需要手工编写sql来完成。
✅传统JDBC存在的问题
代码繁琐,重复度高,冗余度高
数据库链接对象多次创建
代码维护度高,需要修改的代码难度大
✅Mybaties的工作原理?
1、加载mybatis全局配置文件(数据源、mapper映射文件等),解析配置文件,MyBatis基于XML配置文件生成Configuration,和一个个MappedStatement(包括了参数映射配置、动态SQL语句、结果映射配置),其对应着<select | update | delete | insert>标签项。
2、构造会话工厂:SqlSessionFactoryBuilder通过Configuration对象生成SqlSessionFactory,用来开启SqlSession。
3、SqlSession对象完成和数据库的交互。
3.1用户程序调用mybatis接口层api(即Mapper接口中的方法)
3.2SqlSession通过调用api的Statement ID找到对应的MappedStatement对象
3.3通过Executor(负责动态SQL的生成和查询缓存的维护)将MappedStatement对象进行解析,sql参数转化、动态sql拼接,生成jdbc Statement对象
4、JDBC执行sql
5、借助MappedStatement中的结果映射关系,将返回结果转化成HashMap、JavaBean等存储结构并返回。
✅ Mybaties框架的优缺点
优点:
基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。
与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;
很好的与各种数据库兼容,能够与 Spring 很好的集成;
提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。
缺点:
SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。
QL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
✅Mybaties的编码步骤是什么?
创建工厂类
通过工厂类创建sqlsession
执行数据库
提交事务
关闭会话
✅Mybaties #{}和${}的区别?
#是预编译处理,会把SQL中的#{}替换为?调用PreparedStatement的set方法来赋值,使用#{}可以有效的防止sql注入,提升系统的安全性。
${}是字符串替换,用于标签属性值和sql内部,属于静态文本替换。把${}替换为变量的值
✅模糊查询like语句该怎么写?
在java中直接添加sql通配符
在sql语句中进行拼接通配符(会引起sql注入问题)
✅实体类型属性名称和表字段名称不一致怎么办?
查询sql定义字段名的别名,让别名和实体类属性一致
通过resultMap类映射字段名和实体类型属性名一一对应
✅说一下Mybaties中xml的常见标签?
select、insert、updae、delete、resultMap、parameterMap、sql、include
✅Mybaties中的动态sql?简述一下动态sql的原理
MyBatis动态sql可以在Xml映射文件内,以标签的形式编写动态sql。执行原理是根据表达式的值完成逻辑判断并动态拼接 sql 的功能。
MyBatis提供了9种动态sql标签:trim、where、set、foreach、if、choose、when、otherwise、bind。
✅说说Mybaties中的一级缓存和二级缓存
一级缓存是SqlSession级别的缓存。在操作数据库时需要构造 sqlSession对象,在对象中有一个(内存区域)数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。
一级缓存的作用域是同一个SqlSession,在同一个sqlSession中两次执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。当一个sqlSession结束后该sqlSession中的一级缓存也就不存在了。Mybatis默认开启一级缓存。
二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession去操作数据库得到数据会存在二级缓存区域,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。
二级缓存是多个SqlSession共享的,其作用域是mapper的同一个namespace,不同的sqlSession两次执行相同namespace下的sql语句且向sql中传递参数也相同即最终执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。Mybatis默认没有开启二级缓存需要在setting全局参数中配置开启二级缓存。
如果缓存中有数据就不用从数据库中获取,大大提高系统性能。
✅Mybaties中如何实现分页的?
mybatis框架分页实现,有几种方式,
最简单的就是利用原生的sql关键字limit来实现
还有一种rowsbounds就是利用interceptor来拼接sql,实现和limit一样的功能
再一个就是利用PageHelper来实现。
✅ Mybaties的分页插件的运行原理,如何实现分页的,自己如何写插件?
分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。
举例:select * from student,拦截sql后重写为:select t.* from (select * from student) t limit 0, 10
Mybatis仅可以编写针对ParameterHandler、ResultSetHandler、StatementHandler、Executor这4种接口的插件,Mybatis使用JDK的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法,当然,只会拦截那些你指定需要拦截的方法。
实现Mybatis的Interceptor接口并复写intercept()方法,然后在给插件编写注解,指定要拦截哪一个接口的哪些方法即可,记住,别忘了在配置文件中配置你编写的插件。
✅Mybaties-Plus简介
Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
5个人说明
联系客服