美文网首页
2019年Java面试题(十七) Mybatis 2019-04

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

作者: 码记 | 来源:发表于2019-04-27 13:53 被阅读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语句 

    相关文章

      网友评论

          本文标题:2019年Java面试题(十七) Mybatis 2019-04

          本文链接:https://www.haomeiwen.com/subject/hrqknqtx.html