国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

瀏覽:5日期:2022-08-09 18:29:00
目錄持久層的那些事什么是 JDBCJDBC 原理什么是 MybatisMybatis 與 JDBC 的關(guān)系SqlSessionSqlSessionFactorySqlSessionFactoryBuilderConfigurationMappedStatementExecutorParameterHandlerStatementHandlerResultSetHandlerInterceptorMybatis 關(guān)鍵詞說(shuō)明Mybatis 架構(gòu)設(shè)計(jì)基礎(chǔ)支持層反射模塊類型轉(zhuǎn)換日志模塊資源加載解析器模塊核心處理層問(wèn)題答疑Mybatis 中分頁(yè)如何實(shí)現(xiàn)SQL 分頁(yè)攔截器分頁(yè)總結(jié)持久層的那些事什么是 JDBC

JDBC(JavaDataBase Connectivity)就是 Java 數(shù)據(jù)庫(kù)連接, 說(shuō)的直白點(diǎn)就是 使用 Java 語(yǔ)言操作數(shù)據(jù)庫(kù)

本來(lái)我們是通過(guò)控制臺(tái)或客戶端操作的數(shù)據(jù)庫(kù), JDBC 是用 Java 語(yǔ)言來(lái)發(fā)送 SQL 語(yǔ)句

JDBC 原理

最初 SUN 公司希望提供一套 能夠適用所有數(shù)據(jù)庫(kù)的 API, 但是在實(shí)際操作中卻發(fā)現(xiàn)這是項(xiàng)基本不可能完成的任務(wù)

因?yàn)楦鱾€(gè)廠商所提供的 數(shù)據(jù)庫(kù)差異實(shí)在太大, 所以 SUN 公司與數(shù)據(jù)庫(kù)廠商討論出的就是:由 SUN 公司提供出一套訪問(wèn)數(shù)據(jù)庫(kù)的規(guī)范 API, 并提供相對(duì)應(yīng)的連接數(shù)據(jù)庫(kù)協(xié)議標(biāo)準(zhǔn), 然后各廠商根據(jù)規(guī)范提供一套訪問(wèn)自家數(shù)據(jù)庫(kù)的 API 接口

最終:SUN 公司提供的規(guī)范 API 稱之為 JDBC, 各廠商提供的自家數(shù)據(jù)庫(kù) API 接口稱之為 驅(qū)動(dòng)

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

什么是 Mybatis

Mybatis 是一款優(yōu)秀的 ORM(持久層)框架,使用 Java 語(yǔ)言 編寫前身是 apache 的一個(gè)開源項(xiàng)目 iBatis,2010 年遷移到 google code 并正式改名為 Mybatis ORM 持久層 指的是 : 將業(yè)務(wù)數(shù)據(jù)存儲(chǔ)到磁盤,也具備長(zhǎng)期存儲(chǔ)能力,只要磁盤不損壞,如果在斷電情況下,重啟系統(tǒng)仍然可以讀取數(shù)據(jù)

Mybatis 與 JDBC 的關(guān)系

在沒(méi)有持久層框架之前, 想要代碼中操作數(shù)據(jù)庫(kù)都必須通過(guò) JDBC 來(lái)操作, 接下來(lái)一個(gè)例子來(lái)說(shuō)明兩者之間的關(guān)系

JDBC 操作數(shù)據(jù)庫(kù)

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

相信大家都在實(shí)際項(xiàng)目中使用過(guò) Mybatis, 可以聯(lián)想一下, 平常我們工作中, 是否做過(guò)以下事情:

是否裝載過(guò)數(shù)據(jù)庫(kù)驅(qū)動(dòng)? 是否從驅(qū)動(dòng)中獲取數(shù)據(jù)庫(kù)連接? 是否創(chuàng)建過(guò)執(zhí)行 SQL 的 Statement? 是否自行將數(shù)據(jù)庫(kù)返回結(jié)果轉(zhuǎn)換成 Java 對(duì)象? 是否關(guān)閉過(guò) finally 塊中的三個(gè)對(duì)象?

看到上面的靈魂拷問(wèn), 就可以對(duì)本次分享的第一個(gè)問(wèn)題作出解答:

