MyBatis is a first class persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis eliminates almost all of the JDBC code and manual setting of parameters and retrieval of results. MyBatis can use simple XML or Annotations for configuration and map primitives, Map interfaces and Java POJOs (Plain Old Java Objects) to database records.
翻译成中文:
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
1、源码下载到本地
从github下载mybatis源码到idea中。
2、快速开始
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);
log.info("user:{}", user);
} finally {
session.close();
}
}
通过刚才的demo我们可以用java》mybatis》mysql可以查询数据库想要的内容,那现在问题来了?其底层的实现原理是什么?
作为一名高级工程师或者是架构师,我们要知其然知其所以然。
那我们现在分析下mybatis的技术本质是什么
从这个图来说,我们可以看得出mybatis是一个“龟公”,专门拉皮条的,那它为何能做到了?我觉得至少有着三个情况
那这三项包含什么了?
只有mybatis知道连接那个数据库源然后执行什么sql语句,谁去执行,这三个条件达到了咱们才能把这个事情给办了。
这个就好比咱们晚上约一个妹子做拍拍的事情,完成这个事情必须是有宾馆、有女孩有TT…你懂得
通过上面我们分析,我们现在去看看mybatis的源码,看看是不是这样做的。
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
这个是我们的源码分析过程,具体步骤可以关注下我的公众号或者群号可以观看视频。
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.Listorg.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
这个是我们的源码分析过程,具体步骤可以关注下我的公众号或者群号可以观看视频。
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
这个是我们的源码分析过程,具体步骤可以关注下我的公众号或者群号可以观看视频。
通过mybatis的源码分析我们可以得出mybatis访问数据库确实如从,其中比较核心的几个点我列出来给大家。
名称 | 意义 |
---|---|
Configuration | 管理mysql-config.xml全局配置关系类 |
SqlSessionFactory | Session管理工厂接口 |
Session | SqlSession是一个面向用户的接口。提供了很多操作数据库的方法 |
Executor | 执行器是一个接口(基本执行器、缓存执行器) |
作用:SqlSession内部通过执行器操作数据库 | |
MappedStatement | 底层封装对象 |
作用:对操作数据库存储封装,包括 sql语句、输入输出参数 | |
StatementHandler | 具体操作数据库相关的handler接口 |
ResultSetHandler | 具体操作数据库返回结果的handler接口 |
├─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 ->返回类型对应
需要了解更多mybatis的内容可以关注下我的公众号
视频获取
链接:https://pan.baidu.com/s/1wMkL3PNLvcix6Pezqy2VlA
提取码:5htb