一、MyBatis
MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,并且改名為MyBatis 。2013年11月遷移到Github。
MyBatis是一個優(yōu)秀的持久層框架,它對jdbc的操作數(shù)據(jù)庫的過程進行封裝,使開發(fā)者只需要關注 SQL 本身,而不需要花費精力去處理例如注冊驅動、創(chuàng)建connection、創(chuàng)建statement、手動設置參數(shù)、結果集檢索等jdbc繁雜的過程代碼。
Mybatis通過xml或注解的方式將要執(zhí)行的各種statement(statement、preparedStatemnt、CallableStatement)配置起來,并通過java對象和statement中的sql進行映射生成最終執(zhí)行的sql語句,最后由mybatis框架執(zhí)行sql并將結果映射成java對象并返回。
二、使用jdbc編程問題總結
2.1 jdbc編程步驟
1、 加載數(shù)據(jù)庫驅動
2、 創(chuàng)建并獲取數(shù)據(jù)庫鏈接
3、 創(chuàng)建jdbc statement對象
4、 設置sql語句
5、 設置sql語句中的參數(shù)(使用preparedStatement)
6、 通過statement執(zhí)行sql并獲取結果
7、 對sql執(zhí)行結果進行解析處理
8、 釋放資源(resultSet、preparedstatement、connection)
2.2 jdbc問題總結如下:
1、 數(shù)據(jù)庫連接創(chuàng)建、釋放頻繁造成系統(tǒng)資源浪費,從而影響系統(tǒng)性能。如果使用數(shù)據(jù)庫連接池可解決此問題。
2、 Sql語句在代碼中硬編碼,造成代碼不易維護,實際應用中sql變化的可能較大,sql變動需要改變java代碼。
3、 使用preparedStatement向占有位符號傳參數(shù)存在硬編碼,因為sql語句的where條件不一定,可能多也可能少,修改sql還要修改代碼,系統(tǒng)不易維護。
4、 對結果集解析存在硬編碼(查詢列名),sql變化導致解析代碼變化,系統(tǒng)不易維護,如果能將數(shù)據(jù)庫記錄封裝成pojo對象解析比較方便。
三、Mybatis架構

image.png
1、 mybatis配置
SqlMapConfig.xml,此文件作為mybatis的全局配置文件,配置了mybatis的運行環(huán)境等信息。
mapper.xml文件即sql映射文件,文件中配置了操作數(shù)據(jù)庫的sql語句。此文件需要在SqlMapConfig.xml中加載。
2、 通過mybatis環(huán)境等配置信息構造SqlSessionFactory即會話工廠
3、 由會話工廠創(chuàng)建sqlSession即會話,操作數(shù)據(jù)庫需要通過sqlSession進行。
4、 mybatis底層自定義了Executor執(zhí)行器接口操作數(shù)據(jù)庫,Executor接口有兩個實現(xiàn),一個是基本執(zhí)行器、一個是緩存執(zhí)行器。
5、 Mapped Statement也是mybatis一個底層封裝對象,它包裝了mybatis配置信息及sql映射信息等。mapper.xml文件中一個sql對應一個Mapped Statement對象,sql的id即是Mapped statement的id。
6、 Mapped Statement對sql執(zhí)行輸入?yún)?shù)進行定義,包括HashMap、基本類型、pojo,Executor通過Mapped Statement在執(zhí)行sql前將輸入的java對象映射至sql中,輸入?yún)?shù)映射就是jdbc編程中對preparedStatement設置參數(shù)。
7、 Mapped Statement對sql執(zhí)行輸出結果進行定義,包括HashMap、基本類型、pojo,Executor通過Mapped Statement在執(zhí)行sql后將輸出結果映射至java對象中,輸出結果映射過程相當于jdbc編程中對結果的解析處理過程。

image.png