本文目錄一覽:
- 1、MyBatis解析
- 2、什麼是mybatis框架
- 3、javaweb 怎麼創建 mybatis
- 4、如何編寫Java的MyBatis框架中SQL語句映射部分
- 5、java 怎麼使用註解操作mybatis
MyBatis解析
從命名上可以看出,這個是一個 Builder 模式的,用於創建 SqlSessionFactory 的類。SqlSessionFactoryBuilder 根據配置來構造 SqlSessionFactory。其中配置方式有兩種:
mybatis-config.xml 就是我們的配置文件:
Java Config 相比較 XML 文件的方式而言,會有一些限制。比如修改了配置文件需要重新編譯,註解方式沒有 XML 配置項多等。所以,業界大多數情況下是選擇 XML 文件的方式。但到底選擇哪種方式,這個要取決與自己團隊的需要。比如,項目的 SQL 語句不複雜,也不需要一些高級的 SQL 特性,那麼 Java Config 則會更加簡潔一點;反之,則可以選擇 XML 文件的方式。
創建配置文件解析器XMLConfigBuilder
解析mybatis-config.xml里的配置為Configuration對象,Mybatis的全局配置對象。
XMLConfigBuilder#parseConfiguration解析mapper下的xml
XMLMapperBuilder#bindMapperForNamespace,根據xml里的 namespace 反射出 mapper介面 的 class,如果有mapper介面,則把該mapper介面的class添加到Configuration的mapperRegistry里。
如果該介面已經註冊,則拋出已經綁定的異常。
為該介面註冊MapperProxyFactory,但這裡只是註冊其創建MapperProxy的工廠,並不是創建MapperProxy。
如果Mapper對應的xml資源未載入,觸發xml的綁定操作,將xml中的sql語句與Mapper建立關係。
addMapper方法,只是為**Mapper創建對應對應的MapperProxyFactory。
根據Mapper介面與SqlSession創建MapperProxy對象。
根據介面類獲取MapperProxyFactory。
調用MapperProxyFactory的newInstance創建MapperProxy對象。
SqlSessionFactory 顧名思義,是用於生產 SqlSession 的工廠。 通過如下的方式來獲取 SqlSession 實例:
SqlSession 包含了執行 SQL 的所有的方法。以下是示例:
當然,下面的方式可以做到類型安全:
MapperProxy是MapperProxyFactory使用SqlSession創建出來的。所以MapperProxy中包含SqlSession。
可以看到MapperProxy調用invoke方法,進而調用MapperMethod的execute(),這些MapperMethod就是和你要執行的命令相關,比如執行select語句,則會通過SqlSession的select()方法,最終調用到Executor的query方法。Executor會再協調另外三個核心組件。
MapperProxy:
MapperMethod:
插件的構建:
談原理首先要知道StatementHandler,ParameterHandler,Result Handler都是代理,他們是Configuration創建,在創建過程中會調用interceptorChain.pluginAll()方法,為四大組件組裝插件(再底層是通過Plugin.wrap(target,XX, new Plugin( interceptor))來來創建的)。
插件鏈是何時構建的:
在執行SqlSession的query或者update方法時,SqlSession會通過Configuration創建Executor代理,在創建過程中就調用interceptor的pluginAll方法組裝插件。然後executor在調用doQuery()方法的時候,也會調用Configuration的newStatementHandler方法創建StatemenHandler(和上面描述的一樣,這個handler就是個代理,也是通過interceptorChain的pluginAll方法構建插件)
插件如何執行:
以statementhandler的prepare方法的插件為例,正如前面所說,statementhandler是一個proxy,執行他的prepare方法,將調用invokeHandler的invoke方法,而invokeHandler就是Plugin.wrap(target, xxx, new Plugin(interceptor))中的第三個參數,所以很自然invokeHanlder的invoke的方法最終就會調用interceptor對象的intercept方法。
Mybatis的插件配置在configuration內部,初始化時,會讀取這些插件,保存於Configuration對象的InterceptorChain中。
org.apache.ibatis.plugin.InterceptorChain.java源碼。
上面的for循環代表了只要是插件,都會以責任鏈的方式逐一執行,所謂插件,其實就類似於攔截器。
插件的編寫
插件必須實現org.apache.ibatis.plugin.Interceptor介面。
-intercept()方法:執行攔截內容的地方,攔截目標對象的目標方法的執行
-plugin()方法:決定是否觸發intercept()方法。 作用:包裝目標對象,包裝就是為目標對象創建一個代理對象
-setProperties()方法:給自定義的攔截器傳遞xml配置的屬性參數。將插件註冊時的property屬性設置進來
下面自定義一個攔截器:
為什麼要寫Annotation註解?註解都是什麼含義?
Mybatis規定插件必須編寫Annotation註解,是必須,而不是可選。@Intercepts註解:裝載一個@Signature列表,一個@Signature其實就是一個需要攔截的方法封裝。那麼,一個攔截器要攔截多個方法,自然就是一個@Signature列表。
type = Executor.class, method = “query”, args = { MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class }
解釋:要攔截Executor介面內的query()方法,參數類型為args列表。
Plugin.wrap(target, this)是幹什麼的?
使用JDK的動態代理,給target對象創建一個delegate代理對象,以此來實現方法攔截和增強功能,它會回調intercept()方法。
Mybatis可以攔截哪些介面對象?
Mybatis只能攔截ParameterHandler、ResultSetHandler、StatementHandler、Executor共4個介面對象內的方法。
重新審視interceptorChain.pluginAll()方法:該方法在創建上述4個介面對象時調用,其含義為給這些介面對象註冊攔截器功能,注意是註冊,而不是執行攔截。
攔截器執行時機:plugin()方法註冊攔截器後,那麼,在執行上述4個介面對象內的具體方法時,就會自動觸發攔截器的執行,也就是插件的執行。
Invocation
可以通過invocation來獲取攔截的目標方法,以及執行目標方法。
分頁插件原理
由於Mybatis採用的是邏輯分頁,而非物理分頁,那麼,市場上就出現了可以實現物理分頁的Mybatis的分頁插件。 要實現物理分頁,就需要對String sql進行攔截並增強,Mybatis通過BoundSql對象存儲String sql,而BoundSql則由StatementHandler對象獲取。
因此,就需要編寫一個針對StatementHandler的query方法攔截器,然後獲取到sql,對sql進行重寫增強。
什麼是mybatis框架
MyBatis 是一款優秀的持久層框架,它支持定製化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和映射原生信息,將介面和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java對象)映射成資料庫中的記錄。
背景
MyBatis 是支持普通 SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis 消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis 使用簡單的 XML或註解用於配置和原始映射,將介面和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java對象)映射成資料庫中的記錄。
每個MyBatis應用程序主要都是使用SqlSessionFactory實例的,一個SqlSessionFactory實例可以通過SqlSessionFactoryBuilder獲得。SqlSessionFactoryBuilder可以從一個xml配置文件或者一個預定義的配置類的實例獲得。
用xml文件構建SqlSessionFactory實例是非常簡單的事情。推薦在這個配置中使用類路徑資源(classpath resource),但你可以使用任何Reader實例,包括用文件路徑或file://開頭的url創建的實例。MyBatis有一個實用類—-Resources,它有很多方法,可以方便地從類路徑及其它位置載入資源。
特點
簡單易學:本身就很小且簡單。沒有任何第三方依賴,最簡單安裝只要兩個jar文件+配置幾個sql映射文件易於學習,易於使用,通過文檔和源代碼,可以比較完全的掌握它的設計思路和實現。
靈活:mybatis不會對應用程序或者資料庫的現有設計強加任何影響。 sql寫在xml里,便於統一管理和優化。通過sql語句可以滿足操作資料庫的所有需求。
解除sql與程序代碼的耦合:通過提供DAO層,將業務邏輯和數據訪問邏輯分離,使系統的設計更清晰,更易維護,更易單元測試。sql和代碼的分離,提高了可維護性。
提供映射標籤,支持對象與資料庫的orm欄位關係映射
提供對象關係映射標籤,支持對象關係組建維護
提供xml標籤,支持編寫動態sql。
javaweb 怎麼創建 mybatis
新建mysql資料庫連接,並且創建表
創建好資料庫後,建一個普通的web project,然後在項目名下,建立兩個文件夾,其中src_user存放類,介面,xml,及映射文件,test_src存放測試類。
在src_user下建立包
在src_user目錄下,建立一個configuration.xml(名字自設,可不一樣),用來存放連接資料庫的欄位,以及一些映射文件。
在com.yihaomen.mybatis.model下,建立一個User.xml用來與資料庫進行數據之間的聯繫,並且,在User.xml進行配置如下,同時,要在Configuration.xml進行User.xml的映射
進行Test.java的測試
如何編寫Java的MyBatis框架中SQL語句映射部分
1..增刪改查、參數、緩存
1.1
select
舉例如下:
查詢學員信息,一個String參數,參數標識為#{studentID},並返回一個StudentEntity類型的對象
select
id=”getStudent”
parameterType=”String”
resultMap=”studentResultMap”
SELECT
ST.STUDENT_ID,
ST.STUDENT_NAME,
ST.STUDENT_SEX,
ST.STUDENT_BIRTHDAY,
ST.CLASS_ID
FROM
STUDENT_TBL
ST
WHERE
ST.STUDENT_ID
=
#{studentID}
/select
1.2
insert
舉例如下:
插入數據,一個String參數,參數標識為#{studentID},並返回一個StudentEntity類型的對象。
insert
id=”insertStudent”
parameterType=”StudentEntity”
INSERT
INTO
STUDENT_TBL
(STUDENT_ID,
STUDENT_NAME,
STUDENT_SEX,
STUDENT_BIRTHDAY,
CLASS_ID)
VALUES
(#{studentID},
#{studentName},
#{studentSex},
#{studentBirthday},
#{classEntity.classID})
/insert
1.3
update
舉例如下:
更新學員信息
update
id=”updateStudent”
parameterType=”StudentEntity”
UPDATE
STUDENT_TBL
SET
STUDENT_TBL.STUDENT_NAME
=
#{studentName},
STUDENT_TBL.STUDENT_SEX
=
#{studentSex},
STUDENT_TBL.STUDENT_BIRTHDAY
=
#{studentBirthday},
STUDENT_TBL.CLASS_ID
=
#{classEntity.classID}
WHERE
STUDENT_TBL.STUDENT_ID
=
#{studentID};
/update
1.4
delete
舉例如下:
刪除學員信息:
delete
id=”deleteStudent”
parameterType=”StudentEntity”
DELETE
FROM
STUDENT_TBL
WHERE
STUDENT_ID
=
#{studentID}
/delete
2.ResultMap
SQL映射xml文件是為了放置所有sql語句,需要定義一個workspace,正常是介面類的路徑。SQL語句映射文件寫好後,需要在MyBatis配置文件mappers標籤中引用。
舉例如下:
mappers
mapper
resource=”cn/tedu/ninixie/manager/data/mappers/UserMapper.xml”
/
mapper
resource=”cn/tedu/ninixie/manager/data/mappers/StudentMapper.xml”
/
mapper
resource=”cn/tedu/ninixie/manager/data/mappers/ClassMapper.xml”
/
mapper
resource=”cn/tedu/ninixie/manager/data/mappers/TeacherMapper.xml”
/
/mappers
當Java介面與xml文件在一個相對路徑下,那麼MyBaits配置文件的napper中可以不用聲明。
ResultMaps的作用,就是簡單的語句而不需要多餘的結果映射,更多複雜的語句,除了只要一些絕對必須的語句描述關係以外,就不需要其它的了。
resultMap屬性:type為java實體類;id為此resultMap的標識。
resultMap可以設置的映射:
2.1
constructor:用來將結果發射給一個實例化好的類的構造器
idArg_ID
參數:將結果集標記為ID,為了方便全局調用
arg
–反射到構造器的通常結果
2.2
id結果,將結果集標記為ID,為了方便全局調用
2.3
result:反射到JavaBean的普通結果
2.4
association:複雜類型的結合,多個結果合成的類型
2.5
collection:複雜類型結合
2.6
resultMap的集合,也可以引用到其他
2.7
discriminator:使用一個結果值為了決定使用哪個結果集。
java 怎麼使用註解操作mybatis
mybatis是orm框架 java操作它就是執行sql, 貌似沒有用註解的吧。 最多就是 事務控制, 可以spring AOP 找一個cut point 全局設定 或者 @Transactional 這個也要在spring文件裡面配置 網上有例子。 mybatis的話 直接config文件裡面 mapping一些 mapper 然後做resultMap 直接寫mybatis標準的可執行sql就ok了 用sqlsessiontemplate 直接調用就好了。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/312887.html