mybatis面试题总结

  1. 什么是框架 ?
    可以理解为帮助我们实现了一部分功能,作用:减少代码量,提高开发效率

  2. 为什么要使用框架 ?
    每个优秀的框架都是对底层的代码做了轻量级的封装,目的是减少代码量,提高开发效率.

  3. 介绍 Mybatis框架 ?
    MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,应为它的社区活跃所以它的bug比较少

  4. 从三层架构的方面介绍主流框架 ?

SSH: Struts2 + spring + hibernate
SSM: Springmvc + spring + mybatis

JAVAEE三层结构:
Web层: struts2框架、Springmvc
Service层(业务逻辑层): spring框架
持久化层(dao): hibernate、mybatis框架

  1. mybatis 框架原理图的介绍 ?

    创建全局配置文件 创建 mapper.xml
    创建seqSessionFactory 得到sqlSession
    执行器 是一个面向底层的接口
    输入映射 输出映射

  2. Mybatis执行过程 ?
    1、 配置SqlMapConfig.xml、配置mapper.xml(配置了sql语句)
    2、 创建SqlSessionFactory,目的是要得到Sqlsession
    Mybatis提供SqlSessionFactoryBuiler类创建会话工厂

3、通过SqlSessionFactory创建Sqlsession,可以使用Sqlsession操作数据库
Sqlsession底层使用Executor执行器操作数据库,Executor要运行还需要上边在xml中配置的信息,mybatis自动将上边xml中配置信息加载到底层封装对象Mapped statement中,Executor按照Mapped statement中的配置信息执行操作数据库

4、要知道Executor按照Mapped statement中的配置信息执行过程

首先需要将java对象信息映射到sql语句中,相当输入映射。
然后将sql结果信息映射到java对象 , 输出映射。

  1. SqlSession 是接口吗 ?
    是面向用户的接口

  2. 面向用户接口 ? 面向底层接口 ?
    面向用户接口:平时自己定义的接口,别人拿过来直接用你的接口里面的方法和成员变量
    向底层接口:用户看不到的底层源码

  3. 返回自增主键的方式 ?
    在语句中添加 useGeneratedKeys=“true” keyProperty=“id”

  4. mybatis与hibernate的不同 ? 企业如何选型 ?

    hibernate:是一个标准的ORM框架(对象关系映射)。入门门槛较高,不需要写sql,sql语句自动生成,对sql语句进行优化、修改比较困难。
    应用场景:适用需求变化不多的中小型项目,比如:后台管理系统

    mybatis:专注sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全的ORM框架,虽然程序员自己写sql,mybatis也可以实现映射(输入映射,输出映射)
    应用场景:适用需求变化较多的项目,比如:互联网项目。

    企业进行技术选型,以低成本高回报作为技术选型的原则,根据项目的技术力量进行选型。

  5. mapper接口开发的规范 ?
    mapper开发遵循四个原则
    接口中的方法名 == mapper.xml 中 id 名
    返回值类型 与 Mapper.xml文件中出参类型要一致
    方法中传入参数的类型 与Mapper.xml中入参的类型要一致
    命名空间必须绑定mapper接口(将mapper接口和mapper.xml绑定)

  6. Namespace的作用是什么 ?
    与接口中的类路径进行绑定

  7. mybatis-config.xml 全局配置文件中有哪些标签 ?