Mybatis 針對(duì) JDBC 中重復(fù)操作做了封裝, 同時(shí)擴(kuò)展并優(yōu)化部分功能

Mybatis 關(guān)鍵詞說(shuō)明

📖 如果在閱讀文章前沒(méi)有接觸過(guò) Mybatis 源碼相關(guān)的內(nèi)容, 建議將下述名詞多看幾遍再向下閱讀

SqlSession

負(fù)責(zé)執(zhí)行 select、insert、update、delete 等命令, 同時(shí)負(fù)責(zé)獲取映射器和管理事務(wù); 其底層封裝了與 JDBC 的交互, 可以說(shuō)是 mybatis 最核心的接口之一

SqlSessionFactory

負(fù)責(zé)創(chuàng)建 SqlSession 的工廠, 一旦被創(chuàng)建就應(yīng)該在應(yīng)用運(yùn)行期間一直存在, 不需要額外再進(jìn)行創(chuàng)建

SqlSessionFactoryBuilder

主要是負(fù)責(zé)創(chuàng)建 SqlSessionFactory 的構(gòu)造器類, 其中使用到了構(gòu)建者設(shè)計(jì)模式; 僅負(fù)責(zé)創(chuàng)建 SqlSessionFactory

Configuration

Mybatis 最重要的配置類, 沒(méi)有之一, 存儲(chǔ)了大量的對(duì)象配置, 可以看源碼感受一下

MappedStatement

MappedStatement 是保存 SQL 語(yǔ)句的數(shù)據(jù)結(jié)構(gòu), 其中的類屬性都是由解析 .xml 文件中的 SQL 標(biāo)簽轉(zhuǎn)化而成

Executor

SqlSession 對(duì)象對(duì)應(yīng)一個(gè) Executor, Executor 對(duì)象作用于 增刪改查方法 以及 事務(wù)、緩存 等操作

ParameterHandler

Mybatis 中的 參數(shù)處理器, 類關(guān)系比較簡(jiǎn)單

StatementHandler

StatementHandler 是 Mybatis 負(fù)責(zé) 創(chuàng)建 Statement 的處理器, 根據(jù)不同的業(yè)務(wù)創(chuàng)建不同功能的 Statement

ResultSetHandler

ResultSetHandler 是 Mybatis 負(fù)責(zé)將 JDBC 返回?cái)?shù)據(jù)進(jìn)行解析, 并包裝為 Java 中對(duì)應(yīng)數(shù)據(jù)結(jié)構(gòu)的處理器

Interceptor

Interceptor 為 Mybatis 中定義公共攔截器的接口, 其中定義了相關(guān)實(shí)現(xiàn)方法

Mybatis 架構(gòu)設(shè)計(jì)

架構(gòu)圖

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

基礎(chǔ)支持層反射模塊

反射在 Java 中的應(yīng)用可以說(shuō)是相當(dāng)廣泛了, 同時(shí)也是一把雙刃劍。 Mybatis 框架本身 封裝出了反射模塊, 提供了比原生反射更 簡(jiǎn)潔易用的 API 接口, 以及對(duì) 類的元數(shù)據(jù)增加緩存, 提高反射的性能

類型轉(zhuǎn)換

類型轉(zhuǎn)換模塊最重要的功能就是在為 SQL 語(yǔ)句綁定實(shí)參時(shí), 將 Java 類型轉(zhuǎn)為 JDBC 類型, 在映射結(jié)果集時(shí)再由 JDBC 類型轉(zhuǎn)為 Java 類型

另外一個(gè)功能就是提供別名機(jī)制, 簡(jiǎn)化了配置文件的定義

日志模塊

日志對(duì)于系統(tǒng)的作用不言而喻, 尤其是測(cè)試、生產(chǎn)環(huán)境上查看信息及排查錯(cuò)誤等都非常重要。主流的日志框架包括 Log4j、Log4j2、S l f4j 等, Mybatis 的日志模塊作用就是 集成這些日志框架

資源加載

