1.Mybatis介绍
官网地址: https://mybatis.org/mybatis-3/zh/index.html
- MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。
- MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
- MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
- MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。
2.Mybatis特点
- 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。
- sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
- 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射
- 提供对象关系映射标签,支持对象关系组建维护
- 提供xml标签,支持编写动态sql。
3.Mybatis编程步骤
1.编辑mybatis-config.xml核心配置文件,执行数据源配置
2.编辑POJO实体对象.要求与数据库表中的字段一一对应
3.编辑Mapper接口. 添加接口方法
4.编辑接口的实现类(配置文件方式) 要求namespace id resultType
5.mybatis加载指定的mapper映射文件
6.创建SqlSessionFactory工厂对象
7.获取SqlSession,开启数据库链接
8.获取接口对象(代理对象)
9.调用接口方法,获取返回值结果
10.关闭sqlSession链接
4.面试题
1). 在 mybatis 中,${} 和 #{} 的区别是什么?
- #{} 是占位符,预编译处理,${}是字符串替换。
- Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set方法来赋值;使用#{}可以有效的防止 SQL 注入,提高系统安全性。
- Mybatis 在处理${}时,就是把${}替换成变量的值。
2).在 mybatis 中,resultType 和 ResultMap 的区别是什么?
- 如果数据库结果集中的列名和要封装实体的属性名完全一致的话用 resultType 属性
- 如果数据库结果集中的列名和要封装实体的属性名有不一致的情况用 resultMap 属性,通过 resultMap 手动建立对象关系映射,resultMap 要配置一下表和类的一一对应关系,所以说就算你的字段名和你的实体类的属性名不一样也没关系,都会给你映射出来
3).在Mybatis 中动态 SQL 的标签有哪些?作用分别是什么?
1. <if>if 是为了判断传入的值是否符合某种规则,比如是否不为空.
2. <where> where 标签可以用来做动态拼接查询条件,当和 if 标签配合的时候,不
用显示的声明类型 where 1 = 1 这种无用的条件
3. <foreach> foreach 标签可以把传入的集合对象进行遍历,然后把每一项的内容
作为参数传到 sql 语句中.
4. <include> include 可以把大量的重复代码整理起来,当使用的时候直接 include
即可,减少重复代码的编写;
5. <set>适用于更新中,当匹配某个条件后,才会对该字段进行跟新操作
4).谈一下你对 mybatis 缓存机制的理解?
Mybatis 有两级缓存,一级缓存是 SqlSession 级别的,默认开启,无法关闭;二级缓
存是 Mapper 级别的,二级缓存默认是没有开启的,但是手动开启
1. 一级缓存:基础 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,
当 Session flush 或 close 之后,Session 中的所有 Cache 就将清空
2. 二级缓存其存储作用域为 Mapper(Namespace),使用二级缓存属性类需要实现
Serializable 序列化接口
3. 对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)
的进行了 C(增加)/U(更新)/D(删除)操作后,默认该作用域下所有 select中的缓存将被clear.
需要在 setting 全局参数中配置开启二级缓存,如下 conf.xml 配置:
当我们的配置文件配置了 cacheEnabled=true 时,就会开启二级缓存,二级缓存是
mapper 级别的,如果你配置了二级缓存,那么查询数据的顺序应该为:二级缓存→一级缓
存→数据库。