mybatis里可以直接写存储过程吗(mybatis怎么执行存储过程)

说明:上面的配置文件中仅仅指定了数据源连接方式和 User 表的映射配置文件。

mybatis里可以直接写存储过程吗(mybatis怎么执行存储过程)

方法说明:

默认的 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”,才会开启二级缓存。

  1. 如果开启了二级缓存,SqlSession 会先使用 CachingExecutor 对象来处理查询请求。CachingExecutor 会在二级缓存中查看是否有匹配的数据,如果匹配,则直接返回缓存结果;如果缓存中没有,再交给真正的 Executor 对象来完成查询,之后 CachingExecutor 会将真正 Executor 返回的查询结果放置到缓存中,然后在返回给用户。

  2. 二级缓存的生命周期是应用级别的。

  • 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 的处理。

技术原创及架构实践文章,欢迎通过公众号菜单「联系我们」进行投稿。

<

本站部分内容由互联网用户自发贡献,该文观点仅代表作者本人,本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如发现本站有涉嫌抄袭侵权/违法违规等内容,请联系我们举报!一经查实,本站将立刻删除。