mybatis源码_专治你不会看源码的毛病-----Mybatis源码分析

827b519402621852a71f4476d2de20f0.png

点关注,不迷路;持续更新Java相关技术及资讯!!
一、What is mybatis?

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
1、源码下载到本地

从github下载mybatis源码到idea中。

ed6872ac2dc4ab789d77a4335c6175be.png

112d821939d93acd1a07fd43b8f2d99e.png

2、快速开始

构建mybatis-config.xml文件
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mybatis/UserMapper.xml"/>
</mappers>
</configuration>usermapper.xml文件

<mapper namespace="bat.ke.qq.com.mybatis.UserMapper">
<select id="selectUser" resultType="bat.ke.qq.com.mybatis.User">
select * from user where id = #{id}
</select>
</mapper>
3、创建POJO类
@ToString
@Getter
@Setter
public class User implements Serializable{
private Integer id;
private String username;
private Integer age;
private String phone;
private String desc;

4、创建测试类
/**
* 源码学院-Monkey
* 只为培养BAT程序员而生
* http://bat.ke.qq.com
* 往期视频加群:516212256 暗号:6
*/
@Slf4j
public class MybatisTest {
public static void main(String[] args) throws Exception {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
try {
User user = session.selectOne("bat.ke.qq.com.mybatis.UserMapper.selectUser", 1);http://log.info("user:{}", user);
} finally {
session.close();
}
}5、效果

7df21b129cde99d9d03726baedc4e12a.png

ok !大功告成二、How is mybatis?

通过刚才的demo我们可以用java》mybatis》mysql可以查询数据库想要的内容,那现在问题来了?其底层的实现原理是什么?

78166d8e5d2f40efbd6ac52dce611d30.png

作为一名高级工程师或者是架构师,我们要知其然知其所以然。

那我们现在分析下mybatis的技术本质是什么

从这个图来说,我们可以看得出mybatis是一个“龟公”,专门拉皮条的,那它为何能做到了?我觉得至少有着三个情况

e1c03aacef6ff3201daf565fac3ffb3e.png

那这三项包含什么了?

aec502980f04f3703312d513c9ab3d7c.png

只有mybatis知道连接那个数据库源然后执行什么sql语句,谁去执行,这三个条件达到了咱们才能把这个事情给办了。

4027d96455de75e1e1f231bfb5febbaa.png

这个就好比咱们晚上约一个妹子做拍拍的事情,完成这个事情必须是有宾馆、有女孩有TT…你懂得
三、Check is mybatis!
通过上面我们分析,我们现在去看看mybatis的源码,看看是不是这样做的。

1、找到程序的入口

57918c6fb59c1f3eb5c1328c29874e7d.png

1、mybatis是如何获取数据库源的

org.apache.ibatis.session.SqlSessionFactoryBuilder.build(java.io.InputStream)>
org.apache.ibatis.session.SqlSessionFactoryBuilder.build(java.io.InputStream)
org.apache.ibatis.builder.xml.XMLConfigBuilder.parse
org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration
org.apache.ibatis.builder.xml.XMLConfigBuilder.environmentsElement
org.apache.ibatis.builder.BaseBuilder.resolveClass
org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory.getDataSource
org.apache.ibatis.session.Configuration.setEnvironment

80bb93d6d0268739549c7e3c510a9943.png

这个是我们的源码分析过程,具体步骤可以关注下我的公众号或者群号可以观看视频。

2、mybatis是如何获取sql语句
org.apache.ibatis.session.SqlSessionFactoryBuilder.build(java.io.InputStream)>
>org.apache.ibatis.session.SqlSessionFactoryBuilder.build(java.io.InputStream)
>org.apache.ibatis.builder.xml.XMLConfigBuilder.parse
>org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration
>org.apache.ibatis.builder.xml.XMLMapperBuilder
>org.apache.ibatis.builder.xml.XMLMapperBuilder.parse >org.apache.ibatis.builder.xml.XMLMapperBuilder.buildStatementFromContext(java.util.List<org.apache.ibatis.parsing.XNode >org.apache.ibatis.builder.xml.XMLStatementBuilder
>org.apache.ibatis.builder.MapperBuilderAssistant.addMappedStatement(java.lang.String, org.apache.ibatis.mapping.SqlSource, org.apache.ibatis.mapping.StatementType, org.apache.ibatis.mapping.SqlCommandType, java.lang.Integer, java.lang.Integer, java.lang.String, java.lang.Class<?>, java.lang.String, java.lang.Class<?>, org.apache.ibatis.mapping.ResultSetType, boolean, boolean, boolean, org.apache.ibatis.executor.keygen.KeyGenerator, java.lang.String, java.lang.String, java.lang.String, org.apache.ibatis.scripting.LanguageDriver, java.lang.String)
>org.apache.ibatis.session.Configuration.addMappedStatement
这个是我们的源码分析过程

40fead52494ba2760825476fa74daffe.png

3、mybatis是如何执行的
org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSession()>
>org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSessionFromDataSource
>org.apache.ibatis.session.defaults.DefaultSqlSession
>org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(java.lang.String, java.lang.Object)
>org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(java.lang.String, java.lang.Object, org.apache.ibatis.session.RowBounds)
>org.apache.ibatis.executor.CachingExecutor.query(org.apache.ibatis.mapping.MappedStatement, java.lang.Object, org.apache.ibatis.session.RowBounds, org.apache.ibatis.session.ResultHandler, org.apache.ibatis.cache.CacheKey, org.apache.ibatis.mapping.BoundSql)
>org.apache.ibatis.executor.BaseExecutor.queryFromDatabase
这个是我们的源码分析过程,具体步骤可以关注下我的公众号或者群号可以观看视频。

9ba8d8c155eb0c61f95a8607bfc65939.png

总结

通过mybatis的源码分析我们可以得出mybatis访问数据库确实如从,其中比较核心的几个点我列出来给大家。

288e15f48eb11ef2306d817fd41cbe80.png

bc25a8c022a6e38fc00f2ab43d42bada.png

整体认识mybatis源码包
├─annotations ->注解相关 比如select insert
├─binding -> mapper相关
├─builder ->解析xml相关
├─cache ->缓存
├─cursor -> 返回结果resultset
├─datasourcer ->数据管理
├─exceptionsr -> 异常
├─executorr -> 执行器
├─io ->classloader
├─jdbc ->jdbc
├─lang ->jdk7 jdk8
├─logging ->日志相关
├─mapping ->mapper相关的封装
├─parsing ->xml相关解析
├─plugin ->拦截器
├─reflection ->反射相关
├─scripting ->数据厂家
├─session ->sessiomn
├─transaction ->事务
└─type ->返回类型对应

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值