MyBatis源码浅析(一)开篇

网友投稿 212 2023-06-29


MyBatis源码浅析(一)开篇

源码学习的好处不用多说,Mybatis源码量少、逻辑简单,将写个系列文章来学习。

SqlSession

Mybatis的使用入口位于org.apache.ibatis.session包中的SqlSession,发现它是个接口,必然有个默认实现类org.apache.ibatis.session.defaults包中的DefaultSqlSession。我们从来没有new过这个类,按照java惯例使用SqlSessionFactory里的工厂方法。发现它也是个接口,必然有默认实现类DefaultSqlSessionFactory。该类依然不用自己创建,使用SqlSessionFactoryBuilder里的工厂方法。

DefaultSqlSession

DefaultSqlSession里主要方法:

1)Cursor selectCursor(String statement, Object parameter, RowBounds rowBounds),委托给executor.queryCursor(ms, wrapCollection(parameter), rowBounds)。

2)List 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 queryFromDatabase(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql),委托为抽象的abstract List doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql)。

2)Cursor queryCursor(MappedStatement ms, Object parameter, RowBounds rowBounds),委托给抽象的abstract Cursor 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 doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql),委托给handler.query(stmt, resultHandler)。

2)Cursor doQueryCursor(MappedStatement ms, Object parameter, RowBounds rowBounds, BoundSql boundSql),委托给handler.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 query(Statement statement, ResultHandler resultHandler),委托给statement.execute(sql)。

2)Cursor queryCursor(Statement statement),委托给statement.execute(sql)。

3)int update(Statement statement),委托给statement.execute(sql)。

最终由statement执行sql。这就回到了java.sql包了。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java发送带html标签内容的邮件实例代码
下一篇:java 出现问题javax.servlet.http.HttpServlet was not found解决方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~