mybaties面试知识
Mybatis是什么
- 开源的数据持久层框架
- 将sql语句与代码文件分离,可以在不修改代码情况下修改sql语句,作为持久层框架,将sql语句分离到配置文件xml中。实现sql语句灵活配置。
- 集合了jdbc的操作。
为什么使用Mybatis代替JDBC
- 简化了jdbc的繁琐操作和样板代码,如每次要建立连接,设置参数等。
- 提高了sql的维护性,jdbc的sql语句分布在代码的各各位置,mybaties将sql语句实现了封装
- mybatis可以支持动态sql语句。
MyBatis 可以大大简化数据库操作的代码,提高 SQL 语句的可维护性和可读性,同时还提供了强大的动态 SQL 功能,易于集成使用。因此,相比于直接使用 JDBC,使用 MyBatis 更为便捷、高效和方便
ORM是什么
- 对象关系映射,将数据库的对象和java的对象实现了映射。
Mybatis和Hibernate的区别?
- Hibernate的开发难度大于MyBatis
- Hibernate是全自动的orm
- 日志系统完善性的区别。Hibernate日志系统非常健全,涉及广泛,而Mybatis则除了基本记录功能外,功能薄弱很多
- Hibernate的sql灵活度不如mybaties
MyBatis框架的优缺点及其适用的场合
- 简易轻便,易于学习。对比jdbc减少了开发要用的代码量
- 可以实现动态sql,储存在xml文件中可以减少代码耦合
缺点: - 编写代码复杂
- 依赖于数据库,不能随便更改数据库
Mybatis的工作原理
- 从全局配置文件中加载config.xml建立简介。
- 加载编写xml的配置映射文件
- 建立会话工厂和会话对象SqlSession。对象中有各种sql语句的执行方法(工厂是根据需求生产东西的代表)
- Executor执行器,底层定义了Exector接口连接数据库,用于生产动态sql语句,同时负责查询缓存维护
- mappstatement对象,对映射数据的封装,储存用于映射的id参数等信息。
- 将复杂的参数进行映射,如pojo和list这种obejct对象
- 输出结果对象,将内容转为pojo等
Mybatis都有哪些Executor执行器?它们之间的区别是什么
MyBatis中接口绑定有几种实现方式
- 通过注解绑定:在接口的方法上面加上 @Select@Update等注解里面包含Sql语句来绑定(SQL语句比较简单的时候,推荐注解绑定)
- 通过xml里面写SQL来绑定, 指定xml映射文件里面的namespace必须为接口的全路径名(SQL语句比较复杂的时候,推荐xml绑定)
Mybatis 是如何进行分页的
Mybatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而非物理分页,先把数据都查出来,然后再做分页。可以在 sql 内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页
分页插件的基本原理是什么
- 分页插件的基本原理是使用 Mybatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的 sql,然后重写 sql(SQL 拼接 limit),根据 dialect 方言,添加对应的物理分页语句和物理分页参数,用到了技术 JDK 动态代理,用到了责任链设计模式。
简述Mybatis的插件运行原理
Mybatis仅可以编写针对 ParameterHandler、ResultSetHandler、StatementHandler、Executor这4种接口的插件,Mybatis使用JDK的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法,当然,只会拦截那些你指定需要拦截的方法
如何编写一个插件
编写插件:实现 Mybatis 的 Interceptor 接口并复写 intercept()方法,然后再给插件编写注解,指定要拦截哪一个接口的哪些方法即可,最后在配置文件中配置你编写的插件。
Mybatis 是否支持延迟加载
支持。
延迟加载的基本原理是什么
只有去访问一个值的时候,才会去调用sql查询
#{}和${}的区别是什么
Mybatis的预编译
1.什么是预编译
2.预编译的作用
提高性能(不需要重新编译)
防止sql注入,防止输入的值和原本的sql语句造成混乱
一级缓存和二级缓存
目的:避免频繁操作数据库,设置缓存来处理。
二级缓存默认不开启,且还回的pojo是要可序列化的,需要实现seralizable接口