Mybatis源碼本地化構建Demo

緒論

上一篇文章中專門整理了如何構建Mybatis源碼,小夥伴們可以在本地寫demo跟蹤或者註釋修改源碼等等騷操作。。。本篇就是爲小夥伴們介紹一下如何本地化構建demo。
這裏分享一下mybatis的中文官方文檔,小編構建本地化demo時參考了官方文檔

構建

首先,創建一個package,命名爲demo。小編先貼出自己本地化目錄。
在這裏插入圖片描述

SQL

數據庫中創建blog表,並在model包下生成對應實體類Blog;

DROP TABLE IF EXISTS `blog`;
CREATE TABLE `blog` (
  `id` int(11) NOT NULL,
  `title` varchar(255) DEFAULT NULL,
  `author` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

配置文件

mybatis-config.xml文件主要包含對mybatis的全局配置:數據庫配置數據源連接、事務管理器和作用域等,並且深深影響 MyBatis 行爲的設置和屬性信息。具體結構如下:

- configuration(配置)
	- properties(屬性) 
	- settings(設置)
	- typeAliases(類型別名)
	- typeHandlers(類型處理器)
	- objectFactory(對象工廠)
	- plugins(插件)
	- environments(環境配置)
		- environment(環境變量)
			- transactionManager(事務管理器)
			- dataSource(數據源)
	- databaseIdProvider(數據庫廠商標識)
	- mappers(映射器)

說明:1. 從上圖中可以看出,configuration 元素是整個 XML 配置文件的根節點,其角色就相當於是 MyBatis 的總管, MyBatis 所有的配置信息都會存放在它裏面。 MyBatis 還提供了設置這些配置信息的方法。 Configuration 可從配置文件裏獲取屬性值,也可以通過程序直接設置。Configuration 可供配置的內容如下。
2. mybatis-config.xml 文件的元素節點是有一定順序的,節點位置若不按順序排位,那麼 XML 文件會報錯。爲什麼會報錯呢???這裏小編以爲是源碼執行順序解析自上向下,所以順序不能改變。如果想改變順序,可以對源碼進行一波操作。
以下是小編的mybatis-config.xml配置:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeAliases>
        <typeAlias type="org.apache.ibatis.demo.model.Blog" alias="Blog"/>
    </typeAliases>

    <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://127.0.0.1:3306/stream-source"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="org/apache/ibatis/demo/BlogMapper.xml"/>
        <!--使用全限定類名-->
        <!--<package name="org.apache.ibatis.demo.mapper"/>-->
        <!-- <mapper class="org.apache.ibatis.demo.mapper.BlogMapper"/>-->
    </mappers>
</configuration>

注意點:這裏着重提一下引用Mapper.xml文件的四種格式,即標籤中內容。(小心面試官突然問到,自己懵逼中)。
再加一個彩蛋,這四種方式,默認引用的優先級是哪一種???有知道的大佬評論區留言哦。(答案請見源碼區,後面的文章小編會提到)。

  1. 相對於類路徑的資源引用
<!-- 使用相對於類路徑的資源引用 -->
<mappers>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
</mappers>
  1. 完全限定資源定位符(包括 file:/// 形式的 URL)
<!-- 使用完全限定資源定位符(URL) -->
<mappers>java
  <mapper url="file:///var/mappers/BlogMapper.xml"/>
</mappers>
  1. 類名
<!-- 使用映射器接口實現類的完全限定類名 -->
<mappers>
  <mapper class="org.mybatis.builder.BlogMapper"/>
</mappers>
  1. 包名
<!-- 將包內的映射器接口實現全部註冊爲映射器 -->
<mappers>
  <package name="org.mybatis.builder"/>
</mappers>

映射文件

xxxMapper.xml映射文件中定義了操作數據庫的sql,每個sql是一個statement,映射文件是mybatis的核心。Mapper映射文件是一個xml格式文件,必須遵循相應的dtd文件規範,如ibatis-3-mapper.dtd。
SQL 映射文件只有很少的幾個頂級元素(按照應被定義的順序列出):

cache – 該命名空間的緩存配置。
cache-ref – 引用其它命名空間的緩存配置。
resultMap – 描述如何從數據庫結果集中加載對象,是最複雜也是最強大的元素。
parameterMap – 老式風格的參數映射。此元素已被廢棄,並可能在將來被移除!
sql – 可被其它語句引用的可重用語句塊。
insert – 映射插入語句。
update – 映射更新語句。
delete – 映射刪除語句。
select – 映射查詢語句。

Mapper映射文件是以作爲根節點,在根節點中支持9個元素,分別爲 cache、cache-ref、resultMap、parameterMap、sql;insert、update、delete、select;
小編映射文件如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.apache.ibatis.demo.mapper.BlogMapper">
    <select id="selectBlog" resultType="Blog">
    select * from Blog where id = #{id}
  </select>
</mapper>

注意:這裏小編並未定義出resultMap、SQL等標籤,此文只是爲了搭建demo示例,後面跟蹤源碼時,會依次定義。有需要的夥伴自行定義。

Application

進入主啓動類:

 public static void main(String[] args) throws IOException {
        String resource = "org/apache/ibatis/demo/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //解析XML核心配置、映射文件,sql語句;註冊Mapper
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        SqlSession session = sqlSessionFactory.openSession();
        //底層採用JDK動態代理創建Mapper接口對象
        BlogMapper mapper = session.getMapper(BlogMapper.class);
        //jdbc交互
        Blog blog = mapper.selectBlog(1);
        System.out.println(blog.getAuthor());

//        Blog blog = session.selectOne("org.apache.ibatis.demo.mapper.BlogMapper.selectBlog", 1);
//        System.out.println(blog.toString());

    }

總結

準備工作已經完成,後面小編準備死磕源碼啦,也會整理出相關跟蹤源碼的過程。希望大家能夠多多支持!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章