Mybatis 對(duì)類加載器進(jìn)行了封裝, 用來(lái)確定類加載器的使用順序, 用來(lái)記載類文件以及其它資源文件, 感興趣可以參考 ClassLoaderWrapper

解析器模塊

解析器模塊主要提供了兩個(gè)功能, 一個(gè)是封裝了 XPath 類, 在 Mybatis 初始化時(shí)解析 Mybatis-config.xml 配置文件以及映射配置文件提供功能, 另一點(diǎn)就是處理動(dòng)態(tài) SQL 語(yǔ)句的占位符提供幫助

核心處理層

配置解析

在 Mybatis 初始化時(shí), 會(huì)加載 Mybatis-config.xml 文件中的配置信息, 解析后的配置信息會(huì) 轉(zhuǎn)換成 Java 對(duì)象添加到 Configuration 對(duì)象

📖 比如說(shuō)在 .xml 中定義的 resultMap 標(biāo)簽, 會(huì)被解析為 ResultMap 對(duì)象

SQL 解析

大家如果手動(dòng)拼寫過(guò)復(fù)雜 SQL 語(yǔ)句, 就會(huì)明白會(huì)有多痛苦。Mybatis 提供出了動(dòng)態(tài) SQL, 加入了許多判斷循環(huán)型標(biāo)簽, 比如 : if、where、foreach、set 等, 幫助開發(fā)者節(jié)約了大量的 SQL 拼寫時(shí)間 SQL 解析模塊的作用就是將 Mybatis 提供的動(dòng)態(tài) SQL 標(biāo)簽解析為帶占位符的 SQL 語(yǔ)句, 并在后期將實(shí)參對(duì)占位符進(jìn)行替換

SQL 執(zhí)行

SQL 的執(zhí)行過(guò)程涉及幾個(gè)比較重要的對(duì)象, Executor、StatementHandler、ParameterHandler、ResultSetHandler

Executor負(fù)責(zé)維護(hù) 一級(jí)、二級(jí)緩存以及事務(wù)提交回滾操作, 舉個(gè)查詢的例子, 查詢請(qǐng)求會(huì)由 Executor 交給 StatementHandler 完成

StatementHandler 通過(guò)ParameterHandler完成SQL語(yǔ)句的實(shí)參綁定, 通過(guò)java.sql.Statement執(zhí)行 SQL語(yǔ)句并拿到對(duì)應(yīng)的 結(jié)果集映射

最后交由 ResultSetHandler 對(duì)結(jié)果集進(jìn)行解析, 將 JDBC 類型轉(zhuǎn)換為程序自定義的對(duì)象

插件

插件模塊是 Mybatis 提供的一層擴(kuò)展, 可以針對(duì) SQL 執(zhí)行的四大對(duì)象進(jìn)行 攔截并執(zhí)行自定義插件插件編寫需要很熟悉 Mybatis 運(yùn)行機(jī)制, 這樣才能控制編寫的插件安全、高效

接口層

接口層只是 Mybatis 提供給調(diào)用端的一個(gè)接口 SqlSession, 調(diào)用端在進(jìn)行調(diào)用接口中方法時(shí), 會(huì)調(diào)用核心處理層相對(duì)應(yīng)的模塊來(lái)完成數(shù)據(jù)庫(kù)操作

問(wèn)題答疑

.xml 文件定義 Sql 語(yǔ)句如何解析

Mybatis 在創(chuàng)建 SqlSessionFactory 時(shí), XMLConfigBuilder 會(huì)解析 Mybatis-config.xml 配置文件

Mybatis 相關(guān)解析器

Mybatis 解析器模塊中定義了相關(guān)解析器的抽象類 BaseBuilder, 不同的子類負(fù)責(zé)實(shí)現(xiàn)解析不同的功能, 使用了 Builder 設(shè)計(jì)模式

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

XMLConfigBuilder 負(fù)責(zé)解析 mybatis-config.xml 配置文件

XMLMapperBuilder 負(fù)責(zé)解析業(yè)務(wù)產(chǎn)生的 xxxMapper.xml

mybatis-config.xml 解析

XMLConfigBuilder 解析 mybatis-config.xml 內(nèi)容參考代碼 :

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

