1.持久层解决方案:
1.1.面试1:请说一说持久层解决方案有哪些???
- 1.jdbc
- JDBC为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题。Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,这样就使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。
- 2.DBUtils:
- DBUtils是一个小型的类库, 是一个jdbc的工具,主要是为了简化jdbc的代码使JDBC编程更加方便,简单。
- 在JDBC编程中,资源的关闭是显式的,极易导致编程出现错误,DBUtils把这些工作抽象出来,使得程序员编程时仅需要关心正真的问题,即对数据库的增删改查
- 3.JdbcTemplate
- JdbcTemplate是Spring提供的一个JDBC模板类,是对JDBC的封装,简化JDBC代码
- 4.MyBatis
- 5.Hibernate(实现了JPA规范)
- 8.
Spring Data
(实现了JPA规范)
1.2.面试2:持久层各解决方案的对比:
a.Jdbc方案介绍:
1.jdbc学习:
- 1.JDBC学习大纲
2.操作流程
- 加载数据库驱动
- 通过驱动管理,获取数据库的连接
- 编写sql语句,使用?表示占位符
- 获取预处理statemennt,执行查询
- 设计传参
- 结果集处理
- 释放资源,关闭数据库连接
3.使用JDBC的缺陷
- 代码比较多,开发效率低
- 需要
关注 Connection ,Statement, ResultSet 对象创建和销毁
- 对 ResultSet 查询的结果,需要自己封装为 List
- 重复的代码比较多些
- 业务代码和数据库的操作混在一起,
SQL语句写死在Java程序中,不灵活。改SQL的话就要改Java代码。违背开闭原则OCP
b.Appache的DBUtils与Spring中的JdbcTemplate
- 1.DBUtils它和Spring中的JdbcTemplate很像,是对Jdbc的简单封装
- JdbcTemplate是对Jdbc的简单封装的
- [说明]
以上这些都不是框架
,是一种JDBC是规范
;Spring中的JdbcTemplate
和Appache的DBUtils
都只是工具类
- 2.
JDBC -> Dbutils ->jdbcTemplate
;使用这些工具类,功能简单,sql语句是编写在了java代码里面,耦合度较高,而框架是一个整体的解决方案
,所以就诞生了很多框架
c.Hibernate特点:
- 1.长难复杂SQL,对于Hibernate而言处理也不容易
- 2.内部自动生产的SQL,不容易做特殊优化。
- 3.基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。 导致数据库性能下降
- 4.
Hibernate框架就是一个全自动化的ORM。使用Hibernate框架的时候,不需要程序员手动编写SQL语句,SQL语句可以自动生成。所以Hibernate是一个完全的全自动化的ORM框架。半自动步枪和全自动突击步枪,一个精度准火力不足,一个火力猛精度不够。
2.明确一些概念:
2.1.什么是框架:
- 1.框架其实就是
对通用代码
的封装,提前写好了一堆接口和类,我们可以在做项目的时候直接引入这些接口和类(引入框架),基于这些现有的接口和类进行开发,可以大大提高开发效率。 - 2.框架一般都以
jar包
的形式存在。(jar包中有class文件以及各种配置文件等
)
2.2.三层架构:
- 1.表现层(UI):直接跟前端打交互(一是
接收前端ajax请求,二是返回json数据给前端
) - 2.业务逻辑层(BLL):一是处理表现层转发过来的前端请求(也就是具体业务),二是将从持久层获取的数据返回到表现层。
- 3.数据访问层(DAL):直接操作数据库完成CRUD,并将获得的数据返回到上一层(也就是业务逻辑层)
2.3.面试题3:请介绍什么是ORM思想:
a.什么是ORM:
- 1.所谓的ORM是Dao层的一种思想,意思就是
对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping)
;
b.ORM有什么作用:
- 1.ORM就是把
数据库表和实体类及实体类的属性对应起来
,然后我们在操作实体类就是相当于在操作数据库表
- O就是Object:Java虚拟机中的Java对象
- R就是Relation:关系型数据库
- M就是Map:将Java虚拟机中的Java对象映射到数据库表中一行记录,或是将数据库表中一行记录映射成Java虚拟机中的一个Java对象。
c.图示分析ORM:
- 1.ORM思想使得开发者能更专注于业务的开发,能培养开发者的面向对象思想,体验java面向对象开发的便捷
d.ORM思想主张:
- 保存时,
把java对象数据直接保存到关系型数据库对应的表中
- 读取时,直
接把关系型数据库表中的数据读成java对象
e.基于ORM思想的框架:
- 1.较流行的是:hibernate,
mybatis
,JPAS
3.面试4:请介绍MyBatis框架:
3.1.MyBatis下载
3.2.MyBatis概述:
- 1.MyBatis最初是Apache的一个开源项目iBatis,后来iBatis3.x正式更名为MyBatis
- 2.MyBatis是一个
基于Java的持久层框架
,其本质上就是对JDBC的封装,基于ORM的思想,完成对数据库的CRUD操作 - 3.mybatis在java和sql之间提供了更加灵活的映射方案,可以将对数据表的操作(sql等)直接剥离,写到xml配置文件中,实现java代码的解耦
- 4.iBATIS提供的持久层框架包括
SQL Maps(
sql映射)和Data Access Objects
(DAOs)
3.3.MyBatis作用:
- 1.MyBatis
减轻使用 JDBC 的复杂性
,不用编写重复的创建 Connetion , Statement ; 不用编写关闭资源代码。直接使用 java 对象,表示结果数据
。让开发者专注 SQL的处理
。 其他分心的工作由 MyBatis 代劳。 - 2.MyBatis还可以完成:
- 注册数据库的驱动,例如 Class.forName(“com.mysql.jdbc.Driver”))
- 创建 JDBC 中必须使用的 Connection , Statement, ResultSet 对象
- 从 xml 中获取 sql,并执行 sql 语句,把 ResultSet 结果转换 java 对象
List<Student> list = new ArrayLsit<>(); ResultSet rs = state.executeQuery(“select * from student”); while(rs.next){ Student student = new Student(); student.setName(rs.getString(“name”)); student.setAge(rs.getInt(“age”)); list.add(student); }
- .
关闭资源:
ResultSet.close() , Statement.close() , Conenection.close()
3.4.MyBatis特点:
- 1.MyBatis 是
支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
- 2.MyBatis
避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
- 3.MyBatis
支持XML开发和注解开发
,我们可以用XML或注解用于配置和原始映射【为了保证sql语句的灵活,所以mybatis大部分是采用XML方式开发。】 - 4.
将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录
- 5.体积小好学:两个jar包,两个XML配置文件
- 6.完全做到
sql解耦合
。 - 7.提供了
基本映射标签
。 - 8.提供了
高级映射标签
。 - 9.提供了XML标签,支持动态SQL的编写
4.MyBatis操作数据库的原理:
4.1.MyBatis框架的结构:
4.2.面试4:MyBatis执行过程:
- 1.mybatis配置:
SqlMapConfig.xml
,此文件作为mybatis的全局配置文件
,配置了mybatis的运行环境
等信息。mapper.xml
文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载
。
- 2.通过mybatis环境等配置信息
构造SqlSessionFactory即会话工厂
- 3.由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
- 4.
mybatis底层自定义了Executor执行器接口操作数据库
,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。 - 5.
Mapped Statement
也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id
。 - 6.
Mapped Statement
对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。 - 7.
Mapped Statement
对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
4.3.面试5:MyBatis执行原理:
首先需要解析配置(MyBatis-config.xml),将配置文件的内容转换为Java对象(Configuration)加载到内存中,包括一些xxxMapper.xml文件,将这些文件解析成MappedStatement对象,保存其SQL语句、参数映射等信息
我们在代码里面写的Mapper都是接口,实际的实现类是由MyBatis利用JDK动态代理生成的,具体是在MapperProxyFactory中生成的代理类
当调用Mapper接口中的方法的时候,代理对象会将调用的信息传递给MyBatis内部的MapperProxyFactory对象,实际上调用方法时,会触发MapperMethod来执行具体逻辑
可以看到里面分类 insert、update、delete等不同的处理方法,这时候就可以执行具体的语句了
这里先解释下Command是什么,他是MapperMethod内部的一个属性
这个command就是通过调用的接口名 + 方法名,从Configuration中找到MappedStament对象,这个记录了SQL内容、出参入参等等,这样就得到了最终的SQL相关信息了,跟前面的配置串起来了
MyBatis还有缓存机制,会经过CachingExecutor的处理,这里主要是二级缓存的处理。
最终还是会看到JDBC执行SQL的流程,从下面的代码可以看到,获取connection实际上会从连接池中获取,且得到Stateent
然后调用exectute执行
最终通过resultSethandler处理查询得到的结果,将其映射到对应的实体对象