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

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语句 

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,422评论 0 4
  • Mybatis相关 1.Mybatis是什么? 2.为什么选择Mybatis? 3、#{}和${}的区别是什么? ...
    zhihaoZzz阅读 1,274评论 0 2
  • Mybatis相关 1.Mybatis是什么? 2.为什么选择Mybatis? 3、#{}和${}的区别是什么? ...
    梦殇_fccd阅读 974评论 0 5
  • 1.JVM 堆内存和非堆内存 堆和非堆内存按照官方的说法:“Java 虚拟机具有一个堆(Heap),堆是运行时数据...
    yanzhu728阅读 899评论 0 0
  • 1.StringBuffer与String的区别 StringBuffer是线程安全的,每次操作字符串,Strin...
    zdd5457阅读 986评论 0 5