参考
https://blog.csdn.net/hellozpc/article/details/80878563
https://blog.csdn.net/Yang_Hui_Liang/article/details/88291752
https://blog.csdn.net/u012373815/article/details/47069223

一、Mybatis的三大优点

1、不屏蔽SQL,意味着可以更为精确地定位SQL语句,可以对其进行优化和改造,这有利于互联网系统性能的提高,符合互联网需要性能优化的特点。

2、提供强大、灵活的映射机制,方便Java开发者使用。提供动态SQL的功能,允许我们根据不同条件组装SQL,这个功能远比其他工具或者Java编码的可读性和可维护性高得多,满足各种应用系统的同时也满足了需求经常变化的互联网应用的要求。

3、在Mybatis中,提供了使用Mapper的接口编程,只要一个接口和一个XML就能创建映射器,进一步简化我们的工作,使得很多框架API在Mybatis中消失,开发者能更集中与业务逻辑。

二、Mybatis的四大核心组件

1)SqlSessionFactoryBuilder (构造器):它会根据配置或者代码来生成SqlSessionFactory,才用的时分步构建的Builder模式。

2)SqlSessionFactory(工厂接口):依靠它来生成SqlSession,使用的是工厂模式。

3)SqlSession(会话):一个既可以发送SQL执行返回结果,也可以获取Mapper的接口。在现有的技术中,一般我们会让其在业务逻辑代码中“消失”,而使用Mybatis提供的
SQL Mapper接口编程技术,它能提高代码的可读性和可维护性。

4)SQL Mapper(映射器):Mybatis新设计存在的组件,他有一个Java接口和XML文件(或注解)构成,需要给出对应的SQL和映射规则。它负责发送SQL去执行,并返回结果。

三、Mybatis的框架配置文件

TypeHandler

四、Mybatis的mapper配置文件

五、Mybatis的动态sql

六、Mybatis的级联操作

七、Mybatis的缓存

八、Mybatis延迟加载策略

直接加载

侵入延迟

深度延迟

九、Mybatis接口编程

十、Mybatis注解开发

mybatis二级缓存.jpg

一级缓存
默认开启
使用HashMap进行数据存储
作用域是SqlSession范围的
DML操作commit后清空SqlSession的一级缓存
CacheKey

1、一级缓存的生命周期有多长?
a、MyBatis在开启一个数据库会话时,会创建一个新的SqlSession对象,SqlSession对象中会有一个新的Executor对象。Executor对象中持有一个新的PerpetualCache对象;当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。
b、如果SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用。
c、如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但是该对象仍可使用。
d、SqlSession中执行了任何一个update操作(update()、delete()、insert()) ,都会清空PerpetualCache对象的数据,但是该对象可以继续使用
2、怎么判断某两次查询是完全相同的查询?
Mybatis认为,对于两次查询,如果以下条件都完全一样,那么就认为它们是完全相同的两次查询。
2.1 传入的statementId一样
2.2 查询时要求的结果集中的结果范围一样
2.3. 这次查询所产生的SQL一样
2.4 传递给java.sql.Statement要设置的参数值一样

二级缓存
默认不开启
使用HashMap进行数据存储
作用域是Mapper范围的,多个Sqlsession可以共用二级缓存,二级缓存是跨SqlSession的
由于二级缓存的数据不一定都是存储到内存中,它的存储介质多种多样,所以需要给缓存的对象执行序列化
CacheKey

3.Mybatis高级查询
参考:
https://blog.csdn.net/q283614346/article/details/83316164
https://www.cnblogs.com/java-263/p/9940867.html
两种:
1.连接查询
2.嵌套查询,可以延迟加载。

{}和${}的区别
#{}是预编译处理,${}是直接赋值。
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理${}时,就是把${}替换成变量的值。
使用#{}可以有效的防止SQL注入,提高系统安全性。

Maper接口即mapper接口工作原理

接口的全限定名 就是xml文件中的namespace的值
接口的方法名 就是xml文件中的statement的id的值
接口的参数 就是传递给sql的参数
Mapper 接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Mapper接口生成代理对象proxy,代理对象会拦截接口方法,转而执行MapperStatement所代表的sql,然后将sql执行结果返回。

Dao接口方法不能重载。因为是使用 全限名+方法名 的保存和寻找策略。

Mybatis是如何将sql的执行结果封装成对象并返回的。
1.使用标签
2.使用sql的列别名

如何获取自动生成的key
insert 方法总是返回一个int值 ,这个值代表的是插入的行数。
如果采用自增长策略,自动生成的键值在 insert 方法执行完后可以被设置到传入的参数对象中。
示例:
insert into names (name) values (#{name})
name name = new name();name.setname(“fred”); int rows = mapper.insertname(name);
// 完成后,id已经被设置到对象中
system.out.println(“rows inserted = ” + rows);
system.out.println(“generated key value = ” + name.getid());

Mybatis的
一对一查询 resultMap里面配置association节点配置
一对多查询 resultMap里面配置collection节点配置

mybattis的查询方式
1.联合查询
有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次, 通过在resultMap里面配置association节点配置一对一的类就可以完成;

2.嵌套查询
嵌套查询是先查一个表,根据这个表里面的结果的 外键id,去再另外一个表里面查询数据,也是通过association配置,但另外一个表的查询通过select属性配置。