手写自己的MyBatis框架-Executor
到了sqlSession 的selectOne()方法,這里我們要去調(diào)用Executor 的query()方法,這個時候我們必須傳入SQL 語句和參數(shù)(根據(jù)statementId 獲取)。
問題來了:我們怎么根據(jù)StatementId 找到我們要執(zhí)行的SQL 語句呢?他們之間的綁定關(guān)系我們配置在哪里?
為了簡便,免去讀取文件流和解析XML 標簽的麻煩,我們把我們的SQL 語句放在Properties 文件里面。
我們在resources 目錄下創(chuàng)建一個mesql.properties 文件。key 就是接口全路徑+方法名稱,SQL 是我們的查詢SQL。
參數(shù)這里,因為我們要傳入一個整數(shù),所以先用一個%d 的占位符代替:
(這里直接把standalone 工程的實體類Blog 和BlogMapper 接口復(fù)制過來)
com.leon.mebatis.BlogMapper.selectBlogById=select * from blog where bid = %d這個綁定關(guān)系是放在配置類Configuration 里面的。
為了避免重復(fù)解析,我們在Configuration 創(chuàng)建一個靜態(tài)屬性和靜態(tài)方法,直接解析mesql.properties 文件里面的所有KV 鍵值對:
// Configuration.java public static final ResourceBundle sqlMappings; static{sqlMappings = ResourceBundle.getBundle("mesql"); }這樣就可以通過Configuration 拿到SQL 了。
如果SQL 語句拿不到,說明不存在映射關(guān)系(或者不是接口中定義的操作數(shù)據(jù)的方法,比如toString()),我們返回空。
// SqlSession.java public <T> T selectOne(String statement, String parameter){String sql = Configuration.sqlMappings.getString(statement);if( null != sql && !"".equals(sql)){return executor.query(sql, parameter);}return null; }SQL 語句已經(jīng)拿到了,接下來就是Executor 類的query()方法,Executor 是數(shù)據(jù)庫操作的真正執(zhí)行者。它里面應(yīng)該做什么事情?
我們干脆直接把JDBC 的代碼全部復(fù)制過來,職責(zé)先不用細分。
參數(shù)用傳入的參數(shù)替換%d 占位符,需要format 一下。
// Executor.java ResultSet rs = stmt.executeQuery(String.format(sql, paramater));最后我們把結(jié)果強轉(zhuǎn)一下。
// Executor.java return (T)blog;寫一個測試類:
// MeBatisTest.java public class MeBatisTest {public static void main(String[] args) {SqlSession sqlSession = new SqlSession();BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class);blogMapper.selectBlogById(1);} }configuration 是空的,忘記拿到Configuration 了!那么Executor 肯定也是空的。
構(gòu)造函數(shù)里面要給他們倆加上:
// SqlSession.java public SqlSession(Configuration configuration, Executor executor){this.configuration = configuration;this.executor = executor; }改一下我們的測試類(紅色是修改部分):
// MeBatisTest.java public class MeBatisTest {public static void main(String[] args) {SqlSession sqlSession = new SqlSession(new Configuration(), new Executor());BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class);blogMapper.selectBlogById(1);} }測試通過,MeBatis 1.0 的版本完成了:
Blog{bid=1, name='MyBatis 源碼分析', authorId='1001'}?
總結(jié)
以上是生活随笔為你收集整理的手写自己的MyBatis框架-Executor的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手写自己的MyBatis框架-Mappe
- 下一篇: 手写自己的MyBatis框架-1.0 的