XMLConfifigBuilder#parseConfiguration()方法將 mybatis-config.xml中定義的標(biāo)簽進(jìn)行相關(guān)解析并填充到Configuration對(duì)象中

xxxMapper.xml 解析

XMLConfifigBuilder#mapperElement()中解析配置的 mappers 標(biāo)簽, 找到具體的.xml文件, 并將其中的select、insert、update、delete、resultMap 等標(biāo)簽解析為 Java 中的對(duì)象信息具體解析 xxxMapper.xml 的對(duì)象為 XMLMapperBuilder, 具體的解析方法為parse()

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

Mybatis創(chuàng)建 SqlSessionFactory 會(huì)解析mybatis-config.xml, 然后 解析configuration 標(biāo)簽下的子標(biāo)簽, 解析 mappers 標(biāo)簽時(shí), 會(huì)根據(jù)相關(guān)配置讀取到 .xml 文件, 繼而解析 .xml中各個(gè)標(biāo)簽具體的 select、insert、update、delete 標(biāo)簽定義為 MappedStatement對(duì)象, .xml文件中的其余標(biāo)簽也會(huì)根據(jù)不同映射解析為 Java 對(duì)象

MappedStatement

這里重點(diǎn)說(shuō)明下 MappedStatement 對(duì)象, 一起看一下類中的屬性和 SQL 有何關(guān)聯(lián)呢

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

MappedStatement 對(duì)象中 提供的屬性與 .xml 文件中定義的 SQL 語(yǔ)句 是能夠?qū)?yīng)上的, 用來(lái) 控制每條 SQL 語(yǔ)句的執(zhí)行行為

Mapper 接口的存儲(chǔ)與實(shí)現(xiàn)

在平常我們寫的 SSM 框架中, 定義了 Mapper 接口與 .xml 對(duì)應(yīng)的 SQL 文件, 在 Service 層直接注入 xxxMapper 就可以了

也沒(méi)有看到像 JDBC 操作數(shù)據(jù)庫(kù)的操作, Mybatis 在中間是如何為我們省略下這些重復(fù)繁瑣的操作呢

這里使用 Mybatis 源碼中的測(cè)試類進(jìn)行驗(yàn)證, 首先定義 Mapper 接口, 省事直接注解定義 SQL

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

這里使用 SqlSession 來(lái)獲取 Mapper 操作數(shù)據(jù)庫(kù), 測(cè)試方法如下

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

創(chuàng)建 SqlSession

#1 從 SqlSessionFactory 中打開一個(gè) 新的 SqlSession

獲取 Mapper 實(shí)例

#2 就存在一個(gè)疑問(wèn)點(diǎn), 定義的 AutoConstructorMapper 明明是個(gè)接口, 為什么可以實(shí)例化為對(duì)象?

動(dòng)態(tài)代理方法調(diào)用

#3 通過(guò)創(chuàng)建的對(duì)象調(diào)用類中具體的方法, 這里具體聊一下 #2 操作

SqlSession 是一個(gè)接口, 有一個(gè) 默認(rèn)的實(shí)現(xiàn)類 DefaultSqlSession, 類中包含了 Configuration 屬性

Mapper 接口的信息以及 .xml 中SQL語(yǔ)句是在Mybatis初始化時(shí)添加 到 Configuration 的 MapperRegistry 屬性中的

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

#2中的 getMapper 就是從 MapperRegistry 中獲取 Mapper

看一下 MapperRegistry 的類屬性都有什么

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

config 為 保持全局唯一 的 Configuration 對(duì)象引用

knownMappers 中 Key-Class 是 Mapper 對(duì)象, Value-MapperProxyFactory 是通過(guò) Mapper 對(duì)象衍生出的 Mapper 代理工廠

再看一下 MapperProxyFactory 類的結(jié)構(gòu)信息

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

mapperInterface 屬性是 Mapper 對(duì)象的引用, methodCache 的 key 是 Mapper 中的方法, value 是 Mapper 解析對(duì)應(yīng) SQL 產(chǎn)生的 MapperMethod

