java編寫生成mybatis(自動生成java代碼)

本文目錄一覽:

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-06 15:17
下一篇 2025-01-06 15:17

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Python字元串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字元串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字元串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python基礎代碼用法介紹

    本文將從多個方面對Python基礎代碼進行解析和詳細闡述,力求讓讀者深刻理解Python基礎代碼。通過本文的學習,相信大家對Python的學習和應用會更加輕鬆和高效。 一、變數和數…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29

發表回復

登錄後才能評論