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的內容能夠關注下個人公衆號