mybatis里可以直接写存储过程吗(mybatis怎么执行存储过程)
说明:上面的配置文件中仅仅指定了数据源连接方式和 User 表的映射配置文件。
方法说明:
默认的 openSession() 方法没有参数,它会创建具备如下特性的 SqlSession:
1)事务作用域将会开启(也就是不自动提交)。
-
将由当前环境配置的 DataSource 实例中获取 Connection 对象。
-
事务隔离级别将会使用驱动或数据源的默认设置。
-
预处理语句不会被复用,也不会批量处理更新。
2)TransactionIsolationLevel 表示事务隔离级别,它对应着 JDBC 的五个事务隔离级别。
3)ExecutorType 枚举类型定义了三个值:
-
ExecutorType.SIMPLE:该类型的执行器没有特别的行为。它为每个语句的执行创建一个新的预处理语句。
-
ExecutorType.REUSE:该类型的执行器会复用预处理语句。
-
ExecutorType.BATCH:该类型的执行器会批量执行所有更新语句,如果 SELECT 在多个更新中间执行,将在必要时将多条更新语句分隔开来,以方便理解。
映射器注解
MyBatis 是一个 XML 驱动的框架。配置信息是基于 XML 的,而且映射语句也是定义在 XML 中的。MyBatis 3 以后,支持注解配置。注解配置基于配置 API;而配置 API 基于 XML 配置。
-
二级缓存是 Application 应用级别的缓存 – 用户配置了 “cacheEnabled=true”,才会开启二级缓存。
-
如果开启了二级缓存,SqlSession 会先使用 CachingExecutor 对象来处理查询请求。CachingExecutor 会在二级缓存中查看是否有匹配的数据,如果匹配,则直接返回缓存结果;如果缓存中没有,再交给真正的 Executor 对象来完成查询,之后 CachingExecutor 会将真正 Executor 返回的查询结果放置到缓存中,然后在返回给用户。
-
二级缓存的生命周期是应用级别的。
-
StatementHandler 是接口;
-
BaseStatementHandler
是实现 StatementHandler 的抽象类,内置一些共性方法;
-
SimpleStatementHandler
负责处理 Statement;
-
PreparedStatementHandler
负责处理 PreparedStatement;
-
CallableStatementHandler
负责处理 CallableStatement。
-
RoutingStatementHandler
负责代理 StatementHandler 具体子类,根据 Statement 类型,选择实例化 SimpleStatementHandler、
PreparedStatementHandler、
CallableStatementHandler。
示例代码中,给 sqlSession 对象的传递一个配置的 Sql 语句的 Statement Id 和参数,然后返回结果io.github.dunwu.spring.orm.mapper.
UserMapper.selectByPrimaryKey 是配置在 UserMapper.xml 的 Statement ID,params 是 SQL 参数。
UserMapper.xml 文件中的代码片段:
MyBatis 通过方法的全限定名,将 SqlSession 和 Mapper 相互映射起来。
说明:
MyBatis 所有的配置信息都维持在 Configuration 对象之中。中维护了一个 Map<String, MappedStatement> 对象。其中,key 为 Mapper 方法的全限定名(对于本例而言,key 就是 io.github.dunwu.spring.orm.mapper.UserMapper.selectByPrimaryKey ),value 为 MappedStatement 对象。所以,传入 Statement Id 就可以从 Map 中找到对应的 MappedStatement。
MappedStatement 维护了一个 Mapper 方法的元数据信息,数据组织可以参考下面 debug 截图:
小结:通过 “SqlSession 和 Mapper” 以及 “SqlSession 和 Executor” 这两节,我们已经知道:SqlSession 的职能是:根据 Statement ID, 在 Configuration 中获取到对应的 MappedStatement 对象,然后调用 Executor 来执行具体的操作。
执行器查询入口主要做两件事:
-
生成动态 SQL:根据传参,动态生成需要执行的 SQL 语句,用 BoundSql 对象表示。
-
管理缓存:根据传参,创建一个缓存 Key。
(2)执行器查询第二入口
实际查询方法主要的职能是判断缓存 key 是否能命中缓存:
-
命中,则将缓存中数据返回;
-
不命中,则查询数据库:
(3)查询数据库
-
根据传递的参数,完成 SQL 语句的动态解析,生成 BoundSql 对象,供 StatementHandler 使用;
-
为查询创建缓存,以提高性能
-
创建 JDBC 的 Statement 连接对象,传递给 StatementHandler 对象,返回 List 查询结果。
对于 JDBC 的 PreparedStatement 类型的对象,创建的过程中,我们使用的是 SQL 语句字符串会包含若干个占位符,我们其后再对占位符进行设值。
【源码】StatementHandler 的 query 方法源码
StatementHandler 使用 ResultSetHandler 对象来完成对 ResultSet 的处理。
技术原创及架构实践文章,欢迎通过公众号菜单「联系我们」进行投稿。
<
如发现本站有涉嫌抄袭侵权/违法违规等内容,请联系我们举报!一经查实,本站将立刻删除。