- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章MyBatis源码浅析(一)开篇由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
源码学习的好处不用多说,Mybatis源码量少、逻辑简单,将写个系列文章来学习.
SqlSession 。
Mybatis的使用入口位于org.apache.ibatis.session包中的SqlSession,发现它是个接口,必然有个默认实现类org.apache.ibatis.session.defaults包中的DefaultSqlSession。我们从来没有new过这个类,按照Java惯例使用SqlSessionFactory里的工厂方法。发现它也是个接口,必然有默认实现类DefaultSqlSessionFactory。该类依然不用自己创建,使用SqlSessionFactoryBuilder里的工厂方法.
DefaultSqlSession 。
DefaultSqlSession里主要方法:
1)Cursor<T> selectCursor(String statement, Object parameter, RowBounds rowBounds),委托给executor.queryCursor(ms, wrapCollection(parameter), rowBounds).
2)List<E> selectList(String statement, Object parameter, RowBounds rowBounds)和void select(String statement, Object parameter, RowBounds rowBounds, ResultHandler handler),委托给executor.query(ms, wrapCollection(parameter), rowBounds, handler).
3)int update(String statement, Object parameter),委托给executor.update(ms, wrapCollection(parameter))。 可见,最终都有executor来完成.
Executor 。
Executor位于org.apache.ibatis.executor包中,是个接口,实现类是BaseExecutor和CachingExecutor。其中BaseExecutor是抽象的,有三个子类SimpleExecutor、ReuseExecutor和BatchExecutor,见名知意。BaseExecutor里主要方法:
1)List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql)和List<E> queryFromDatabase(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql),委托为抽象的abstract <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql).
2)Cursor<E> queryCursor(MappedStatement ms, Object parameter, RowBounds rowBounds),委托给抽象的abstract <E> Cursor<E> doQueryCursor(MappedStatement ms, Object parameter, RowBounds rowBounds, BoundSql boundSql).
3)int update(MappedStatement ms, Object parameter),委托给抽象的abstract int doUpdate(MappedStatement ms, Object parameter).
基类处理公共部分,具体留给子类实现.
再看下SimpleExecutor里的主要方法:
1)List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql),委托给handler.<E>query(stmt, resultHandler).
2)Cursor<E> doQueryCursor(MappedStatement ms, Object parameter, RowBounds rowBounds, BoundSql boundSql),委托给handler.<E>queryCursor(stmt).
3)int doUpdate(MappedStatement ms, Object parameter),委托给handler.update(stmt).
可见,最终由handler来处理.
StatementHandler 。
StatementHandler位于org.apache.ibatis.executor.statement包中,是个接口,实现类是BaseStatementHandler和RoutingStatementHandler。BaseStatementHandler是抽象的,有三个子类SimpleStatementHandler、PreparedStatementHandler和CallableStatementHandler。这三个应该比较熟悉,分别处理不带参数的sql语句、参数化sql语句和存储过程。再看SimpleStatementHandler里的主要方法:
1)List<E> query(Statement statement, ResultHandler resultHandler),委托给statement.execute(sql).
2)Cursor<E> queryCursor(Statement statement),委托给statement.execute(sql).
3)int update(Statement statement),委托给statement.execute(sql).
最终由statement执行sql。这就回到了java.sql包了.
Mybatis主要完成对sql参数的封装处理、结果集的获取并生成对象,而把sql语句的构建过程留给用户。Mybatis的作者故意这样设计的。虽然框架从整体来看是半自动的,但灵活性却得到了极大增加.
原文链接:http://www.cnblogs.com/lixinjie/archive/2016/11/10/mybatis-src-01-beginning.html 。
最后此篇关于MyBatis源码浅析(一)开篇的文章就讲到这里了,如果你想了解更多关于MyBatis源码浅析(一)开篇的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
很多朋友或许都有这个疑问,一个网站域名和网站的排名有关系吗?今天本文就从三个方面分析网站的域名与网站的排名有没有关系,希望对大家有一定的帮助。 1、全拼双拼域名 首先,我们要知道在这一点百
什么是进程 当一个程序进入内存中运行起来它就变为一个进程。因此,进程就是一个处于运行状态的程序。同时进程具有独立功能,进程是操作系统进行资源分配和调度的独立单位。 什么是线程 线程是进
最近几年,互联网络竞争异常激烈,各个企业为了增加业绩,都在网络销售中下足了功夫。要确定网站发展的方向,必须给自己的网站制定好一个发展目标,有了目标才能更好的发展。不管
一.基础知识准备: 1.层的原则: (1)每一层以接口方式供上层调用。 (2)上层只能调用下层。 (3)依赖分为松散交互和严格交互两种。 2.业务逻辑分类: (1)应
编程时一门技术,更是一门艺术 简单工厂模式利用面向对象方式通过继承、封装、多态把程序的耦合度降低,设计模式使得程序更加灵活,容易修改,易于复用。 下面是服务器计算器代码:
对于策略模式的理解:当一个业务有多种需求时候,在某个时候需要使用不同的方式来计算结果。这时候不同的方式可以理解为不同的策略来解决同样的问题。 例如:商场收银系统计算价格,1:正常计算 2:商品打折计
随着 Kubernetes 在企业中应用的越来越广泛和普及,越来越多的公司在生产环境中运维多个集群。本文主要讲述一些关于多集群 Kubernetes 的思考,包括为什么选择多集群,多集群的好处以
Kubelet 出于对节点的保护,允许在节点资源不足的情况下,开启对节点上 Pod 进行驱逐的功能。最近对 Kubelet 的驱逐机制有所研究,发现其中有很多值得学习的地方,总结下来
以下分析不针对任何快递公司,纯属实说。 申通快递在快递行业中速度与费用都属于中等的水平,在国内也分布有很多投递点,一般地区都可以投递到;顺丰在国内是速度最快的快递公司之一,一般来说隔天就能够到,其
概述 流(streams)是PHP4.3版本引入的一个特性,主要是为了统一文件、sockets以及其他类似资源的工作方法。PHP4.3距今已经有很长时间了,但是很多程序员似乎都不能正确使用PHP中
Pre 很早在看 Jesse 的 Asp.net Core快速入门 的课程的时候就了解到了在Asp .net core中,如果添加的Json配置被更改了,是支持自动重载配置的,作为一名有着严重&q
之前对closure一知半解,在网上也找不到一篇文章能把它说清楚,今天好像第一次对它有点清晰的了解 了,写个BLOG记念一下 lua的函数是一种 First-Class Value 的东西, 到底
1、什么是默认方法,为什么要有默认方法 简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法。只需在方法名前面加个default关键字即可。 为什么要有这个特性?首先,之前的接口是个双
信息数据传输的安全一直都是个很重要的话题,从刚开始当程序员时错以为MD5、SHA1这些哈希算法就是加密算法,到后来慢慢接触对称加密、非对称加密这些概念,再到对接各种大开发平台接口的时候看到他们通
前言 2021年,vanilla-extract 作为黑马登顶了 css-in-js 满意度榜首(虽然使用率仅为1%),号称是一个类型安全、高度兼容 TS 场景的库,国内相关讨论还很少,稍微看
(一)响应式数据 1. 简单例子 从最简单的数据绑定开始,在 Vue 2.0 中,我们这样将一个数据绑定到模板的指定位置: 在组件创建参数的 data 构造函数中返回一个用来绑定的数据对象,其
我是一名优秀的程序员,十分优秀!