properties(属性)
settings(全局配置参数)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器)

  1. 怎样引入外部的properties文件 ?

  2. 驼峰式命名法在哪个标签中开启 ?


  3. 如何批量起别名 ?


  4. 扫描mapper.xml有几 种方式 ? 分别是什么 ?
    4种
    nema class page url

  5. 如何批量扫描mapper.xml ? 有什么限制 ?
    必须在同一个包下 接口名必须与mapper.xml的文件名一致

  6. 输入映射中#{} 和${} 的区别 ?

  7. mybatis传递参数是底层是以什么方式传递的 ?
    map 键值对

  8. mybatis传递多个参数时在mapper.xml中获取时,如何获取 ?
    @Param(“给与指定的名称”)

  9. 如何明确指定封装参数时的数据 ?

  10. 输出映射中的自动映射有什么规则 ?
    javabean 的属性名必须与数据库的列名一致

  11. 输出映射中的自定义映射是什么 ?
    resultMap

  12. 一对一映射是什么 ? 如何实现 ? 都有哪些关键的属性 ?

  13. 一对一映射分步查询如何使用 ? 都有哪些关键的属性 ?

  14. 分步查询中资源浪费问题如何解决 ?
    开启懒加载

  15. 如何开启懒加载 ? (两个选项在哪个文件中找 ?)
    在mybatis的使用说明书里settings属性里找

  16. 一对多映射是什么 ? 如何实现 ? 都有哪些关键的属性 ?

  17. 一对多映射分步查询如何使用 ? 都有哪些关键的属性 ?

  18. 一对多映射分步查询中如何灵活开启和关闭懒加载 ?
    在connetion标签里添加个属性 fetchtype=“lazy”懒加载(eager 积极加载)

  19. 多对多映射是什么 ? 如何实现 ?
    在一个StudentjavaBean里分装个list<另一个Teacher>
    在一个TeacherjavaBean里分装个list<另一个Student>

  20. 什么是动态sql ? 什么是静态sql ?
    静态 SQL:静态 SQL 语句一般用于嵌入式 SQL 应用中,在程序运行前,SQL 语句必须是确定的,例如 SQL 语句中涉及的列名和表名必须是存在的 , 唯一变化的只要参数 .
    动态 SQL:动态 SQL 语句是在应用程序运行时被编译和执行的,例如, 原生的jdbc模糊查询中使用的sql拼接时判断参数问题 , 这时参数是不固定的 , sql也是变化的 .

  21. 动态sql的种类有哪些 ?
    If choose Set Foreach

  22. 动态sql中的If语句如何使用 ? 有哪些关键的属性 ?
    if test=“条件”

  23. 动态sql中的choose语句相当于java中的哪个语句 ?
    带break 的switch语句

  24. 动态sql中的choose语句如何使用 ? 有哪些关键的属性 ?
    choose (when, otherwise):分支选择;带了break的swtich-case
    如果带了id就用id查,如果带了eName就用eName查;
    只会进入其中一个when标签,如果都不满足将进入otherwise标签

    	<choose>
    		<when test="id!=null and id!=''">
    			id=#{id}
    		</when>
    		<when test="eName!=null and eName!=''">
    			e_name like #{eName}
    		</when>
    		<when test="sal!=null and sal!=''">
    			sal=#{sal}
    		</when>
    		<otherwise>
    			1=1
    		</otherwise>
    
  25. 动态sql中的set标签如何使用 ? 可以解决什么问题 ?
    在修改时使用 可以解决,的问题

  26. 动态sql中的trim 如何使用 ? 有哪些关键的属性 ? 可以解决什么问题 ?
    prefix="":前缀:trim标签体中是整个字符串拼串后的结果。
    prefix给拼串后的整个字符串加一个前缀
    prefixOverrides="":
    前缀覆盖: 去掉整个字符串前面多余的字符
    suffix="":后缀
    suffix给拼串后的整个字符串加一个后缀
    suffixOverrides=""
    后缀覆盖:去掉整个字符串后面多余的字符

  27. 动态sql中的foreach语句如何使用 ? 有哪些关键的属性 ?

    item:将当前遍历出的元素赋值给指定的变量

    	separator:每个元素之间的分隔符
    	
    	open:遍历出所有结果拼接一个开始的字符
    	
    	close:遍历出所有结果拼接一个结束的字符
    	
    	index:索引。遍历list的时候是index就是索引,item就是当前值
    			    遍历map的时候index表示的就是map的key,item就是map的值
    	
    	#{变量名}就能取出变量的值也就是当前遍历出的元素
    
  28. Sql片段是什么 ? 如何使用 ?
    抽取公共的sql语句片段

  29. 获取sql片段中的内容使用哪个标签 ?
    incude0

  30. 缓存是什么 ?
    缓存就是数据交换的缓冲区(称作Cache),是临时存储的区域;

  31. mybatis一级缓存是哪个范围的缓存 ?
    1024sql语句

  32. 一级缓存失效的条件有哪些 ?
    1、sqlSession不同。
    2、sqlSession相同,查询条件不同.(当前一级缓存中还没有这个数据)
    3、sqlSession相同,两次查询之间执行了增删改操作(这次增删改可能对当前数据有影响)
    4、sqlSession相同,手动清除了一级缓存
    session.clearCache();(缓存清空)

  33. mybatis二级缓存是哪个范围的缓存 ?
    1024个sql语句

  34. 如何使用二级缓存 ?
    1、开启全局二级缓存配置:

    2、去mapper.xml中配置使用二级缓存:(如果不使用第三方)
    	<cache/>
    		下面的参数为可选参数:
    		<!-- <cache eviction=" LRU " flushInterval="60000" readOnly="false" size="1024"></cache> -->
    3、POJO需要实现序列化接口
    
  35. 在全局配置中 cacheEnabled=false 关闭的是哪个缓存 ?
    二级缓存

  36. 在mapper.xml 中,每个增删改标签的:flushCache=“true” 是什么意思 ?
    增删改执行完成后就会清除缓存 一二级都会清除

  37. 在mapper.xml 中,每个查询标签的:flushCache=“true” 是什么意思 ?
    次查询之后都会清空缓存;缓存是没有被使用的;

  38. 使用SqlSession中的clearCache()方法,清除的是哪个缓存 ?
    清除一级缓存

  39. 查询操作时,在缓存中查找的顺序 ?
    二级缓存 ? 一级缓存 ? 数据库

  40. 你知道的第三方缓存有哪些 ?
    在开发中使用第三方的缓存种类很多 , 常见的第三方缓存有 :
    Redis (分布式缓存数据库)
    Memcached (分布式缓存服务器)

  41. 简单介绍你是如何使用第三方缓存的 ?
    1导入第三方缓存ehcache 的jar包;(在资料中)
    2)、导入mybatis和ehcache的整合jar包;(在资料中)
    3)、创建ehcache.xml文件 ; (在资料中)
    4)、在mapper.xml中引用自定义缓存

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Angzush

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值