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来解析
本来想写点源码剖析的文章的,但本人文笔较差,发觉读代码累,写出来让大家看懂更累。就这么简单整理一下吧。个人感觉想提高自己还是自己静下心来研读代码比较好啊。
分享到:
相关推荐
MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。在使用MyBatis时,我们需要理解其核心组件...在实际项目中,理解并熟练掌握MyBatis的基本使用,对于提升开发效率和代码质量有着重要作用。
MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 ...
2. **配置**:在 MyBatis 中,XML 配置文件是必不可少的,它包含了数据源配置、SqlSessionFactory 构建器、Mapper 映射文件的引用等。例如,`mybatis-config.xml` 文件用于全局配置,而 `Mapper.xml` 文件则包含具体...
标签中的“源码”意味着可能涉及到MyBatis的源代码解析,理解MyBatis如何执行SQL,如何处理结果集,以及其内部的数据绑定机制等。深入源码可以帮助开发者更高效地利用MyBatis,解决复杂场景下的问题。 至于文件名,...
在IT行业中,MyBatis作为一个轻量级的持久层框架,深受广大开发者的喜爱。它提供了灵活的SQL映射机制,使得Java对象和数据库表之间的映射变得简单易行。本篇文章将聚焦于MyBatis中的注解(Annotation)与XML配置的...
【描述】:虽然描述中并未给出具体信息,但根据“博文链接:https://java-lxm.iteye.com/blog/1208173”,我们可以推测该内容可能包含了博主对MyBatis的学习心得、使用技巧或者是源码解析。通常在这样的博文中,作者...
这个“Mybatis学习笔记”可能是某位开发者的学习心得或者是教程资料,通过阅读我们可以深入理解Mybatis的核心概念和用法。 Mybatis的主要特点包括: 1. **动态SQL**:Mybatis允许在映射文件中编写动态SQL,使得SQL...
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使你更好地将关注点集中在使用 SQL 来获取数据上,而不是在如何将数据绑定到对象上。对于 Java 开发者来说,MyBatis 是一个不可或缺...
3. **阅读源码**:深入学习 MyBatis 的最佳途径之一就是阅读源码,理解其内部实现机制。 4. **社区参与**:加入 MyBatis 的社区或论坛,与其他开发者交流心得,分享经验。 5. **实战应用**:在真实的项目中使用 ...
通过阅读和研究这些核心概念的源码,开发者可以更深入地理解Java的运行机制,从而编写出更高效、更健壮的代码。同时,这也是成为一名高级Java开发者的必经之路。在实践过程中,不断积累经验,结合文档和社区资源,将...
在IT行业中,MyBatis是一个广泛使用的持久层框架,它允许开发者将对象关系映射(Object-Relational Mapping,ORM)以XML配置文件的方式进行定义,从而极大地简化了数据库操作。这篇“mybatis学习总结:对象关系映射...
以下为翻译心得 在site / zh下为官方提供的中文文档 官方中文网站 如果有读者愿意加入作者的项目的,欢迎联系目前在做的项目包括spring,mybatis,tomcat翻译mybatis-plus理解以及参考MP编写ORM框架 翻译规则:在...
这个项目的源代码已经过测试,可以确保直接运行,为学习者提供了便捷的实践平台。以下是对该项目中涉及的技术和知识点的详细解释: 1. **Spring Boot**: Spring Boot是Spring Framework的一个子项目,它简化了...
本项目为一款基于微信小程序的微信阅读网站小程序,采用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)框架进行开发,实现了用户注册登录、小说分类浏览、小说搜索、在线阅读、书签管理、评论互动等功能。用户可以通过微信小程序...
在阅读过程中,用户还可以对小说进行评论和分享,与其他读者交流心得。 此外,项目还具备一定的扩展性。开发者可以根据需求,在现有代码基础上增加新功能,如推荐算法、个性化推荐等,以提升用户体验。 该项目适合...