2014/08/28更新
在github上fork了一个
mybatis源码中文注释版,方便大家学习。
最近研读了一下mybatis3的源码,这个框架本身相对其他框架还是比较简单的。因为他上手快,一般没接触过的童鞋一天之内看看官方那个中文文档就能上手。现在读源码,觉得代码也比较清晰,虽然注释很少,但代码都是自解释的。
1.mybatis中的设计模式
- 工厂模式SqlSessionFactory/ObjectFactory/MapperProxyFactory
- 建造模式SqlSessionFactoryBuilder/XMLConfigBuilder/XMLMapperBuilder/XMLStatementBuilder/CacheBuilder,Environment,把建造的步骤分装到一个类里,且运用了fluent API模式。
- 单例模式LogFactory,这个简单,不许new多个实例
- 合成模式MixedSqlNode,里面有许多孩子,TextSqlNode,ForEachSqlNode,IfSqlNode....
- 装饰模式Cache,一个个缓存类通过一个链条串起来
- 代理模式MapperProxy/ConnectionLogger,用的jdk的动态代理
还有executor.loader包使用了cglib或者javassist达到延迟加载的效果
- 模板方法模式BaseExecutor,具体方法实现交给子类SimpleExecutor/CachingExecutor做。还有BaseTypeHandler底下有各种子类如IntegerTypeHandler
- 迭代器模式PropertyTokenizer,可以解析person[0].birthdate.year这样的字符串
- 适配器模式,logging包统一了各大日志框架的接口
2.mybatis中的拦截器
有jdk的动态代理(Plugin),
cglib/javassist(executor.loader包)
3.mybatis中的缓存
代码设计的不错的。采用装饰模式,一个个包装起来,形成一个链,典型的就是SynchronizedCache->LoggingCache->SerializedCache->LruCache->PerpetualCache,通过链起来达到功能增加
- SynchronizedCache 同步缓存,防止多线程问题。核心: 加读写锁,
ReadWriteLock.readLock().lock()/unlock()
ReadWriteLock.writeLock().lock()/unlock()
- LoggingCache 日志缓存,添加功能:取缓存时打印命中率
- SerializedCache 序列化缓存 用途是先将对象序列化成2进制,再缓存
- LruCache 最近最少使用缓存,核心就是覆盖 LinkedHashMap.removeEldestEntry方法,返回true或false告诉 LinkedHashMap要不要删除此最老键值。LinkedHashMap内部其实就是每次访问或者插入一个元素都会把元素放到链表末尾,这样不经常访问的键值肯定就在链表开头啦。
- PerpetualCache 永久缓存,一旦存入就一直保持,内部就是一个HashMap,所有方法基本就是直接调用HashMap的方法
- FifoCache 先进先出缓存,内部就是一个链表,将链表开头元素(最老)移除
- ScheduledCache 定时调度缓存, 目的是每一小时清空一下缓存
- SoftCache 软引用缓存,核心是SoftReference
- WeakCache 弱引用缓存,核心是WeakReference
- TransactionalCache 事务缓存,一次性存入多个缓存,移除多个缓存
4.mybatis中的插件
XMLConfigBuilder.pluginElement()解析plugins节点,调用Configuration.addInterceptor(),加入到Configuration里的InterceptorChain(拦截器链)。
这样下次ParameterHandler|ResultSetHandler|StatementHandler|Executor执行前就会调用plugin.invoke方法了,而他又会调用Interceptor.intercept,我们可以在这里实现自己的插件。替换这4个类的功能。核心就是jdk的动态代理。
5.mybatis中的日志
自己搞了个日志框架,其实就是统一了各大日志框架的接口,适配器模式吧。
mybatis会按以下顺序依次找有没有这个日志类,找到就用这个日志
- SLF4J
- Apache Commons Logging
- Log4J2
- Log4J
- JDK logging
6.mybatis中的OGNL
- foreach元素解析
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
其中collection的解析核心是ognl
- if元素解析
<if test="title != null">
AND title like #{title}
</if>
整个test里面的字符串就交给ognl来解析
本来想写点源码剖析的文章的,但本人文笔较差,发觉读代码累,写出来让大家看懂更累。就这么简单整理一下吧。个人感觉想提高自己还是自己静下心来研读代码比较好啊。
分享到:
相关推荐
NULL 博文链接:https://shmilyaw-hotmail-com.iteye.com/blog/2359096
以下为翻译心得 在site / zh下为官方提供的中文文档 官方中文网站 如果有读者愿意加入作者的项目的,欢迎联系目前在做的项目包括spring,mybatis,tomcat翻译mybatis-plus理解以及参考MP编写ORM框架 翻译规则:在...
本项目为一款基于微信小程序的微信阅读网站小程序,采用SSM(Spring、SpringMVC、MyBatis)框架进行开发,并附带详细的论文。项目旨在为读者提供一个便捷、高效的在线阅读平台,实现随时随地畅享阅读的乐趣。 功能...
本项目为一款基于微信小程序的微信阅读小程序,采用SSM(Spring、SpringMVC、MyBatis)框架进行开发,旨在为用户提供一个便捷、高效的移动阅读平台。项目具有以下核心功能: 1. 书籍分类与搜索:用户可根据自己的...
微信小程序-畅阅读微信小程序是一款基于Java SSM框架(Spring、SpringMVC、MyBatis)开发的移动阅读应用。本程序致力于为用户提供一个便捷、高效的阅读平台,满足用户在移动设备上随时随地阅读的需求。 项目功能...
该项目基于微信小程序开发,采用SSM(Spring、SpringMVC、MyBatis)框架进行后端开发,实现了用户注册登录、书籍分类浏览、在线阅读、论文搜索、学术交流等功能。 用户可以通过注册登录功能创建个人账户,实现个性...
这个基于 Spring Boot、JSP、MyBatis 和 Bootstrap 实现的网上商城在线购物系统具有以下丰富的功能: 1. 商品浏览:用户可以浏览网上商城中的商品,浏览页面根据分类进行展示,用户可以快速找到感兴趣的商品。 2. ...
本项目是一款基于微信小程序的小说阅读器,采用SSM(Spring、SpringMVC、MyBatis)框架进行开发,实现了用户注册登录、小说分类浏览、小说搜索、在线阅读、书签管理、评论互动等功能。用户可以通过微信小程序...
这是一个在线分享工具,作者可以随时随地的分享他想分享的内容,如:学习心得、踩坑点等。不用下载,界面简洁,操作简单。 该工具除了基本的功能外,如:浏览所有资源文章、查看某篇文章的详情、发布文章、注销、...
代码和项目实例:提供了多个Java项目的源代码,方便学习者参考和实践。 学习笔记和心得:记录了学习过程中的重点难点和心得体会,有助于学习者更好地理解和掌握知识。 二、适用人群 本资源适用于即将毕业或已经毕业...
在Internet高速发展的今天,我们生活...本文首先介绍了设计的背景与研究目的,其次介绍系统相关技术,重点叙述了系统功能分析以及详细设计,最后总结了系统的开发心得。 关键词:java技术;鲜花销售微信小程序;mysql
在Internet高速发展的今天,我们生活的...本文首先介绍了设计的背景与研究目的,其次介绍系统相关技术,重点叙述了系统功能分析以及详细设计,最后总结了系统的开发心得。 关键词:java技术;驾校预约管理系统;mysql
在Internet高速发展的今天,我们...本文首先介绍了设计的背景与研究目的,其次介绍系统相关技术,重点叙述了系统功能分析以及详细设计,最后总结了系统的开发心得。 关键词:java技术;食堂线上预约点餐系统;mysql
在Internet高速发展的今天,我们生活...本文首先介绍了设计的背景与研究目的,其次介绍系统相关技术,重点叙述了系统功能分析以及详细设计,最后总结了系统的开发心得。 关键词:java;最多跑一次;微信小程序;mysql
微信小程序“畅阅读微信小程序Ssm.zip”是一个基于Spring、Spring MVC和MyBatis(SSM)框架开发的微信小程序,专为阅读爱好者提供一个优质的电子书阅读平台。该项目结合了微信小程序的用户体验和SSM框架的技术优势,...
NULL 博文链接:https://shmilyaw-hotmail-com.iteye.com/blog/2357862
本项目是一个基于Java Web的QQ村旅游网站,采用SSM(Spring、SpringMVC、MyBatis)框架进行开发,并结合Vue前端技术,实现了一个功能丰富、易于...本项目的源代码和论文已打包成RAR文件,方便用户进行二次开发定制。
本资源是基于SSM(Spring+SpringMVC+MyBatis)框架开发的网络游戏公司官方平台设计与实现的完整项目,包含毕业论文及附带的源代码。项目旨在打造一个功能完善、性能稳定、用户友好的网络游戏公司官方平台,为游戏...
微信小程序“畅阅读微信小程序Ssm.zip”是一款基于Spring、Spring MVC和MyBatis(SSM)框架开发的小程序,专为书籍爱好者和阅读社区打造。该项目结合了微信小程序的广泛覆盖和便利性以及SSM框架的高效性能,致力于...
为满足广大电影爱好者便捷交流、分享的需求,我们开发了这款基于SSM(Spring、SpringMVC、MyBatis)框架的微信小程序电影交流平台。 该平台具有以下核心功能: 1. **电影资讯浏览**:用户可实时查看最新电影资讯,...