您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“Mybatis整體架構及運行流程是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
Mybatis是一個持久層框架,用于數(shù)據(jù)的持久化。主要表現(xiàn)為將SQL與POJO進行一個映射,將SQL從代碼中解耦?;靖拍钊鐖D:
使用時,以User為例,UserMapper定義了findById
接口,該接口返回一個User對象,接口的實現(xiàn)為一個xml配置文件。該xml文件中定義對應接口中的實現(xiàn)所需要的SQL。從而達到將SQL與代碼解耦的目標。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.mybatis.UserMapper"> <select id="findById" parameterType="int" resultType="User"> select user_id id,user_name userName,user_age age from t_user where user_id=#{id} </select> </mapper>
MyBatis 是Apache的一個Java開源項目,是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。Mybatis可以將Sql語句配置在XML文件中,避免將Sql語句硬編碼在Java類中。
1.Mybatis通過參數(shù)映射方式,可以將參數(shù)靈活的配置在SQL語句中的配置文件中,避免在Java類中配置參數(shù)(JDBC)
2.Mybatis通過輸出映射機制,將結果集的檢索自動映射成相應的Java對象,避免對結果集手工檢索(JDBC)
3.Mybatis可以通過Xml配置文件對數(shù)據(jù)庫連接進行管理
1.SqlSessionaFactoryBuilder :該類主要用于創(chuàng)建 SqlSessionFactory, 這個類可以被實例化、使用和丟棄,一旦創(chuàng)建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 實例的最佳作用域是方法作用域(也就是局部方法變量)。
2.SqlSessionFactory :該類的作用了創(chuàng)建 SqlSession, 從名字上我們也能看出, 該類使用了工廠模式, 每次應用程序訪問數(shù)據(jù)庫, 我們就要通過 SqlSessionFactory 創(chuàng)建 SqlSession, 所以 SqlSessionFactory 和整個 Mybatis 的生命周期是相同的. 這也告訴我們不能創(chuàng)建多個同一個數(shù)據(jù)的 SqlSessionFactory, 如果創(chuàng)建多個, 會消耗盡數(shù)據(jù)庫的連接資源, 導致服務器夯機. 應當使用單例模式. 避免過多的連接被消耗, 也方便管理。
3.SqlSession :SqlSession 相當于一個會話, 每次訪問數(shù)據(jù)庫都需要這樣一個會話, 大家可能會想起了 JDBC 中的 Connection, 很類似, 但還是有區(qū)別的, 何況現(xiàn)在幾乎所有的連接都是使用的連接池技術, 用完后直接歸還而不會像 Session 一樣銷毀. 注意: 他是一個線程不安全的對象, 在設計多線程的時候我們需要特別的當心, 操作數(shù)據(jù)庫需要注意其隔離級別, 數(shù)據(jù)庫鎖等高級特性, 此外, 每次創(chuàng)建的 SqlSession 都必須及時關閉它, 它長期存在就會使數(shù)據(jù)庫連接池的活動資源減少, 對系統(tǒng)性能的影響很大, 我們一般在 finally 塊中將其關閉. 還有, SqlSession 存活于一個應用的請求和操作, 可以執(zhí)行多條 Sql, 保證事務的一致性。SqlSession在執(zhí)行過程中,有包含了幾大對象:
3.1.Executor :執(zhí)行器,由它調(diào)度 StatementHandler、ParameterHandler、ResultSetHandler 等來執(zhí)行對應的 SQL。其中 StatementHandler 是最重要的。 3.2.StatementHandler :作用是使用數(shù)據(jù)庫的 Statement(PreparedStatement)執(zhí)行操作,它是四大對象的核心,起到承上啟下的作用,許多重要的插件都是通過攔截它來實現(xiàn)的。 3.3.ParamentHandler :用來處理 SQL 參數(shù)的。 3.4.ResultSetHandler :進行數(shù)據(jù)集的封裝返回處理的。
4.Mapper :映射器是一些由你創(chuàng)建的、綁定你映射的語句的接口。映射器接口的實例是從 SqlSession 中獲得的, 他的作用是發(fā)送 SQL, 然后返回我們需要的結果. 或者執(zhí)行 SQL 從而更改數(shù)據(jù)庫的數(shù)據(jù), 因此它應該在 SqlSession 的事務方法之內(nèi), 在 Spring 管理的 Bean 中, Mapper 是單例的。
(1)API接口層:提供給外部使用的接口API,開發(fā)人員通過這些本地API來操縱數(shù)據(jù)庫。接口層一接收到調(diào)用請求就會調(diào)用數(shù)據(jù)處理層來完成具體的數(shù)據(jù)處理。
(2)數(shù)據(jù)處理層:負責具體的SQL查找、SQL解析、SQL執(zhí)行和執(zhí)行結果映射處理等。它主要的目的是根據(jù)調(diào)用的請求完成一次數(shù)據(jù)庫操作。
(3)基礎支撐層:負責最基礎的功能支撐,包括連接管理、事務管理、配置加載和緩存處理,這些都是共用的東西,將他們抽取出來作為最基礎的組件。為上層的數(shù)據(jù)處理層提供最基礎的支撐。
(1)加載配置:配置來源于兩個地方,一處是配置文件,一處是Java代碼的注解,將SQL的配置信息加載成為一個個MappedStatement對象(包括了傳入?yún)?shù)映射配置、執(zhí)行的SQL語句、結果映射配置),存儲在內(nèi)存中。
(2)SQL解析:當API接口層接收到調(diào)用請求時,會接收到傳入SQL的ID和傳入對象(可以是Map、JavaBean或者基本數(shù)據(jù)類型),Mybatis會根據(jù)SQL的ID找到對應的MappedStatement,然后根據(jù)傳入?yún)?shù)對象對MappedStatement進行解析,解析后可以得到最終要執(zhí)行的SQL語句和參數(shù)。
(3)SQL執(zhí)行:將最終得到的SQL和參數(shù)拿到數(shù)據(jù)庫進行執(zhí)行,得到操作數(shù)據(jù)庫的結果。
(4)結果映射:將操作數(shù)據(jù)庫的結果按照映射的配置進行轉(zhuǎn)換,可以轉(zhuǎn)換成HashMap、JavaBean或者基本數(shù)據(jù)類型,并將最終結果返回。
1.獲取SqlsessionFactory:根據(jù)配置文件(全局、sql映射)初始化configuration對象,
2.獲取sqlSession:創(chuàng)建一個DefaultSqlSession對象,包含Configuration及Executor(根據(jù)全局配置文件中defaultExecutorType創(chuàng)建對應的Executor)
3.獲取接口代理對象MapperProxy:DefaultSqlSession.getMapper拿到Mapper接口對應的MapperProxy
4.執(zhí)行增刪改查
1、調(diào)用DefaultSqlSession增刪改查 2、創(chuàng)建StatementHandler (同時創(chuàng)建ParameterHandler,ResultSetHandler) 3、調(diào)用StatementHandler預編譯參數(shù)以及設置參數(shù)值,使用ParameterHandler給sql設置參數(shù) 4、調(diào)用StatementHandler增刪改查 5、ResultSetHandler封裝結果
Mybatis開始逐漸流行起來,必然有其原因,簡單了解了一下它與同為持久層框架的Hibernate的異同。
映射模式
從上面的簡單概念可以知道Mybatis實際上著力點在POJO與SQL的映射。而Hibernate則主要是POJO與數(shù)據(jù)庫表的對象關系映射。前者掌控力度更細,代碼量會相對多一點,后者靈活性則差一點,更為自動化一些,與PHP里的Eloquent
屬于同類型。
性能
Mybatis基于原生JDBC,相比于對JDBC進行二次封裝的Hibernate性能會更好一點。
開發(fā)與維護
Hibernate配置好實體類后,使用起來是比較簡潔,舒服的,但是前期學習曲線比較陡,后期調(diào)優(yōu)比較麻煩。Mybatis對SQL掌控的顆粒更細一點,相比較而言看上去簡陋些。由于直接映射SQL,遷移性是個問題。mybatis新手上路
Mybatis是Apache的一個Java開源項目,是一個支持動態(tài)Sql語句的持久層框架。Mybatis可以將Sql語句配置在XML文件中,避免將Sql語句硬編碼在Java類中。與JDBC相比:
Mybatis通過參數(shù)映射方式,可以將參數(shù)靈活的配置在SQL語句中的配置文件中,避免在Java類中配置參數(shù)(JDBC)
Mybatis通過輸出映射機制,將結果集的檢索自動映射成相應的Java對象,避免對結果集手工檢索(JDBC)
Mybatis可以通過Xml配置文件對數(shù)據(jù)庫連接進行管理。
Mybatis整體構造由 數(shù)據(jù)源配置文件、Sql映射文件、會話工廠、會話、執(zhí)行器和底層封裝對象組成。
通過配置的方式將數(shù)據(jù)庫的配置信息從應用程序中獨立出來,由獨立的模塊管理和配置。Mybatis的數(shù)據(jù)源配置文件包含數(shù)據(jù)庫驅(qū)動、數(shù)據(jù)庫連接地址、用戶名密碼、事務管理等,還可以配置連接池的連接數(shù)、空閑時間等。
一個SqlMapConfig.xml基本的配置信息如下:
Mybatis中所有數(shù)據(jù)庫的操作都會基于該映射文件和配置的sql語句,在這個配置文件中可以配置任何類型的sql語句??蚣軙鶕?jù)配置文件中的參數(shù)配置,完成對sql語句以及輸入輸出參數(shù)的映射配置。
Mapper.xml配置文件大致如下:
Mybatis中會話工廠SqlSessionFactory類可以通過加載資源文件,讀取數(shù)據(jù)源配置SqlMapConfig.xml信息,從而產(chǎn)生一種可以與數(shù)據(jù)庫交互的會話實例SqlSession,會話實例SqlSession根據(jù)Mapper.xml文件中配置的sql,對數(shù)據(jù)庫進行操作。
會話工廠SqlSessionFactory通過加載資源文件獲取SqlMapConfig.xml配置文件信息,然后生成可以與數(shù)據(jù)庫交互的會話實例SqlSession。
會話實例可以根據(jù)Mapper配置文件中的Sql配置去執(zhí)行相應的增刪改查操作。
在SqlSession會話實例內(nèi)部,通過執(zhí)行器Executor對數(shù)據(jù)庫進行操作,Executor依靠封裝對象Mappered Statement,它分裝了從mapper.xml文件中讀取的信息(sql語句,參數(shù),結果集類型)。
Mybatis通過執(zhí)行器與Mappered Statement的結合實現(xiàn)與數(shù)據(jù)庫的交互。
執(zhí)行流程圖:
新建maven工程
2. 添加依賴pom.xml
4.0.0com.slmybatis-demo0.0.1-SNAPSHOT4.123.4.15.1.321.2.17junitjunit${junit.version}org.mybatismybatis${mybatis.version}mysqlmysql-connector-java${mysql.version}log4jlog4j${log4j.version}
3.編寫數(shù)據(jù)源配置文件SqlMapConfig.xml
<!—申明mapper文件 -->
4.編寫SQL映射配置文件productMapper.xml
5.編寫測試代碼TestClient.java
//使用productMapper.xml配置文件 public class TestClient { //定義會話SqlSession SqlSession session =null; @Before public void init() throws IOException { //定義mabatis全局配置文件 String resource = "SqlMapConfig.xml"; //加載mybatis全局配置文件 //InputStream inputStream = TestClient.class.getClassLoader().getResourceAsStream(resource); InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(inputStream); //根據(jù)sqlSessionFactory產(chǎn)生會話sqlsession session = factory.openSession(); } //查詢所有user表所有數(shù)據(jù) @Test public void testSelectAllUser() { String statement = "com.sl.mapper.ProductMapper.selectAllProduct"; ListlistProduct =session.selectList(statement); for(Product product:listProduct) { System.out.println(product); } //關閉會話 session.close(); } }public class Product { private int Id; private String Name; private String Description; private BigDecimal UnitPrice; private String ImageUrl; private Boolean IsNew; public int getId() { return Id; } public void setId(int id) { this.Id = id; } public String getName() { return Name; } public void setName(String name) { this.Name = name; } public String getDescription() { return Description; } public void setDescription(String description) { this.Description = description; } public BigDecimal getUnitPrice() { return UnitPrice; } public void setUnitPrice(BigDecimal unitprice) { this.UnitPrice = unitprice; } public String getImageUrl() { return Name; } public void setImageUrl(String imageurl) { this.ImageUrl = imageurl; } public boolean getIsNew() { return IsNew; } public void setIsNew(boolean isnew) { this.IsNew = isnew; } @Override public String toString() { return "Product [id=" + Id + ", Name=" + Name + ", Description=" + Description + ", UnitPrice=" + UnitPrice + ", ImageUrl=" + ImageUrl + ", IsNew=" + IsNew+ "]"; } }6.運行測試用例
“Mybatis整體架構及運行流程是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。