1. #{}和${}的区别

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

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

    • Mybatis在处理${}时,就是把${}替换成变量的值。使用#{}可以有效的防止SQL注入,提高系统安全性。

  2. 当实体类中的属性名和表中的字段名不一样,如果将查询的结果封装到指定pojo

    • 通过在查询的sql语句中定义字段名的别名

    • 通过<resultMap>来映射字段名和实体类属性名的一一对应的关系.

  3. 模糊查询like语句该怎么写

    • 在java中拼接通配符,通过#{}赋值

    • 在Sql语句中拼接通配符 (不安全 会引起Sql注入)

  4. 通常一个Xml映射文件,都会写一个Dao接口与之对应, Dao的工作原理,是否可以重载

    • 不能重载,因为通过Dao寻找Xml对应的sql的时候全限名+方法名的保存和寻找策略。

    • 接口工作原理为jdk动态代理原理,运行时会为dao生成proxy,代理对象会拦截接口方法,去执行对应的sql返回数据

  5. Mybatis是如何进行分页的,分页插件实现的原理

    • Mybatis使用RowBounds对象进行分页,也可以直接编写sql实现分页,也可以使用Mybatis的分页插件

    • 分页插件的原理:实现Mybatis提供的接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql。

  6. Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签

    • <resultMap>、<parameterMap>、<sql>、<include>、<selectKey>加上动态sql的标签,比如where|set|foreach|if|choose|when|otherwise

    • <sql>为sql片段,<include>引入sql片段

  7. Mybatis动态sql是做什么的?都有哪些动态sql?简述一下动态sql的执行原理

    • Mybatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能,Mybatis提供了9种动态sql标签trim|where|set|foreach|if|choose|when|otherwise|bind。

    • 使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能。

  8. Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式

    • 第一种是使用标签,逐一定义列名和对象属性名之间的映射关系。第二种是使用sql列的别名功能,将列别名书写为对象属性名

    • 有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

  9. Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别

    • Mybatis不仅可以执行一对一、一对多的关联查询,还可以执行多对一,多对多的关联查询,多对一查询,其实就是一对一查询,只需要把selectOne()修改为selectList()即可;多对多查询,其实就是一对多查询,只需要把selectOne()修改为selectList()即可。

    • 一种是单独发送一个sql去查询关联对象,赋给主对象,然后返回主对象。另一种是使用嵌套查询,嵌套查询的含义为使用join查询,一部分列是A对象的属性值,另外一部分列是关联对象B的属性值,好处是只发一个sql查询,就可以把主对象和其关联对象查出来。其去重复的原理是标签内的子标签,指定了唯一确定一条记录的id列,

  10. Mybatis是否支持延迟加载

    • Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。
  11. Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复

    • 不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复;毕竟namespace不是必须的,只是最佳实践而已。原因就是namespace+id是作为Map<String, MappedStatement>的key使用的,如果没有namespace,就剩下id,那么,id重复会导致数据互相覆盖。有了namespace,自然id就可以重复,namespace不同,namespace+id自然也就不同。
  12. 如何进行批处理

    • 使用BatchExecutor完成批处理。
  13. Mybatis都有哪些Executor执行器?它们之间的区别是什么

    • Mybatis有三种基本的Executor执行器,SimpleExecutor、ReuseExecutor、BatchExecutor。

    • SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。

    • ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map<String, Statement>内,供下一次使用。简言之,就是重复使用Statement对象。

    • 批处理

  14. Mybatis中如何指定使用哪一种Executor执行器

    • 在Mybatis配置文件中,可以指定默认的ExecutorType执行器类型,也可以手动给DefaultSqlSessionFactory的创建SqlSession的方法传递ExecutorType类型参数。
  15. Mybatis映射文件中,如果A标签通过include引用了B标签的内容,位置问题

    • 被引用的B标签依然可以定义在任何地方,Mybatis都可以正确识别。在访问A标签时会标记B标签,然后等全部标签解析完毕会再一次重新解析标记的标签
  16. 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里

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

    • 配置文件设置usegeneratedkeys 为true
  18. 在mapper中如何传递多个参数

    • 直接在方法中传递参数,xml文件用#{0} #{1}来获取

    • 使用 @param 注解:这样可以直接在xml文件中通过#{name}来获取

  19. Mybatis对象关联实例

    • 在单表查询中,属性名和数据库相同的字段可以省略,多表不可省略,省略则为空

      // 一对一
      <resultMap type="Orders" id="orders">
      <result column="id" property="id"/> <association property="user" javaType="User">
      //关联另一张表
      <id column="id" property="id"/> // id
      <result column="name" property="name"></result> // 属性 即查询出来显示的名字
      </association>
      </resultMap> <select id="onemany" resultMap="orders">
      select u.id ,o.number,o.dic,u.name from orders o left JOIN user u on o.user_id=u.id
      </select>
      // 一对多
      <resultMap type="User" id="user">
      <id column="id" property="id"/>
      <result column="name" property="name"/>
      <!-- 一对多 -->
      <collection property="list2" ofType="Orders"> // ofType : 每个属性的类型
      <id column="oid" property="id"/> //需要设置id,如果两个对象属性相同,则会视为一条记录
      <result column="number" property="number"/>
      </collection>
      </resultMap>
      <select id="selectUserList" resultMap="user">
      select u.id,o.id as oid,o.number,o.dic,u.name from user u left JOIN orders o on o.user_id=u.id
      </select>
  20. resultType resultMap的区别

    • 类的名字和数据库相同时,可以直接设置resultType参数为Pojo类

    • 若不同,需要设置resultMap 将结果名字和Pojo名字进行转换,

  21. Map 直接#{key}就可以取得对应的值

