日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

手写自己的MyBatis框架-Executor

發(fā)布時(shí)間:2024/4/13 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 手写自己的MyBatis框架-Executor 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

到了sqlSession 的selectOne()方法,這里我們要去調(diào)用Executor 的query()方法,這個(gè)時(shí)候我們必須傳入SQL 語句和參數(shù)(根據(jù)statementId 獲取)。

問題來了:我們怎么根據(jù)StatementId 找到我們要執(zhí)行的SQL 語句呢?他們之間的綁定關(guān)系我們配置在哪里?

為了簡便,免去讀取文件流和解析XML 標(biāo)簽的麻煩,我們把我們的SQL 語句放在Properties 文件里面。

我們在resources 目錄下創(chuàng)建一個(gè)mesql.properties 文件。key 就是接口全路徑+方法名稱,SQL 是我們的查詢SQL。

參數(shù)這里,因?yàn)槲覀円獋魅胍粋€(gè)整數(shù),所以先用一個(gè)%d 的占位符代替:

(這里直接把standalone 工程的實(shí)體類Blog 和BlogMapper 接口復(fù)制過來)

com.leon.mebatis.BlogMapper.selectBlogById=select * from blog where bid = %d

這個(gè)綁定關(guān)系是放在配置類Configuration 里面的。

為了避免重復(fù)解析,我們在Configuration 創(chuàng)建一個(gè)靜態(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é)先不用細(xì)分。

參數(shù)用傳入的參數(shù)替換%d 占位符,需要format 一下。

// Executor.java ResultSet rs = stmt.executeQuery(String.format(sql, paramater));

最后我們把結(jié)果強(qiáng)轉(zhuǎn)一下。

// Executor.java return (T)blog;

寫一個(gè)測試類:

// 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。