緒論
上一篇文章中專門整理了如何構建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文件的四種格式,即標籤中內容。(小心面試官突然問到,自己懵逼中)。
再加一個彩蛋,這四種方式,默認引用的優先級是哪一種???有知道的大佬評論區留言哦。(答案請見源碼區,後面的文章小編會提到)。
- 相對於類路徑的資源引用
<!-- 使用相對於類路徑的資源引用 -->
<mappers>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
</mappers>
- 完全限定資源定位符(包括 file:/// 形式的 URL)
<!-- 使用完全限定資源定位符(URL) -->
<mappers>java
<mapper url="file:///var/mappers/BlogMapper.xml"/>
</mappers>
- 類名
<!-- 使用映射器接口實現類的完全限定類名 -->
<mappers>
<mapper class="org.mybatis.builder.BlogMapper"/>
</mappers>
- 包名
<!-- 將包內的映射器接口實現全部註冊爲映射器 -->
<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());
}
總結
準備工作已經完成,後面小編準備死磕源碼啦,也會整理出相關跟蹤源碼的過程。希望大家能夠多多支持!!!