mybatis常见问题


mybatis常见问题

MyBatis 编程步骤

  1. 创建SqlSessionFactoy对象
  2. 通过SqlSessionFactory获取SqlSession对象
  3. 通过SqlSession获取Mapper接口的代理对象
  4. 通过Mapper代理对象执行数据库操作
  5. 执行成功提交事务,失败则回滚
  6. 最后返回连接

#{}${} 的区别是什么?

  1. **#{}**属性替换
  2. **${}**参数占位符,采用的是预编译的方式

当实体类中的属性名和表中的字段名不一样 ,怎么办?

  1. aslias 别名
  2. 来设定字段对应实体的属性值
  3. 默认驼峰风格

XML 映射文件中,除了常见的 select | insert | update | delete标 签之外,还有哪些标签?

  1. 可被引用
  2. 作为二级缓存的引入标签

Mybatis 动态 SQL 是做什么的?都有哪些动态 SQL ?能简述一下动态 SQL 的执行原理吗?

动态sql指的是在xml中用xml标签编写动态sql

最佳实践中,通常一个 XML 映射文件,都会写一个 Mapper 接口与之对应。请问,这个 Mapper 接口的工作原理是什么?Mapper 接口里的方法,参数不同时,方法能重载吗?

Mapper接口的实现类是mybatis使用JDK Proxy自动生成的代理对象,代理对象会拦截接口方法。然后通过statement接口去执行具体的sql。
不能,如果重载会出现两种情况,自定义mybatis加载方式会始终执行第一个sql。使用SqlSessionFactory初始化会在启动时抛出异常

Mapper接口绑定有几种实现方式,分别是怎么实现的?

三种;1.xml绑定 2.在mappper接口中使用注解的形式 3.注解的方式并且通过javaConfig的形式

Mybatis 的 XML Mapper文件中,不同的 XML 映射文件,id 是否可以重复?

可以,但是不建议,因为是namespace + id的形式作为 Map<String, MappedStatement> 的 key 使用的

如何获取自动生成的(主)键值?

  1. useGeneratedKeys + keyProperty 属性
  2. 的方式

Mybatis 执行批量插入,能返回数据库主键列表吗?

在 Mapper 中如何传递多个参数?

  1. 用对象传参
  2. 用map穿参
  3. 用**@Param**

Mybatis 是否可以映射 Enum 枚举类?

可,使用TypeHandler

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

  1. SimpleExecutor每次执行一次update或者select操作,就创建一个statement对象,用完就关闭
  2. ReuseExecutor通过Map<String,Statement>进行缓存的对象
  3. BatchExecutor
  4. cacheExecutor

MyBatis 如何执行批量插入?

  1. 使用batch进行插入
SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH,false);
Mapper mapper = session.getMapper(Mapper.class);
forEach(){
    mapper.insert(itemDO);
}
session.commit();
session.clearCache();
  1. 使用标签进行拼接的方式

尽量使用batch的方式

介绍 MyBatis 的一级缓存和二级缓存的概念和实现原理?

一级缓存是在session范围内的
二级缓存是在application中的
二级缓存的局限性较大,功能上和缓存中间件有部分冲突,适用于小型单体项目。

Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么?

不会

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

  1. 一种是单独发送一个 SQL 去查询关联对象,赋给主对象,然后返回主对象
  2. 另一种是使用嵌套查询,嵌套查询的含义为使用 join 查询,一部分列是 A 对象的属性值,另外一部分列是关联对象 B 的属性值

简述 Mybatis 的插件运行原理?以及如何编写一个插件?

使用mybatis进行更新的流程是上面?

  1. 查询cacheExecutor判断二级缓存中是否有缓存存在缓存进行刷新
  2. 调用BaseExecutor方法执行update语句(模板方法:在BaseExecutor中先清空一级缓存,再调用具体的执行对象)
  3. 具体的执行对象创建configuration对象,通过configuration对象创建statementHandler对象返回执行器
  4. 执行器使用statement对象进行参数赋值

Mybatis 是如何进行分页的?分页插件的原理是什么?

PageHelper
通过statement中解析sql并进行拦截,从而实现分页

MyBatis 与 Hibernate 有哪些不同?

Hibernate是面向对象的ORM框架不鼓励你去写定制化的sql,而是面向数据库对象去进行CRUD的操作

JDBC 编程有哪些不足之处,MyBatis是如何解决这些问题的?

sql在代码中不易维护

Mybatis 比 IBatis 比较大的几个改进是什么?

不会

Mybatis 映射文件中,如果 A 标签通过 include 引用了B标签的内容,请问,B 标签能否定义在 A 标签的后面,还是说必须定义在A标签的前面?

不会

简述 Mybatis 的 XML 映射文件和 Mybatis 内部数据结构之间的映射关系?

xml文件会解析到configuation对象中


  TOC