意义:持久层框架,支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
MyBatis是持久层框架,支持JDBC,简化了持久层开发。
使用MyBatis时,只需要通过接口指定数据操作的抽象方法,然后配置与之关联的SQL语句,即可。

1. MyBatis的优缺点

image.png

理解简记

优点
1.SQL语句编程,不对现有程序和数据库设计造成影响
2.写在xml中,sql和程序代码去耦合,提供xml标签,可复用
3.不需像JDBC手动开关连接,代码量少
4.兼容各数据库
5.和Spring集成
6.提供映射标签,支持对象和数据库字段关系映射
ORM(对象关系映射):javabean 对象 和 数据库 数据
缺点
1.sql语句编写工程大
2.依赖数据库,一旦确定,不能随便更换

2. #{}和${}的区别是什么

{} 是 sql 的参数占位符,Mybatis 会将 sql 中的 #{} 替换为?号,在 sql 执⾏前会使⽤ PreparedStatement 的参数设置⽅法,按序给 sql 的?号占位符设置参数值,⽐如 ps.setInt(0, parameterValue), #{item.name} 的取值⽅式为使⽤反射从参数对象中获取 item 对象的 name 属性值,相当于 param.getItem().getName() 。
${} 是 Properties 文件中的变量占位符,它可以⽤于标签属性值和 sql 内部,属于静态文本替换,比如${driver}会被静态替换为 com.mysql.jdbc.Driver 。

image.png

理解简记

{} 是预编译处理时的参数占位符,MyBatis处理时,会将sql中的#{} 替换成号,调用preparedStatement赋值。变量替换后自动加上单引号,是使用反射从参数对象中获取属性值,是动态替换
${}是配置文件中的字符串变量拼接符,MyBatis处理时,将${}替换成变量的值,调用Statement赋值,变量替换后不会加上单引号,是静态文本替换。
使用#{}可以防止SQL注入,提高系统安全性。( ${}没有预编译,危险)

3. MyBatis的插件运行原理,如何编写一个插件?

运行原理
插件指的就是拦截器,Spring中自己写的拦截日志什么的都很灵活,MyBatis中没这么灵活,他只支持四种。
使用JDK的动态代理,生成代理对象。
image.png
1.ParameterHandler:进行参数转换,java的参数类型转成数据库的数据类型
2.ResultSetHandler:jdbc中的一个接口,负责接收数据库中的数据结果集最终映射成的结果集ResultSet
3.StatementHandler:jdbc中第一个接口,针对jdbc中的Statement进行封装,负责设置参数,将结果集进行转换
4.Executor:MyBaits调度的核心,负责生成SQL语句及查询缓存的维护
过程:3设置参数,1将java参数转换成数据库的数据类型,2接收数据库的数据,3将结果集转成java类型,2映射成ResultSet。

编写插件
实现Interceptor接口并复写interceptor方法,这方法下的invocation可以获取目标对象(就是前面的4个接口之一)里的参数。然后可以设置相应的前拦截后拦截。
image.png

4. MyBatis-Plus分页插件怎么做

5. MyBatis、MyBatis Plus中有哪些注解?

5.1 MyBatisPlus常用注解

image.png