当前位置: 首页 > news >正文

Mybatis架构设计及源码分析-SqlSession

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

我们知道执行一次sql语句至少要创建一个SqlSession,一个SqlSession包含了只少一次与数据库的回话过程,mybatis中SqlSession中包含了所有可能出现的sql语句执行过程其默认实现为DefaultSqlSession。下面我们分析下DefaultSqlSession。

还是回到上述编程式使用mybatis。

String resource = "mybatis.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

SqlSession session = sqlSessionFactory.openSession();
try {
  Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
} finally {
  session.close();
}

具体的xml配置文件如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper">
  <select id="selectBlog" resultType="Blog">
    select * from Blog where id = #{id}
  </select>
</mapper>

最终调用的是这段代码:

public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) {
    try {
      MappedStatement ms = configuration.getMappedStatement(statement);
      return executor.query(ms, wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER);
    } catch (Exception e) {
      throw ExceptionFactory.wrapException("Error querying database.  Cause: " + e, e);
    } finally {
      ErrorContext.instance().reset();
    }
}

很简单根据statement拿到MappedStatement然后通过executor执行query并返回结果,其它语句也是类似执行。

转载于:https://my.oschina.net/wenbo123/blog/1819294

相关文章:

  • C# 禁止windows程序重复运行的两种基本方法
  • 代码动态设置edittext输入类型为密码类型
  • 用ASDF来组织Lisp程序编译和加载
  • TensorFlow与OpenCV,读取图片,进行简单操作并显示
  • 移动终端开发必备知识
  • MAC配置环境变量
  • oracle的nvl和sql server的isnull
  • UTC时间与当地时间的转换关系?
  • oracle分页查询
  • 做项目学习Django2.0开发
  • [转]虚拟机下Ubuntu共享主机文件(Ubuntu、VMware、共享)
  • js中clientHeight,offsetHeight,scrollHeight的区别
  • Range Slider With Progress
  • nohup命令
  • 优先级队列PriorityBlockingQueue
  • hexo+github搭建个人博客
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • codis proxy处理流程
  • Computed property XXX was assigned to but it has no setter
  • Docker 笔记(2):Dockerfile
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • maven工程打包jar以及java jar命令的classpath使用
  • Median of Two Sorted Arrays
  • Node 版本管理
  • React系列之 Redux 架构模式
  • ubuntu 下nginx安装 并支持https协议
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 动态规划入门(以爬楼梯为例)
  • 读懂package.json -- 依赖管理
  • 工作手记之html2canvas使用概述
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 诡异!React stopPropagation失灵
  • 王永庆:技术创新改变教育未来
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​flutter 代码混淆
  • ​linux启动进程的方式
  • # 飞书APP集成平台-数字化落地
  • #1014 : Trie树
  • #includecmath
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #图像处理
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (1)(1.13) SiK无线电高级配置(五)
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (zt)最盛行的警世狂言(爆笑)
  • (二)linux使用docker容器运行mysql
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (三)elasticsearch 源码之启动流程分析
  • (一)为什么要选择C++
  • .net 按比例显示图片的缩略图
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter