Mybatis
文章平均质量分 89
ashan_li
这个作者很懒,什么都没留下…
展开
-
Mybatis3源码分析(01)-前期准备
背景我们大多项目都使用了Mybatis。Mybatis的中的sql大多都是配置在xml文件中的,我们为了方便dba对sql统一的管理需要将sql保存在数据库中。这样就要求Mybatis从数据库中加载配置,同时dba优化先sql之后还得实现让Mybatis在不重启应用的情况下动态加载。要实现这些功能,需要对Mybatis进行扩展,所以本人花了一些时间分析一Mybatis3源码,在此记录。原创 2015-12-17 09:40:10 · 3982 阅读 · 0 评论 -
Mybatis3源码分析(14)-Sql解析执行-StatementHandler
SimpleExecutor执行sql过程BoundSql加载完成之后,下一步就可以执行select/update/insert/delete语句了。在SimpleExecutor中执行语句最终会由doQuery和doUpdate方法完成。 public int doUpdate(MappedStatement ms, Object parameter) throws SQLExcep原创 2015-12-22 10:50:01 · 2813 阅读 · 0 评论 -
Mybatis3源码分析(15)-Sql解析执行-Statement初始化和参数设置
在SimpleExecutor中,执行SQL时调用preareStatement()方法来对statement进行初始化及参数设置。 private Statement prepareStatement(StatementHandler handler, Log statementLog) throws SQLException { Statement stmt; Co原创 2015-12-22 13:11:56 · 1862 阅读 · 0 评论 -
Mybatis3源码分析(16)-Sql解析执行-结果集映射(ResultSetHandler)
在PreparedStatementHandler中的query()方法中,是用ResultHandler来完成结果集的映射的。 public List query(Statement statement, ResultHandler resultHandler) throws SQLException { PreparedStatement ps = (PreparedStat原创 2015-12-22 13:51:35 · 18957 阅读 · 0 评论 -
Mybatis3源码分析(17)-Sql解析执行-缓存的实现
Mybatis主要有两种缓存:一级缓存和二级缓存。一级缓存的生命周期与SqlSession的生命周期一样。一级缓存是在BaseExecutor中实现。二级缓存的生命周期跟SqlSessionFactory一样,通常在整个应用中有效。二级缓存是通过CachingExecutor来实现的。一级缓存Mybatis提供了如下方式来配置一级缓存:SESSION表示在整个SqlSess原创 2015-12-24 11:47:16 · 1187 阅读 · 0 评论 -
Mybatis3源码分析(18)-插件(plugins)拦截器
Mybatis拦截器的使用方法参考官方文档:http://mybatis.org/mybatis-3/zh/configuration.html#plugins拦截器使用示例Mybatis的拦截器是通过jdk的动态代理实现的,只能生成接口的实例。这里生定义一个接口及实现。public interface AshanService{ public void service(Strin原创 2015-12-24 17:56:52 · 1259 阅读 · 0 评论 -
Mybatis3源码分析(19)-Mapper生成过程-示例
Mybatis提供一种mapper形式的访问接口,通过定义接口,再加上简单的注解就能实现数据库操作。 下面来看这个mapper是怎么使用的。先定义接口public interface UserDao{ //告诉Mybatis执行什么Sql @Select("select * from tab_user where user_id=#{USER_ID}") p原创 2015-12-25 13:48:34 · 1138 阅读 · 0 评论 -
Mybatis3源码分析(20)-Mapper实现-配置加载
整体加载过程mybatis-config.xml中可以在包(package)和class的方法让Mybatis加载一个Mapper通过包的方式是从包加载所有的class,最条还是通过class方法来实现加载加载过程中主要通过读取方法中的注解来生成MappedStatement对象,再加入到Configuration中。这个过程跟解析mapper.xml配置文件中的select/inse原创 2015-12-25 14:14:08 · 1292 阅读 · 0 评论 -
Mybatis3源码分析(21)-Mapper实现-动态代理
当定义好一个Mapper接口(UserDao)里,我们并不需要去实现这个类,但sqlSession.getMapper()最终会返回一个实现该接口的对象。这个对象是Mybatis利用jdk的动态代理实现的。这里将介绍这个代理对象的生成过程及其方法的实现过程。Mapper代码对象的生成过程DefaultSqlSession.getMapp()方法最终会调用MapperRegistry.get原创 2015-12-25 17:18:46 · 2036 阅读 · 0 评论 -
Mybatis3源码分析(22)-总结
Configuration加载过程Configuration组成基本属性。在mybatis-config.xml加载的属性这里定义为基本属性。如cacheEnabled/variables/objectFactory等等,这些的加载都比较简单。cache缓存。这个是从mapper配置文件加载的。一个命名空间对应一个缓存。resultMap。结果集映射,从mapper配置文件原创 2015-12-29 13:18:12 · 5226 阅读 · 0 评论 -
Mybatis3源码分析(13)-Sql解析执行-BoundSql的加载-2
前面分析到SqlNode.apply()后,Sql还是个半成口。只处理了"${}"这种占位符,"#{}"这种占位符还没有处理,而且Sql执行时的参数也没有生成。再来看DynamicSqlSource.getBoundSql()方法 public BoundSql getBoundSql(Object parameterObject) { DynamicContext con原创 2015-12-22 09:21:08 · 2167 阅读 · 0 评论 -
Mybatis3源码分析(12)-Sql解析执行-MetaObject
MetaObjectMetaObject类相当于一个工具类,Mybatis在sql参数设置和结果集映射里经常使用到这个对象。下面来详细分析一下这类。这个类有四个属性,其中两个基本不用看。 //原始的对象 private Object originalObject; //对原始对象的一个包装 private ObjectWrapper objectWrapper;原创 2015-12-21 23:14:31 · 4277 阅读 · 0 评论 -
Mybatis3源码分析(02)-加载Configuration-XMLConfigBuilder
Configuration类在Mybatis中的作用Configuration类保存了所有Mybatis的配置信息。也就是说mybaits-config.xml及UserMapper.xml中所有配置信息都可以在Configruation对象中找到相应的信息。一般情况下Mybatis在运行过程中只会创建一个Configration对象,并且配置信息不能再被修改。如何配置Mybatis可以看这个原创 2015-12-17 10:54:28 · 4530 阅读 · 0 评论 -
Mybatis3源码分析(03)-加载Configuration-ResultMap说明
XMLMapperBuilder简单说明XMLMapperBuildery主要是加载mapper配置文件加Configuration中。主要加载两大内容ResultMap:结果集映射,对应Configuration中的resultMaps属性protected final Map resultMaps = new StrictMap("Result Maps collect原创 2015-12-17 14:02:50 · 2863 阅读 · 0 评论 -
Mybatis3源码分析(04)-加载Configuration-XMLMapperBuilder加载ResultMap
XMLMapperBuilder.parse()方法XMLConfigBuilder在解析过程中碰到mappers元素会交由XMLMapperBuilder.parse()方法来处理public void parse() { if (!configuration.isResourceLoaded(resource)) { //真正解析 co原创 2015-12-17 16:25:54 · 2798 阅读 · 0 评论 -
Mybatis3源码分析(05)-加载Configuration-加载MappedStatement
XMLStatementBuilder.parseStatementNode()方法resultMap元素的解析已经分析完毕。与resultMap不一样,XmlMapperBuilder在解析select/update/insert/delete的元素时会创建一个XMLStatementBuilder对象,解析的工作交由其方法parseStatementNode()方法完成。private v原创 2015-12-18 13:07:28 · 12054 阅读 · 0 评论 -
Mybatis3源码分析(06)-加载Configuration-缓存配置加载
Mybatis中的mapper配置文件中,除了经常配置select/update/insert/delete/resultMap节点之外,我们可能还会为Mybatis配置一个或几个缓存。接下来分析一下Mybatis是怎么将mapper配置文件中的缓存配置加载到Configuration对象中的。Mybatis中的缓存类型Mybatis支持两种缓存一级缓存,也叫本地缓存。这个缓存原创 2015-12-18 16:12:25 · 1421 阅读 · 0 评论 -
Mybatis3源码分析(07)-加载Configuration-总结
Configuration中的配置信息下图是官方文档中对Configuration的介绍这里xml配置是由两个对象加载Configuration对象中XMLConfigBuilder。这个对象负责加载除mappers映射器之外的所有配置。XMLMapperBuilder。这个对象只负责加载mappers映射器中的配置。其中他还有个助手:MapperBuilderAssi原创 2015-12-19 08:50:13 · 1603 阅读 · 0 评论 -
Mybatis3源码分析(08)-加载Configuration-使用到的设计模式
设置模式无处不在,在分析Mybatis加载Configuration的过程中,发现Mybatis使用了多种的设置模式。工厂模式下面的例子准确的来说是一个抽象工厂!Configuration中有个属性:protected ObjectFactory objectFactory = new DefaultObjectFactory();Mybatis使用这个工厂去创建所有需要都创建原创 2015-12-19 14:39:30 · 2406 阅读 · 0 评论 -
Mybatis3源码分析(09)-SqlSession创建及简要说明
SqlSession的简要使用在得到SqlSessionFactory之后就可以创建一个SqlSession对象了,SqlSession对象的生命对象通常像如下方法所示:public static void useSqlSession(SqlSessionFactory sqlSessionFactory) { //在通过SqlSessionFactory获取一个SqlSessi原创 2015-12-19 22:49:16 · 1621 阅读 · 0 评论 -
Mybatis3源码分析(11)-Sql解析执行-BoundSql的加载-1
整理完SqlSession和Executor的关系之后,接下来看看一条sql是怎么被解析执行的。如下例:public static void queryUser(SqlSessionFactory sqlSessionFactory) { SqlSession sqlSession=sqlSessionFactory.openSession(); try { Map原创 2015-12-21 09:31:52 · 8089 阅读 · 0 评论 -
Mybatis3源码分析(10)-Executor接口实现方式
之前介绍过,Executor接口定义了对象操作库操作的基本方法:select/update/insert/delete/commit/rollbak/close。Mybatis对Executor接口的实现主要采用了模板模式和装饰模式两种设计模式。Executor类关系其中CloseExecutor为一个类的内部了,而且是private的,先不讨论!BaseExe原创 2015-12-20 22:27:58 · 2144 阅读 · 0 评论