1. Mybatis 的特点是什么?
- Mybatis是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,加载驱动、创建连接、创建 statement 等繁杂的过程,开发者开发时只需要关注如何编写 SQL 语句,可以严格控制 SQL 执行性能,灵活度高。
- 由于MyBatis专注于SQL本身,灵活度高,所以比较适合对性能的要求很高,或者需求变化较多的项目,如互联网项目。
2. Mybaits 的优缺点?
(1)优点:
基于SQL语句编程,相当灵活。SQL 写在 XML 里,解除 SQL 与程序代码的耦合,便于统一管理;提供 XML 标签,支持编写动态 SQ L语句,并可重用。
(2)缺点:
- SQL 语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写 SQL 语句的功底有一定要求。
- SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
3. #{} 和 ${} 的区别是什么?
${} 是字符串替换,#{} 是预处理;
Mybatis 在处理 ${} 时,就是把 ${} 直接替换成变量的值。而 Mybatis 在处理 #{} 时,会对 SQL 语句进行预处理,将 SQL中的 #{} 替换为 ? 号,调用PreparedStatement的set方法来赋值;
使用 #{} 可以有效的防止 SQL 注入,提高系统安全性。
4. Mybatis 动态 SQL 的原理?
MyBatis 动态 sql 可以让我们在 xml 映射文件内,以标签的形式编写动态 sql,完成逻辑判断和动态拼接 sql 的功能。其执行原理为,使用 OGNL 从 sql 参数对象中计算表达式的值,根据表达式的值动态拼接 sql,以此来完成动态 sql 的功能。
MyBatis 提供了 9 种动态 sql 标签:
<if><where> (trim, set)<choose> (when,otherwise)<foreach><bind>
5. Mybatis 的缓存是什么?
MyBatis 缓存分为一级缓存和二级缓存。
首先,MyBatis 的缓存目的是在多次执行相同 SQL 的情况下,访问缓存而不是直接访问数据库,提高效率的同时减少了数据库的压力。
Mybatis 默认开启一级缓存。一级缓存是 SqlSession 级别的缓存,缓存的数据只在 SqlSession 内有效。而 SqlSession 又是什么呢?对数据库增删改查等一系列操作都是在 SqlSession 中完成,可以理解为在一个线程内对数据库的一系列操作。在同一个 SqlSession 中,执行相同的 SQL 查询时;第一次会去查询数据库,并写在缓存中,第二次会直接从缓存中取。SqlSession 在执行了 commit 之后会清空一级缓存。
Mybatis 二级缓存是默认不开启的。二级缓存作用于同一个 namespace 下的所有操作语句,也就是 Mapper 级别的,多个 SqlSession 使用同一个 Mapper 的 sql 就能够使用二级缓存。即二级缓存被多个 SqlSession 共享,是一个全局的变量。
如果增删改操作频繁的话,二级缓存形同虚设,每次都会被清空缓存。