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.java
翻译成中文: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎全部的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。mysql
一、源码下载到本地 从github下载mybatis源码到idea中。 git
二、快速开始程序员
<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>
复制代码
<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>
复制代码
三、建立POJO类github
@ToString
@Getter
@Setter
public class User implements Serializable{
private Integer id;
private String username;
private Integer age;
private String phone;
private String desc;
复制代码
四、建立测试类sql
/**
* 源码学院-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的技术本质是什么 apache
从这个图来讲,咱们能够看得出mybatis是一个“gui公”,专门拉皮条的,那它为什么能作到了?我以为至少有着三个状况 缓存
经过上面咱们分析,咱们如今去看看mybatis的源码,看看是否是这样作的。bash
一、找到程序的入口
一、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 这个是咱们的源码分析过程,具体步骤能够关注下个人公众号或者群号能够观看视频。
![]()
二、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
复制代码
这个是咱们的源码分析过程,具体步骤能够关注下个人公众号或者群号能够观看视频。
三、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的内容能够关注下个人公众号