Mybatis

/ JAVA面试 / 没有评论 / 514浏览

mybatis是一个半Orm(对象关系映射)框架,它内部封装了JDBC,加载驱动,创建链接,创建statement等繁杂的过程。

一、mybatis的执行流程

  1. 读取MyBatis配置文件:mybatis-config.xml加载运行环境和映射文件

  2. 构造会话工厂SqlSessionFactory

  3. 会话工厂创建SqlSession对象(包含了执行SQL语句的所有方法)

  4. 操作数据库的接口,Executor执行器,同时负责查询缓存的维护

  5. Executor接口的执行方法中有一个MappedStatement类型的参数,封装了映射信息

  6. 输入参数映射

  7. 输出结果映射

    1、 创建SqlSessionFactory 2、 通过SqlSessionFactory创建SqlSession 3、 通过sqlsession执行数据库操作 4、 调用session.commit()提交事务 5、 调用session.close()关闭会话

SqlSessionFactory 是单例的 由 SqlSessionFactoryBuilder 构建;sqlsession 是会话

二、mybatis时怎么绑定xml

三、mybatis的拦截器

四、mybatis的优化

五、mybatis的缓存

一级缓存是基于PerpetualCache的hashmap本地缓存,其存储作用域为Session,当Session flush后,默认打开一级缓存!
二级缓存和一级缓存的机制是相同的,默认也是采用PerpetualCache的hashmap本地缓存,不过他的储存作用于在Mapper,而且可自定义存储源,要开启二级缓存,需要使用二级缓存属性类实现Serializable序列化的接口,可在它的映射文件中配置<cache/>

缓存数据的更新机制,当某一个作用域(一级缓存session/二级缓存namespace)的进行了c/u/d操作后,默认该作用域下所有select中的缓存将被clear



一级缓存:基于 PerpetualCache 的 hashmap 本地缓存,其存储作用域为 Session,当 Session 进行 flush 或者 close 之后,该 Session 中的所有的 Cache 就将清空,默认打开一级缓存
二级缓存:基于 namespaces 和 mapper 的作用域起作用的,不是依赖于 SQL Session,默认也是采用 PerpetualCache ,hashmap 存储,但是需要单独开启,一个是核心配置,一个是 mapper 文件

二级缓存什么时候会清空缓存中的数据:
    当某一个作用域(一级缓存 Session /二级缓存 namespaces )的进行了新增、修改、删除操作后,默认该作用域下所有 select 中的缓存将被 clear

六、延迟加载

延迟加载的意思是:就是在需要用到数据时才进行加载,不需要用到数据时就不进行加载数据。 Mybatis支持一对一关联对象和一对多关联集合对象的延迟加载 在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=truelfalse,默认是关闭的

底层原理:
     1.使用CGLIB创建目标对象的代理对象
     2.当调用目标方法时,进入拦截器invoke方法,发现目标方法是null值,执行sql查询
     3.获取数据以后,调用set方法设置属性值,再继续查询目标方法,就有值了

其他问题

1.${}是字符串替换,#{}是预处理;
		Mybatis在处理${}时,就是把${}直接替换成变量的值。而Mybatis在处理#{}时,会对sql语句进行预处理,将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
2.Mybatis是如何进行分页的?分页插件的原理是什么?	
3.说一下Mybaits的优缺点和使用场合
	优点:基于SQL语句编译,相当灵活,与JDBC相比,减少了50%的代码,很好的与各种数据库兼容,能够与Spring很好的集成,提供映射标签,支持对象关系组件维护!
	缺点:SQL语句的编写工作量较大,尤其字段多,关联表多时,对开发人员编写SQL语句的功底有一定要求!
SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库!
适用场合:MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案,对性能要求很高,或者需求变化较多的项目,如互联网项目!