请尊重个人总结成果,如果有误还请指出。
1、Mybatis里用到了那些设计模式?
1、构建者模式:
解释:由多个简单的对象创建成复杂的对象
作用:sqlSessionFactoryBuilder调用XmlCongigBuilder解析XML文件
2、工厂模式:
解释:定义一个创建对象的接口,由子类实例化。
作用:Mybatis中执行sql语句、获取Mappers、SqlSession的创建过程中使用了工厂类。
3、代理模式:
解释:给某一个对象提供一个代理,并由代理对象控制对元对象的引用。
作用:在使用Configuration调用getMapper方法时,使用动态代理模式生成新的对象,代理对象进行了crud的方法。
2、Mybatis架构设计
1、接口层:提供对数据库的crud和配置信息维护接口,与数据库交互分为两种模式,一种是传统的mybatis提供的api,一种是mapper代理。
2、数据处理层:负责具体的SQL查找、SQL解析、SQL执⾏和执⾏结果映射处理等。它主要的⽬的是根据调用的请求完成⼀次数据库操作。
3、框架支持层:负责最基础的功能⽀撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是 共用的东⻄,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的⽀撑。
3、mybatis的主要构件及其相互关系
1、SqlSession:作为MyBatis⼯作的主要顶层API,表示和数据库交互的会话,完成必要数 据库增删改查功能
2、Executor:MyBatis执⾏器,是MyBatis调度的核⼼,负责SQL语句的⽣成和查询缓 存的维护
3、StatementHandler:封装了JDBC Statement操作,负责对JDBC statement的操作,如设置参 数、将Statement结果集转换成List集合。
4、ParameterHandler:负责对⽤户传递的参数转换成JDBC Statement所需要的参数
5、ResultSetHandler:负责将JDBC返回的ResultSet结果集对象转换成List类型的集合
6、TypeHandler:负责java数据类型和jdbc数据类型之间的映射和转换
7、MappedStatement:MappedStatement维护了⼀条<select | update | delete | insert>节点 的封 装
8、SqlSource:动态地⽣成SQL语句,将信息封 装到BoundSql对象中,并返回
9、BoundSql:表示动态⽣成的SQL语句以及相应的参数信息
4、mybatis总体流程
加载conf.xml和mapper.xml文件,将文件的配置内容解析封装到configuration,将sql的配置加载成为一个mappedstatement对象,存储在内存之内,并把它作为参数传入到build()方法中,并返回一个defaultSQLSessionFactory。我们再调用openSession()方法,来获取SqlSession,在构建SqlSession的同时还需要transaction和executor用于后续执行操作。
5、二级缓存和一级缓存谁先执行?
二级缓存构建在⼀级缓存之上,在收到查询请求时,MyBatis ⾸先会查询二级缓存,若二级缓存未命 中,再去查询⼀级缓存,⼀级缓存没有,再查询数据库。
6、什么是延迟加载?基于什么实现?
就是在需要⽤到数据时才进⾏加载,不需要⽤到数据时就不加载数据。延迟加载也称懒加载。
延迟加载是基于嵌套查询来实现的
7、什么时候会采用延迟加载和立即加载?延迟加载优缺点是什么?
⼀对多,多对多:通常情况下采⽤延迟加载
⼀对⼀(多对⼀):通常情况下采⽤⽴即加载
优点:先从单表查询,在需要其他数据时,才会去关联查询,大大提升数据库性能。
缺点:因为只有在需要数据时才会去查询,如果大批量数据操作,会造成查询时间过长,降低用户体验。
8、延迟加载原理:
基于动态代理,通过代理拦截到指定方法,执行数据加载。
9、mybatis常用的注解
@Insert:实现新增
@Update:实现更新
@Delete:实现删除
@Select:实现查询
@Result:实现结果集封装
@Results:可以与
@Result ⼀起使⽤,封装多个结果集
@One:实现⼀对⼀结果集封装
@Many:实现⼀对多结果集封装
10、什么是Mybatis?
1、它是一个框架,他封装了jdbc的加载驱动连接数据库等复杂过程
2、可以用xml或者注解来配置和映射原生信息
3、可以方便在执行sql并返回对象
11、工作原理?
先封装sql,接着调用jdbc操作数据库,最后将数据封装成Java类返回
12、#{}和${}有什么区别?
#{}是预处理,比如sql语句进行预处理时,会将sql中的#{}替换为?号。${}是字符串替换
13、通常一个mapper.xml文件,都会对应一个Dao接口,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?
mapper工作原理是jdk动态代理,mybatis运行时会调用jdk动态代理为mapper接口生成代理对象,代理对象会拦截接口方法,然后找到MapperStatement并执行sql,然后返回sql结果。
mapper接口不可重载,因为使用的是 全限名+方法名的保存和寻找策略
14、使用MyBatis的mapper接口调用时有哪些要求?
1、Mapper接口方法名和mapper.xml中定义的每个sql的id相同;
2、Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同;
3、Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同;
4、Mapper.xml文件中的namespace即是mapper接口的类路径。
15、什么是MyBatis的接口绑定?有哪些实现方式?
接口绑定,就是在MyBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定, 我们直接调用接口方法就可以,这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置。接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加上 @Select、@Update等注解,里面包含Sql语句来绑定;
16、MyBatis与Hibernate有哪些不同?
1、Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句。
2、Mybatis直接编写原生态sql,可以严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需求变化要求迅速输出成果。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件,则需要自定义多套sql映射文件,工作量大。
3、Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用hibernate开发可以节省很多代码,提高效率。
17、Mybatis是如何进行分页的?分页插件的原理是什么?
Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。
分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。