Mybatis面试整理

  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执行结果封装为目标对象并返回的?都有哪些映射形式

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

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

  • Mybatis不仅可以执行一对一、一对多的关联查询,还可以执行多对一,多对多的关联查询,多对一查询,其实就是一对一查询,只需要把selectOne()修改为selectList()即可;多对多查询,其实就是一对多查询,只需要把selectOne()修改为selectList()即可。
  • 一种是单独发送一个sql去查询关联对象,赋给主对象,然后返回主对象。另一种是使用嵌套查询,嵌套查询的含义为使用join查询,一部分列是A对象的属性值,另外一部分列是关联对象B的属性值,好处是只发一个sql查询,就可以把主对象和其关联对象查出来。其去重复的原理是

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

12. 如何进行批处理

  • 使用BatchExecutor完成批处理。

13. Mybatis都有哪些Executor执行器?它们之间的区别是什么

  • Mybatis有三种基本的Executor执行器,SimpleExecutor、ReuseExecutor、BatchExecutor。
  • SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。
  • ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map
  • 批处理

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}就可以取得对应的值

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java技术分享

第五章:Shiro的授权(Authorization)——深入浅出学Shiro细粒度权限开发框架

  授权,又称作为访问控制,是对资源的访问管理的过程。换句话说,控制谁有权限在应用程序中做什么。

1976
来自专栏xingoo, 一个梦想做发明家的程序员

Winsock协议目录

SPI提供3种协议: 1 分层协议     在基础协议的上层,依靠底层基础协议实现更高级的通信服务。 2 基础协议     能够独立安全地,和远程断电实现数...

2166
来自专栏Java后端技术

SpringMVC后台接收list类型的数据的实现方式

  最近在做一些东西的时候,遇到一个需要Springmvc后台接收list类型数据的需求,几经辗转才完美解决了这个问题,今天记下来方便以后使用,也分享给需要的小...

522
来自专栏木木玲

浅谈 Linux下的零拷贝机制

2488
来自专栏Java技术分享

第五章:Shiro的授权(Authorization)——深入浅出学Shiro细粒度权限开发框架

Authorization概述 概述   授权,又称作为访问控制,是对资源的访问管理的过程。换句话说,控制谁有权限在应用程序中做什么。   授权检查的例子是:...

1868
来自专栏Java帮帮-微信公众号-技术文章全总结

Java面试系列23-spring(2)-配置数据库驱动、依赖、Mapping等

Java面试系列23-spring(2)-配置数据库驱动、依赖、Mapping等 6.如何在spring的applicationContext.xml使用JND...

3236
来自专栏不止是前端

从实现一个Promise说起

尽管工作中用了无数次Promise async await,但是在写下这篇文章之前,却不知道Promise背后发生了些什么,我一直以为的逻辑是先等待Promis...

1374
来自专栏技术分享

redis 简单使用总结

最近一段时间与redis接触比较频繁。发现有些东西还是工作中经常会用到的,自己也花了点时间巩固下。本篇文章主要是以总结性的方式梳理,因为redis的主题很大,任...

2269
来自专栏技术小讲堂

在ASP.NET MVC中使用Unity进行依赖注入的三种方式第一种方法第二种方法第三种方法

     在ASP.NET MVC4中,为了在解开Controller和Model的耦合,我们通常需要在Controller激活系统中引入IoC,用于处理用户请...

2715
来自专栏GopherCoder

Python: 实际项目中抽象出的小项目设计Python: 一周笔记

1483

扫码关注云+社区