Mybatis面试整理的更多相关文章

  1. 就目前市面上的面试整理来说,最全的BAT大厂面试题整理在这

    原标题:就目前市面上的面试整理来说,最全的BAT大厂面试题整理在这 又到了面试求职高峰期,最近有很多网友都在求大厂面试题.正好我之前电脑里面有这方面的整理,于是就发上来分享给大家. 这些题目是网友去百 ...

  2. MyBatis 面试复习整理

    MyBatis MyBatis 是一款优秀的ORM(对象关系映射)框架,可以通过对象和数据库之间的映射,将程序中的对象自动存储到数据库中.它内部封装了 JDBC ,使开发者只需要关注 SQL语句本身, ...

  3. java面试整理

    IO和NIO的区别 这是一个很常见的问题,如果单纯的只回答IO和NIO的区别,只能算及格.我个人觉得应该从以下几个方面回答: 1).IO简介, 2).TCP的三次握手,因为这也是两者的区别之一, 3) ...

  4. 面试整理之DOM事件阶段

    因为快面试了,打开<JavaScript高级程序设计>,对DOM事件进行整理了下 本文主要解决的问题: 事件流 DOM事件流的三个阶段 先理解流的概念 在现今的JavaScript中随处可 ...

  5. MYBATIS 简单整理与回顾

    这两天简单整理了一下MyBatis 相关api和jar包这里提供一个下载地址,免得找了 链接:http://pan.baidu.com/s/1jIl1KaE 密码:d2yl A.简单搭建跑项目 2.进 ...

  6. Mybatis面试集合(转)

    Mybatis技术内幕系列博客,从原理和源码角度,介绍了其内部实现细节,无论是写的好与不好,我确实是用心写了,由于并不是介绍如何使用Mybatis的文章,所以,一些参数使用细节略掉了,我们的目标是介绍 ...

  7. java面试整理(会持续更新..)

    本人出道至今,经历了大大小小百余场战斗,,,下面整理的面试题有些有答案,有些没答案,那个谁说过:"要抱着怀疑的态度去编程,所以,即便有答案,也不一定正确,即便我本地正确,但是由于屏幕前的你和 ...

  8. 面试整理(1):原生ajax

    接到电话面试,有一些送分题答的不好,在这里整理一下 问题:原生ajax的工作流程是怎么样的? 老用封装好的工具,原生的ajax其实并不熟悉,今天复习一下.主要参考http://www.w3school ...

  9. mybatis 一点整理

    mapper指定对应的接口 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper ...

随机推荐

  1. C# 7.0 新特性:本地方法

    C# 7.0:本地方法 VS 2017 的 C# 7.0 中引入了本地方法,本地方法是一种语法糖,允许我们在方法内定义本地方法.更加类似于函数式语言,但是,本质上还是基于面向对象实现的. 1. 本地方 ...

  2. java远程备份mysql数据库关键问题(限windows环境,亲测解决)

    其它环境同理也可解决. 条件:为了使用mysql命令,本机要安装mysql ,我本机安装的是mysql 5.5. 错误1:使用命令 mysqldump -h192.168.1.50 -u root - ...

  3. Lucene介绍与入门使用

    Lucene简介 Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整 ...

  4. IDL 数组相关函数

    1.信息获取 Size()函数能够获取数组的相关信息.不设置关键字是,函数返回变量的基本信息:第一个返回值是变量的维数N_dims,但当变量是敞亮或未定义是返回值为0:第二个 到第N_dims+1个返 ...

  5. Windows系统下八大具有高逼格的DOS命令之一【ping】

    ping命令: ping是用来检测网络是否通畅或者查询网络连接速度的一个基础命令.作为一名对计算机痴迷的爱好者来说,ping命令是需要第一个掌握的DOS命令.它所利用的原理是这样的:网络上的机器都有唯 ...

  6. PHP Server Nginx 安装

    1. PHP 安装: http://jingyan.baidu.com/article/b2c186c8f16d05c46ef6ff3c.html PHP 问题: http://www.cnblogs ...

  7. 用FastDFS一步步搭建文件管理系统

    一.FastDFS介绍 FastDFS开源地址:https://github.com/happyfish100 参考:分布式文件系统FastDFS设计原理 参考:FastDFS分布式文件系统 个人封装 ...

  8. 理解HTTPS

    总结HTTPS HTTPS要使客户端与服务器端的通信过程得到安全保证,必须使用的对称加密算法,但是协商对称加密算法的过程,需要使用非对称加密算法来保证安全,然而直接使用非对称加密的过程本身也不安全, ...

  9. win10 uwp 异步进度条

    本文主要讲我设计的几个进度条,还有如何使用异步控制进度条,如何使用动画做进度. 进度条可以参见:http://edi.wang/post/2016/2/25/windows-10-uwp-modal- ...

  10. 字符串解码DecodeString

    字符串解码 原创博客,转载请注明出处!eg:ss=2[abc]3[cd]ef   return:abcabccdcdcdefss=3[a2[c]]2[a]    return:accaccaccaas ...