Mybatis是一个半自动的ORM(对象关系映射)框架,它封装了JDBC的操作
首先了解一下JDBC的工作流程
Connection
通过DriverManger获得一个Connection(连接),一个Connection对象表示通过JDBC驱动与数据源建立的连接
connection的获取可以从两个方面获取
- JDBC API中提供的DriverManager类获取
Connection connection = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/data?user=root&password=123456");
DataSource dataSource = new UnpooledDataSource(
"com.mysql.cj.jdbc.Driver",
"jdbc:mysql://127.0.0.1:3306/data?user=root&password=123456&AllowPublicKeyRetrieval=true",
"root","qwer1234");
Statement
statement中执行SQL语句
- Statement 不支持输入参数,有sql注入的风险
- PreparedStatement:增加了设置SQL参数的方法
- CallableStatement:增加了调用存储过程以及检索存储过程调用结果的方法
不同Statement执行的方式
Connection connection = DriverManager.getConnection("");
String sql = "SELECT * FROM admin WHERE username = ? AND password = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,"username");
preparedStatement.setString(2,"password");
ResultSet resultSet = preparedStatement.executeQuery();
String sql2 = "SELECT * FROM admin WHERE username = 'username' AND password = 'passwor'";
Statement statement2 = connection.createStatement();
ResultSet resultSet2 = statement.executeQuery(sql);
ResultSet
结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,他同时还具有操纵数据的功能,可能完成对数据的更新等。? ?
Mybatis的工作原理
先封装SQL,接着调用JDBC操作数据库,最后把数据库返回的表结果封装成Java类
SqlSession
- 接口层的核心对象就是SqlSession,SqlSession是应用和MyBatis打交道的桥梁,SqlSession上定义了一系列数据库操作方法,然后在收到请求的时候再去调用核心处理层模块来完成具体操作
- 它包含了所有执行语句、提交或回滚事务以及获取映射器实例的方法。
- SqlSession是MyBatis提供的面向用户的API,表示和数据库交互时的会话对象,用于完成数据库的增删改查功能。SqlSession是Executor组件的外观,目的是对外提供易于理解和使用的数据库操作接口
Executor(可扩展插件)
- Executor是MyBatis的SQL执行器,MyBatis中对数据库所有的增删改查操作都是由Executor组件完成的。?
StatementHandler(可扩展插件)
- StatementHandler组件封装了对JDBC Statement的操作,例如设置Statement对象的fetchSize属性、设置查询超时时间、调用JDBC Statement与数据库交互等,StatementHandler内运用了适配器模式和策略模式的思想
- SimpleStatementHandler :封装了JDBC的 Statement 对象
- PreparedStatementHandler:封装了JDBC的 PreparedStatement 对象 (可添加sql参数)
- CallableStatementHandler:封装了JDBC的 CallableStatement 对象
ParameterHandler(可扩展插件)
- 当MyBatis框架使用的Statement类型为CallableStatement和PreparedStatement时,ParameterHandler用于为Statement对象参数占位符设置值。
ResultSetHandler(可扩展插件)
- ResultSetHandler封装了对JDBC中的ResultSet对象操作,当执行SQL类型为SELECT语句时,ResultSetHandler用于将查询结果转换成Java对象。
TypeHandler(自定义转化处理器)
Configuration
用于描述MyBatis的主配置信息,其他组件需要获取配置信息时,直接通过Configuration对象获取。除此之外,MyBatis在应用启动时,将Mapper配置信息、类型别名、TypeHandler等注册到Configuration组件中,其他组件需要这些信息时,也可以从Configuration对象中获取。
MappedStatement
- MappedStatement用于描述Mapper中的SQL配置信息,是对Mapper XML配置文件中<select|update|delete|insert>等标签或者@Select/@Update等注解配置信息的封装。
MyBatis缓存
一级缓存
- 一级缓存默认是开启的,而且不能关闭。
- 一级缓存级别:参数 localCacheScope
-
- SESSION 当指定localCacheScope参数值为SESSION时,缓存对整个SqlSession有效,只有执行DML语句(更新语句)时,缓存才会被清除
- STATEMENT 当localCacheScope值为STATEMENT时,缓存仅对当前执行的语句有效,当语句执行完毕后,缓存就会被清空。
二级缓存
- 默认二级缓存关闭
- 作用域为 Namespaces
- 当Namespaces内执行查询操作时,查询结果会缓存到二级缓存中,执行更新操作后,二级缓存会被清空。
第三方缓存
Mapper的生命周期
Mapper配置文件的读取和装载
Mapper代理的执行
?
?
|