📖 Mybatis 設(shè)計(jì) methodCache 屬性時(shí)使用到了 懶加載機(jī)制, 在初始化時(shí)不會(huì)增加對(duì)應(yīng) Method, 而是在 第一次調(diào)用時(shí)新增

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

MapperMethod 運(yùn)行時(shí)數(shù)據(jù)如下, 比較容易理解

通過(guò)一個(gè)實(shí)際例子幫忙理解一下 MapperRegistry 類關(guān)系, Mapper 初始化第一次調(diào)用的對(duì)象狀態(tài), 可以看到 methodCache 容量為0

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

我們目前已經(jīng)知道 MapperRegistry的類關(guān)系, 回頭繼續(xù)看一下第二步的 MapperRegistry#getMapper() 處理步驟

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

核心處理在 MapperProxyFactory#newInstance()方法中, 繼續(xù)跟進(jìn)

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

MapperProxy繼承了 InvocationHandler 接口, 通過(guò) newInstance() 最終返回的是由 Java Proxy 動(dòng)態(tài)代理返回的動(dòng)態(tài)代理實(shí)現(xiàn)類

看到這里就清楚了步驟二中接口為什么能夠被實(shí)例化, 返回的是 接口的動(dòng)態(tài)代理實(shí)現(xiàn)類

Mybatis Sql 的執(zhí)行過(guò)程

根據(jù) Mybatis SQL 執(zhí)行流程圖進(jìn)一步了解

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

大致可以分為以下幾步操作:

📖 在前面的內(nèi)容中, 知道了Mybatis Mapper 是動(dòng)態(tài)代理的實(shí)現(xiàn), 查看 SQL 執(zhí)行過(guò)程, 就需要緊跟實(shí)現(xiàn)InvocationHandler 的MapperProxy類

執(zhí)行增刪改查

@Select(' SELECT * FROM SUBJECT WHERE ID = #{id}')PrimitiveSubject getSubject(@Param('id') final int id);

我們以上述方法舉例, 調(diào)用方通過(guò) SqlSession 獲取Mapper動(dòng)態(tài)代理對(duì)象, 執(zhí)行Mapper方法時(shí)會(huì)通過(guò)InvocationHandler進(jìn)行代理

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

在MapperMethod#execute 中, 根據(jù) MapperMethod -> SqlCommand -> SqlCommandType 來(lái)確定增、刪、改、查方法

📖 SqlCommandType 是一個(gè)枚舉類型, 對(duì)應(yīng)五種類型 UNKNOWN、INSERT、UPDATE、DELETE、SELECT、FLUSH

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

參數(shù)處理

查詢操作對(duì)應(yīng) SELECT 枚舉值, if else 中判斷為返回值是否集合、無(wú)返回值、單條查詢等, 這里以查詢單條記錄作為入口

Object param = method.convertArgsToSqlCommandParam(args);result = sqlSession.selectOne(command.getName(), param);

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

📖 這里能夠解釋一個(gè)之前困擾我的問(wèn)題, 那就是為什么方法入?yún)⒅挥袉蝹€(gè) @Param('id'), 但是參數(shù) param 對(duì)象會(huì)存在兩個(gè)鍵值對(duì)

繼續(xù)查看 SqlSession#selectOne 方法, sqlSession 是一個(gè)接口, 具體還是要看實(shí)現(xiàn)類 DefaultSqlSession

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

因?yàn)閱螚l和查詢多條以及分頁(yè)查詢都是走的一個(gè)方法, 所以在查詢的過(guò)程中, 會(huì)將分頁(yè)的參數(shù)進(jìn)行添加

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

執(zhí)行器處理

在 Mybatis 源碼中, 創(chuàng)建的執(zhí)行器默認(rèn)是 CachingExecutor, 使用了裝飾者模式, 在類中保持了 Executor 接口的引用, CachingExecutor 在持有的執(zhí)行器基礎(chǔ)上增加了緩存的功能

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

delegate.query 就是在具體的執(zhí)行器了, 默認(rèn) SimpleExecutor, query 方法統(tǒng)一在抽象父類 BaseExecutor 中維護(hù)

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

