- 你对MyBatis的理解?
- MyBatis的优缺点有哪些?
- MyBatis与Hibernate有哪些不同?
- MyBatis中的#{} 和 ${} 有什么不同?*
- MyBatis是如何进行分页的?分页插件的原理是什么?
- MyBatis有哪几种分页方式?
- MyBatis逻辑分页和物理分页的区别是什么?
- MyBatis是否支持延时加载?如果支持,它的实现原理是什么?
- 说一下MyBatis的一级缓存和二级缓存?
- MyBatis有哪些执行器(Excetor)?
- MyBatis动态SQL是做什么的?都有哪些动态SQL?简述一下动态SQL的执行原理?
- 扩展
- ORM
- hql语言
是什么?
- Mybatis本是apache的一个开源项目iBatis。
- 是java编写的优秀的持久层框架,它支持定制化 sql、存储过程以及高级映射,实现了结果集的封装。
- mybatis避免了几乎所有的 jdbc代码和手动设置参数以及获取结果集。
- 是一个半ORM(对象关系映射)框架,内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建Statement等繁琐的过程;
- MyBatis可以使用简单的 XML 或注解来配置和映射原生类型、接口,将Java 的 pojo(plain old Java objects,普通老式 Java 对象)映射成数据库中的记录。
通过XML文件 或 注释的方式,将要执行的各种Statemet配置起来,并通过java对象和Statement中SQL的动态参数进行映射生成最终执行的SQL语句,最后由MyBatis框架执行SQL并将结果映射为java对象返回。(从执行SQL到返回Result的过程)。
MyBatis的优缺点有哪些?优点
对于JDBC,减少了50%的代码量;
最简单的持久化框架,小巧且简单易学;
SQL写在XML里,从程序代码中彻底分离,降低耦合度,便于统一管理,可重用;
提供XML标签,支持编写动态SQL语句(XML中使用if, else)。
提供映射标签,支持对象与数据库的ORM字段关系映射(在XML中配置映射关系,也可以使用注解)。
缺点
SQL语句的编写工作量较大,尤其是字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。
SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
| 区别 | MyBatis | Hibernate |
|---|---|---|
| 自动性 | 只有基本的字段映射,需要通过手写sql来实现和管理 | 完全可以自动生成sql |
| 数据库移植性 | 移植性差,由于需要手写sql | 移植性好,依赖于强大的映射结构和hql语言,降低了对象与数据库的耦合性。 |
| 日志系统 | 基本记录功能 | 较为健全 |
| 关心细节 | 更多关注技术细节,由于其使用简单 | 配置较为复杂,学习成本高 |
| sql直接优化 | 较为方便 | sql是自动生成的,无法直接维护sql |
动态sql是Mybatis的主要特性之一。
Mybatis提供了两种支持动态sql的语法:#{} 和 ${}
| 区别 | #{} | ${} |
|---|---|---|
| 符号类型 | 参数占位符,即预编译 | 字符串替换符,即SQL拼接 |
| 处理 | 处理#{}会将#{}替换为?号,调用PreparedStatement的set方法来赋值 | 把${} 替换成变量的值 |
| 防注入问题 | 很大程度上能防止sql注入 | 不能防止sql注入 |
| 参数替换位置 | 在DBMS中 | 在DBMS外 |
| 参数解析 | 将传入的数据都当做一个字符串, 会对传入的变量自动加一个单引号 | 将传入的参数直接显示生成在sql中, 不加任何引号 |
| 用$的情况 | – | MyBatis排序使用order by,动态参数时使用$而不是# 一般用于传入数据库对象(比如表名) |
| sql执行过程 | 编译好SQL语句后再去取值 | 取值以后再去编译SQL语句 |
| 流程 | 动态解析→预编译→执行 | 动态解析→编译→执行 |
| 一般情况 | 一般可以用#就别用$ | – |
ORM = 对象关系映射。
ORM = Object Relational Mapping对象关系映射,就是把数据库表和实体类及实体类的属性对应起来,让开发者操作实体类就可以实现操作数据库表;
封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动、建立连接等复杂过程。
hql语言 = hibernate query language的缩写,提供更加丰富灵活、更为强大的查询能力。sql查询的是表和表中的列;hql查询的是对象与对象中的属性。



