2019年Java面试题(十七) Mybatis 2019-04

2019-04-27  本文已影响0人  码记

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的过程)。

2. Mybaits的优点:

答案:

1.把Sql语句从Java中独立出来。

2.封装了底层的JDBC,API的调用,并且能够将结果集自动转换成JavaBean对象,简化了Java数据库编程的重复工作。

3.自己编写Sql语句,更加的灵活。

4.入参无需用对象封装(或者map封装),使用@Param注解

另一种答案:

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

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

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

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

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

3. MyBatis框架的缺点:

(1)SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。

(2)SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

4. MyBatis框架适用场合:

(1)MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案。

(2)对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis将是不错的选择。

5. ibatis/mybatis框架的优缺点?

    优点: 易于上手和掌握

          sql写在xml里,便于统一管理和优化

  解除sql与程序代码的耦合

  提供对象关系映射标签,支持对象关系组建维护

  提供xml标签,支持编写动态sql

缺点: 可读性低,调试非常困难,非常受限,无法像jdbc那样在代码里根据逻辑实现复杂动态sql拼接

6. ibatis核心类的作用;MyBatis核心类的作用?

    ibatis:

SqlMapClientBuilder: 加载配置文件,返回一个会话

SqlMapClient: 具体的会话

SqlSession: 对数据的增删查改

SqlMapSession: 进行数据库操作

SqlSessionManager: 创建SqlSesstion的对象

SqlMapTransactionManager: 定义事务管理功能

    Mybatis:

SqlSessionFactory 每个MyBatis应用的核心

7. mybatis/ibatis跟hibernate的比较;

Hibernate是全自动化的,只要配置映射文件,可以为我们动态的生成sql

ibatis是半自动化的,需要我们手动的编写sql,ibatis简单易学

Hibernate比较复杂,ibatis可以细粒度的优化,而Hibernate是根据映射文件进行优化

8. ibatis的工作流程或运行原理?

答案:

Mybatis工作原理:

1.通过SqlSessionFactoryBuilder从mybatis-config.xml配置文件中构建出SqlSessionFactory。

2.SqlSessionFactory开启一个SqlSession,通过SqlSession实例获得Mapper对象并且运行Mapper映射的Sql语句。

3.完成数据库的CRUD操作和事务提交,关闭SqlSession。

另一种答案:

1.在sqlMapConfig的配置文件中进行数据库连接的配置。

2.在sqlMapConfig的xml配置文件中引用sqlMap的xml配置文件。

3.在sqlMap的xml配置文件中进行SQL文件的配置。(文件名称随意,一般是javaBean的类名加xml。)

4.通过SqlMapClient生成具体的操作,用来操作sqlMap配置文件中SQL文件的IBATIS对象。

5.SqlMapClient对象提供函数,函数的参数对应替换sqlMap配置文件的id,parameter等属性,完成SQL文件的执行

9. #{}和${}的区别是什么?

答案:

${}:简单字符串替换,把${}直接替换成变量的值,不做任何转换,这种是取值以后再去编译SQL语句。

#{}:预编译处理,sql中的#{}替换成?,补全预编译语句,有效的防止Sql语句注入,这种取值是编译好SQL语句再取值。

总结:一般用#{}来进行列的代替

另一种答案:

#{}是预编译处理,${}是字符串替换。

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

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

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

10. Mybatis是如何进行分页的?分页插件的原理是什么?

答案:

RowBounds对象分页

在Sql内直接书写,带有物理分页

另一种答案:

Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

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

11. Ibatis中#与$的区别?

(1)#号它会将传进来的数据都当成一个一个字符串,会给数据加一对双引号,而$号它会将传进来的数据直接显示生成到sql中

(2)#号能够防止sql的注入,而$号无法防止sql的注入

(3)$方式一把用于传入数据库对象,比如表名

12. ibatis与mybatis比较  # $ %干什么的

    1 iBATIS3.0以后到goole公司了,更名为mybatis

    2 mybatis增加了接口绑定

    3 传值方式由##---#{}  $:解析数据库的关键字  %:模糊查询

    4 mybatis核心类SqlSessionfactory SqlSeession    ibatis sqlMapclient

    5 使用ognl表达式,体现在动态sql上

    6 配置的改变,如别名的配置,mybatis移动到了总配置文件中

13. 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?

Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。

14. Mybatis的一级、二级缓存:

1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。

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

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

15. mybatis,hibernate如何开发一对多的案例 过程以及如何配置

      o : 一方放多方的集合,多方放一方的实体

      r : 多方放一方的id

      m :

        mybatis: 查询数据

            1 使用嵌套查询或者嵌套结果

                嵌套查询: 先查询自己的数据,另外发送一条sql查询关联数据,在collection标签上使用select属性指定id,如select='xxx',

                嵌套结果: 一条sql查询自己以及关联数据,结果由mybatis自行封装,在collection标签上使用resultMap

            2 插入数据 使用动态sql

      hibernate :在set标签上使用级联与反转

              1 级联:主对象做什么,其关联对象也做同样的操作

              2 反转  将关联字段的维护权交给多方,减少update语句 

上一篇下一篇

猜你喜欢

热点阅读