BaseExecutor#queryFromDatabase 方法執(zhí)行了緩存占位符以及執(zhí)行具體方法, 并將查詢返回?cái)?shù)據(jù)添加至緩存

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

BaseExecutor#doQuery 方法是由具體的 SimpleExecutor 實(shí)現(xiàn)

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

執(zhí)行 SQL

因?yàn)槲覀?SQL 中使用了參數(shù)占位符, 使用的是 PreparedStatementHandler 對(duì)象, 執(zhí)行預(yù)編譯SQL的 Handler, 實(shí)際使用 PreparedStatement 進(jìn)行 SQL 調(diào)用

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

返回?cái)?shù)據(jù)解析

將 JDBC 返回類型轉(zhuǎn)換為 Java 類型, 根據(jù) resultSets 和 resultMap 進(jìn)行轉(zhuǎn)換

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

Mybatis 中分頁(yè)如何實(shí)現(xiàn)

通過(guò) Mybatis 執(zhí)行分頁(yè) SQL 有兩種實(shí)現(xiàn)方式, 一種是編寫 SQL 時(shí)添加 LIMIT, 一種是全局處理

SQL 分頁(yè)

<select resultMap='resultAutoMap'> SELECT * FROM SUBJECT LIMIT #{CURRINDEX} , #{PAGESIZE}</select>攔截器分頁(yè)

上文說(shuō)到, Mybatis 支持了插件擴(kuò)展機(jī)制, 可以攔截到具體對(duì)象的方法以及對(duì)應(yīng)入?yún)⒓?jí)別

我們添加插件時(shí)需要實(shí)現(xiàn)Interceptor 接口, 然后將插件寫在 mybatis-config.xml 配置文件中或者添加相關(guān)注解, Mybatis 初始化時(shí)解析才能在項(xiàng)目啟動(dòng)時(shí)添加到插件容器中

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

由一個(gè) List 結(jié)構(gòu)存儲(chǔ)項(xiàng)目中全部攔截器, 通過(guò)Configuration#addInterceptor 方法添加

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

重點(diǎn)需要關(guān)注 Interceptor#pluginAll 中 plugin 方法, Interceptor 只是一個(gè)接口, plugin 方法只能由其實(shí)現(xiàn)類完成

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

Plugin 可以理解為是一個(gè)工具類, Plugin#wrap 返回的是一個(gè)動(dòng)態(tài)代理類

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

這里使用一個(gè)測(cè)試的 Demo 看一下方法運(yùn)行時(shí)的參數(shù)

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

雖然是隨便寫的 Demo, 但是與正式使用的插件并無(wú)實(shí)際區(qū)別

一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注好吧啦網(wǎng)的更多內(nèi)容!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 成人18免费软件 | 亚洲精品一区二区久久 | 91久久青青草原线免费 | 久青草免费在线视频 | 亚洲国产精品一区二区三区在线观看 | 亚洲偷自拍另类图片二区 | 日本a级片免费观看 | 久久综合狠狠综合久久97色 | 毛片免费观看久久欧美 | 国产农村乱 | 中文字幕有码视频 | 中文字幕一区二区视频 | 97se亚洲综合在线韩国专区福利 | 欧美久久久久久久一区二区三区 | 日韩欧美一级毛片视频免费 | 一级毛片在线不卡直接观看 | 亚洲撸 | 99国产在线观看 | 色午夜在线 | 国产一级黄色 | 欧美一级亚洲一级 | 欧美成人四级hd版 | 亚洲一区二区三区福利在线 | 一级毛片情侣 | 欧美一级片免费 | 亚洲三级在线免费观看 | 国产一级特黄一级毛片 | 国产三级观看 | 91久久精品一区二区三区 | 一级视频在线免费观看 | 久久久久久亚洲精品影院 | 在线观看欧洲成人免费视频 | 大量愉拍情侣在线视频 | 亚洲男人天| 狠色狠狠色狠狠狠色综合久久 | 国产高清在线精品一区a | 白嫩美女一级毛片免费看 | 波多野结衣在线免费视频 | 综合另类| 日本三级毛片 | 在线a毛片免费视频观看 |