MyBatis框架

  1. MyBatis是什么(必会)
    (1) MyBatis是一个半ORM(对象关系映射) 框架, 它内部封装了JDBC,开发时只需要关注SQL语句本身, 不需要花费经历去处理加载驱动, 创建连接, 创建statement 等繁琐的过程, 只需要直接编写原生态 sql, 可以严格控制sql 执行性能, 灵活度更高.

(2) MyBatis 可以使用XML 或注解来配置和映射原生信息, 将POJO映射成数据库中的记录, 避免了几乎所有的JDBC代码和手动设置参数以及获取结果集.

(3) 通过XML文件或者注解的方式将要执行的各种statement配置起来, 并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句, 最后由 MyBatis 框架执行sql并将结果映射为java对象并返回, 也就是执行 sql 到返回 result 的过程.

  1. Mybaits的优点(了解)
    (1)基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。

(2)与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;

(3)很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。

(4)能够与Spring很好的集成;

(5)提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。

3 MyBatis与Hibernate有哪些不同?(必会)
(1)Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句。

(2)Mybatis直接编写原生态SQL,可以严格控制SQL执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需求变化要求迅速输出成果。但是灵活的前提是Mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件,则需要自定义多套SQL映射文件,工作量大。

(3)Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用Hibernate开发可以节省很多代码,提高效率。

  1. #{}和KaTeX parse error: Expected 'EOF', got '#' at position 15: {}的区别是什么?(必会) #̲{}是预编译处理,{}是字符串替换。

Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;

Mybatis在处理 时,就是把 {}时,就是把 时,就是把{}替换成变量的值。

使用#{}可以有效的防止SQL注入,提高系统安全性

  1. Mybatis是如何进行分页的?分页插件的原理是什么?(必会)
    Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。可以在SQL内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的SQL,然后重写SQL,根据dialect方言,添加对应的物理分页语句和物理分页参数。

6 Mybatis动态SQL有什么用?执行原理?有哪些动态sql标签?(必会)
Mybatis动态SQL可以在Xml映射文件内,以标签的形式编写动态sql,执行原理是根据表达式的值 完成逻辑判断并动态拼接sql的功能。

Mybatis提供了9种动态sql标签:trim | where | set | foreach | if | choose | when | otherwise | bind。

  1. Xml映射文件中,除了select|insert|updae|delete标签之外,还有哪些标签?(了解)
    ....,加上动态sql的9个标签,其中为sql片段标签,通过标签引入sql片段,为不支持自增的主键生成策略标签。

8 MyBatis实现一对一有几种方式?具体怎么操作的?(必会)
有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次, 通过在resultMap里面配置association节点配置一对一的类就可以完成;

嵌套查询是先查一个表,根据这个表里面的结果的 外键id,去再另外一个表里面查询数据,也是通过association配置,但另外一个表的查询通过select属性配置。

9 Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?(必会)
Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。

它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。

10 Mybatis的一级.二级缓存(必会)
1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存且不能关闭。

2)二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。默认不打开二级缓存,要手动开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置。

3)对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。

你可能感兴趣的:(java,mybatis,oracle,数据库)