中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

Mybatis整體架構(gòu)及運(yùn)行流程是什么-創(chuàng)新互聯(lián)

本篇內(nèi)容介紹了“Mybatis整體架構(gòu)及運(yùn)行流程是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

成都創(chuàng)新互聯(lián)公司,為您提供重慶網(wǎng)站建設(shè)公司、成都網(wǎng)站制作、網(wǎng)站營(yíng)銷(xiāo)推廣、網(wǎng)站開(kāi)發(fā)設(shè)計(jì),對(duì)服務(wù)輕質(zhì)隔墻板等多個(gè)行業(yè)擁有豐富的網(wǎng)站建設(shè)及推廣經(jīng)驗(yàn)。成都創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)公司成立于2013年,提供專(zhuān)業(yè)網(wǎng)站制作報(bào)價(jià)服務(wù),我們深知市場(chǎng)的競(jìng)爭(zhēng)激烈,認(rèn)真對(duì)待每位客戶(hù),為客戶(hù)提供賞心悅目的作品。 與客戶(hù)共同發(fā)展進(jìn)步,是我們永遠(yuǎn)的責(zé)任!

Mybatis是什么

Mybatis是一個(gè)持久層框架,用于數(shù)據(jù)的持久化。主要表現(xiàn)為將SQL與POJO進(jìn)行一個(gè)映射,將SQL從代碼中解耦?;靖拍钊鐖D:

Mybatis整體架構(gòu)及運(yùn)行流程是什么

使用時(shí),以User為例,UserMapper定義了findById接口,該接口返回一個(gè)User對(duì)象,接口的實(shí)現(xiàn)為一個(gè)xml配置文件。該xml文件中定義對(duì)應(yīng)接口中的實(shí)現(xiàn)所需要的SQL。從而達(dá)到將SQL與代碼解耦的目標(biāo)。

<?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的一個(gè)Java開(kāi)源項(xiàng)目,是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射。Mybatis可以將Sql語(yǔ)句配置在XML文件中,避免將Sql語(yǔ)句硬編碼在Java類(lèi)中。

特點(diǎn)

1.Mybatis通過(guò)參數(shù)映射方式,可以將參數(shù)靈活的配置在SQL語(yǔ)句中的配置文件中,避免在Java類(lèi)中配置參數(shù)(JDBC)

2.Mybatis通過(guò)輸出映射機(jī)制,將結(jié)果集的檢索自動(dòng)映射成相應(yīng)的Java對(duì)象,避免對(duì)結(jié)果集手工檢索(JDBC)

3.Mybatis可以通過(guò)Xml配置文件對(duì)數(shù)據(jù)庫(kù)連接進(jìn)行管理

核心類(lèi)介紹

1.SqlSessionaFactoryBuilder :該類(lèi)主要用于創(chuàng)建 SqlSessionFactory, 這個(gè)類(lèi)可以被實(shí)例化、使用和丟棄,一旦創(chuàng)建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 實(shí)例的最佳作用域是方法作用域(也就是局部方法變量)。

2.SqlSessionFactory :該類(lèi)的作用了創(chuàng)建 SqlSession, 從名字上我們也能看出, 該類(lèi)使用了工廠(chǎng)模式, 每次應(yīng)用程序訪(fǎng)問(wèn)數(shù)據(jù)庫(kù), 我們就要通過(guò) SqlSessionFactory 創(chuàng)建 SqlSession, 所以 SqlSessionFactory 和整個(gè) Mybatis 的生命周期是相同的. 這也告訴我們不能創(chuàng)建多個(gè)同一個(gè)數(shù)據(jù)的 SqlSessionFactory, 如果創(chuàng)建多個(gè), 會(huì)消耗盡數(shù)據(jù)庫(kù)的連接資源, 導(dǎo)致服務(wù)器夯機(jī). 應(yīng)當(dāng)使用單例模式. 避免過(guò)多的連接被消耗, 也方便管理。

3.SqlSession :SqlSession 相當(dāng)于一個(gè)會(huì)話(huà), 每次訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)都需要這樣一個(gè)會(huì)話(huà), 大家可能會(huì)想起了 JDBC 中的 Connection, 很類(lèi)似, 但還是有區(qū)別的, 何況現(xiàn)在幾乎所有的連接都是使用的連接池技術(shù), 用完后直接歸還而不會(huì)像 Session 一樣銷(xiāo)毀. 注意: 他是一個(gè)線(xiàn)程不安全的對(duì)象, 在設(shè)計(jì)多線(xiàn)程的時(shí)候我們需要特別的當(dāng)心, 操作數(shù)據(jù)庫(kù)需要注意其隔離級(jí)別, 數(shù)據(jù)庫(kù)鎖等高級(jí)特性, 此外, 每次創(chuàng)建的 SqlSession 都必須及時(shí)關(guān)閉它, 它長(zhǎng)期存在就會(huì)使數(shù)據(jù)庫(kù)連接池的活動(dòng)資源減少, 對(duì)系統(tǒng)性能的影響很大, 我們一般在 finally 塊中將其關(guān)閉. 還有, SqlSession 存活于一個(gè)應(yīng)用的請(qǐng)求和操作, 可以執(zhí)行多條 Sql, 保證事務(wù)的一致性。SqlSession在執(zhí)行過(guò)程中,有包含了幾大對(duì)象:

     3.1.Executor :執(zhí)行器,由它調(diào)度 StatementHandler、ParameterHandler、ResultSetHandler 等來(lái)執(zhí)行對(duì)應(yīng)的 SQL。其中 StatementHandler 是最重要的。
     3.2.StatementHandler :作用是使用數(shù)據(jù)庫(kù)的 Statement(PreparedStatement)執(zhí)行操作,它是四大對(duì)象的核心,起到承上啟下的作用,許多重要的插件都是通過(guò)攔截它來(lái)實(shí)現(xiàn)的。
     3.3.ParamentHandler :用來(lái)處理 SQL 參數(shù)的。
     3.4.ResultSetHandler :進(jìn)行數(shù)據(jù)集的封裝返回處理的。

4.Mapper :映射器是一些由你創(chuàng)建的、綁定你映射的語(yǔ)句的接口。映射器接口的實(shí)例是從 SqlSession 中獲得的, 他的作用是發(fā)送 SQL, 然后返回我們需要的結(jié)果. 或者執(zhí)行 SQL 從而更改數(shù)據(jù)庫(kù)的數(shù)據(jù), 因此它應(yīng)該在 SqlSession 的事務(wù)方法之內(nèi), 在 Spring 管理的 Bean 中, Mapper 是單例的。

功能架構(gòu):我們把Mybatis的功能架構(gòu)分為三層

(1)API接口層:提供給外部使用的接口API,開(kāi)發(fā)人員通過(guò)這些本地API來(lái)操縱數(shù)據(jù)庫(kù)。接口層一接收到調(diào)用請(qǐng)求就會(huì)調(diào)用數(shù)據(jù)處理層來(lái)完成具體的數(shù)據(jù)處理。

(2)數(shù)據(jù)處理層:負(fù)責(zé)具體的SQL查找、SQL解析、SQL執(zhí)行和執(zhí)行結(jié)果映射處理等。它主要的目的是根據(jù)調(diào)用的請(qǐng)求完成一次數(shù)據(jù)庫(kù)操作。

(3)基礎(chǔ)支撐層:負(fù)責(zé)最基礎(chǔ)的功能支撐,包括連接管理、事務(wù)管理、配置加載和緩存處理,這些都是共用的東西,將他們抽取出來(lái)作為最基礎(chǔ)的組件。為上層的數(shù)據(jù)處理層提供最基礎(chǔ)的支撐。

Mybatis整體架構(gòu)及運(yùn)行流程是什么

框架結(jié)構(gòu):

(1)加載配置:配置來(lái)源于兩個(gè)地方,一處是配置文件,一處是Java代碼的注解,將SQL的配置信息加載成為一個(gè)個(gè)MappedStatement對(duì)象(包括了傳入?yún)?shù)映射配置、執(zhí)行的SQL語(yǔ)句、結(jié)果映射配置),存儲(chǔ)在內(nèi)存中。

(2)SQL解析:當(dāng)API接口層接收到調(diào)用請(qǐng)求時(shí),會(huì)接收到傳入SQL的ID和傳入對(duì)象(可以是Map、JavaBean或者基本數(shù)據(jù)類(lèi)型),Mybatis會(huì)根據(jù)SQL的ID找到對(duì)應(yīng)的MappedStatement,然后根據(jù)傳入?yún)?shù)對(duì)象對(duì)MappedStatement進(jìn)行解析,解析后可以得到最終要執(zhí)行的SQL語(yǔ)句和參數(shù)。

(3)SQL執(zhí)行:將最終得到的SQL和參數(shù)拿到數(shù)據(jù)庫(kù)進(jìn)行執(zhí)行,得到操作數(shù)據(jù)庫(kù)的結(jié)果。

(4)結(jié)果映射:將操作數(shù)據(jù)庫(kù)的結(jié)果按照映射的配置進(jìn)行轉(zhuǎn)換,可以轉(zhuǎn)換成HashMap、JavaBean或者基本數(shù)據(jù)類(lèi)型,并將最終結(jié)果返回。

Mybatis整體架構(gòu)及運(yùn)行流程是什么

執(zhí)行流程:

1.獲取SqlsessionFactory:根據(jù)配置文件(全局、sql映射)初始化configuration對(duì)象,

2.獲取sqlSession:創(chuàng)建一個(gè)DefaultSqlSession對(duì)象,包含Configuration及Executor(根據(jù)全局配置文件中defaultExecutorType創(chuàng)建對(duì)應(yīng)的Executor)

3.獲取接口代理對(duì)象MapperProxy:DefaultSqlSession.getMapper拿到Mapper接口對(duì)應(yīng)的MapperProxy

4.執(zhí)行增刪改查

 1、調(diào)用DefaultSqlSession增刪改查
 2、創(chuàng)建StatementHandler (同時(shí)創(chuàng)建ParameterHandler,ResultSetHandler)
 3、調(diào)用StatementHandler預(yù)編譯參數(shù)以及設(shè)置參數(shù)值,使用ParameterHandler給sql設(shè)置參數(shù)
 4、調(diào)用StatementHandler增刪改查
 5、ResultSetHandler封裝結(jié)果

Mybatis整體架構(gòu)及運(yùn)行流程是什么

與Hibernate的異同

Mybatis開(kāi)始逐漸流行起來(lái),必然有其原因,簡(jiǎn)單了解了一下它與同為持久層框架的Hibernate的異同。

  • 映射模式
    從上面的簡(jiǎn)單概念可以知道Mybatis實(shí)際上著力點(diǎn)在POJO與SQL的映射。而Hibernate則主要是POJO與數(shù)據(jù)庫(kù)表的對(duì)象關(guān)系映射。前者掌控力度更細(xì),代碼量會(huì)相對(duì)多一點(diǎn),后者靈活性則差一點(diǎn),更為自動(dòng)化一些,與PHP里的Eloquent屬于同類(lèi)型。

  • 性能
    Mybatis基于原生JDBC,相比于對(duì)JDBC進(jìn)行二次封裝的Hibernate性能會(huì)更好一點(diǎn)。

  • 開(kāi)發(fā)與維護(hù)
    Hibernate配置好實(shí)體類(lèi)后,使用起來(lái)是比較簡(jiǎn)潔,舒服的,但是前期學(xué)習(xí)曲線(xiàn)比較陡,后期調(diào)優(yōu)比較麻煩。Mybatis對(duì)SQL掌控的顆粒更細(xì)一點(diǎn),相比較而言看上去簡(jiǎn)陋些。由于直接映射SQL,遷移性是個(gè)問(wèn)題。mybatis新手上路

MyBatis簡(jiǎn)介

Mybatis是Apache的一個(gè)Java開(kāi)源項(xiàng)目,是一個(gè)支持動(dòng)態(tài)Sql語(yǔ)句的持久層框架。Mybatis可以將Sql語(yǔ)句配置在XML文件中,避免將Sql語(yǔ)句硬編碼在Java類(lèi)中。與JDBC相比:

  1. Mybatis通過(guò)參數(shù)映射方式,可以將參數(shù)靈活的配置在SQL語(yǔ)句中的配置文件中,避免在Java類(lèi)中配置參數(shù)(JDBC)

  2. Mybatis通過(guò)輸出映射機(jī)制,將結(jié)果集的檢索自動(dòng)映射成相應(yīng)的Java對(duì)象,避免對(duì)結(jié)果集手工檢索(JDBC)

  3. Mybatis可以通過(guò)Xml配置文件對(duì)數(shù)據(jù)庫(kù)連接進(jìn)行管理。

MyBatis整體架構(gòu)及運(yùn)行流程

Mybatis整體構(gòu)造由 數(shù)據(jù)源配置文件、Sql映射文件、會(huì)話(huà)工廠(chǎng)、會(huì)話(huà)、執(zhí)行器和底層封裝對(duì)象組成。

1.數(shù)據(jù)源配置文件

通過(guò)配置的方式將數(shù)據(jù)庫(kù)的配置信息從應(yīng)用程序中獨(dú)立出來(lái),由獨(dú)立的模塊管理和配置。Mybatis的數(shù)據(jù)源配置文件包含數(shù)據(jù)庫(kù)驅(qū)動(dòng)、數(shù)據(jù)庫(kù)連接地址、用戶(hù)名密碼、事務(wù)管理等,還可以配置連接池的連接數(shù)、空閑時(shí)間等。

一個(gè)SqlMapConfig.xml基本的配置信息如下:


2.Sql映射文件

Mybatis中所有數(shù)據(jù)庫(kù)的操作都會(huì)基于該映射文件和配置的sql語(yǔ)句,在這個(gè)配置文件中可以配置任何類(lèi)型的sql語(yǔ)句??蚣軙?huì)根據(jù)配置文件中的參數(shù)配置,完成對(duì)sql語(yǔ)句以及輸入輸出參數(shù)的映射配置。

Mapper.xml配置文件大致如下:


3.會(huì)話(huà)工廠(chǎng)與會(huì)話(huà)

Mybatis中會(huì)話(huà)工廠(chǎng)SqlSessionFactory類(lèi)可以通過(guò)加載資源文件,讀取數(shù)據(jù)源配置SqlMapConfig.xml信息,從而產(chǎn)生一種可以與數(shù)據(jù)庫(kù)交互的會(huì)話(huà)實(shí)例SqlSession,會(huì)話(huà)實(shí)例SqlSession根據(jù)Mapper.xml文件中配置的sql,對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作。

4.運(yùn)行流程

會(huì)話(huà)工廠(chǎng)SqlSessionFactory通過(guò)加載資源文件獲取SqlMapConfig.xml配置文件信息,然后生成可以與數(shù)據(jù)庫(kù)交互的會(huì)話(huà)實(shí)例SqlSession。

會(huì)話(huà)實(shí)例可以根據(jù)Mapper配置文件中的Sql配置去執(zhí)行相應(yīng)的增刪改查操作。

在SqlSession會(huì)話(huà)實(shí)例內(nèi)部,通過(guò)執(zhí)行器Executor對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,Executor依靠封裝對(duì)象Mappered Statement,它分裝了從mapper.xml文件中讀取的信息(sql語(yǔ)句,參數(shù),結(jié)果集類(lèi)型)。

Mybatis通過(guò)執(zhí)行器與Mappered Statement的結(jié)合實(shí)現(xiàn)與數(shù)據(jù)庫(kù)的交互。

執(zhí)行流程圖:

Mybatis整體架構(gòu)及運(yùn)行流程是什么

測(cè)試工程搭建

  1. 新建maven工程

Mybatis整體架構(gòu)及運(yùn)行流程是什么

2. 添加依賴(lài)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.編寫(xiě)數(shù)據(jù)源配置文件SqlMapConfig.xml

<!—申明mapper文件 --&gt

4.編寫(xiě)SQL映射配置文件productMapper.xml

Mybatis整體架構(gòu)及運(yùn)行流程是什么


5.編寫(xiě)測(cè)試代碼TestClient.java

//使用productMapper.xml配置文件
public class TestClient { //定義會(huì)話(huà)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)生會(huì)話(huà)sqlsession
        session = factory.openSession();    
    } //查詢(xún)所有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);
        } //關(guān)閉會(huì)話(huà)
 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.運(yùn)行測(cè)試用例

“Mybatis整體架構(gòu)及運(yùn)行流程是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

分享名稱(chēng):Mybatis整體架構(gòu)及運(yùn)行流程是什么-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)鏈接:http://m.rwnh.cn/article22/dggecc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開(kāi)發(fā)、外貿(mào)建站、自適應(yīng)網(wǎng)站、服務(wù)器托管域名注冊(cè)、定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管
乐陵市| 吉木萨尔县| 通辽市| 阜城县| 朝阳市| 万山特区| 会宁县| 浦县| 桂阳县| 绥芬河市| 林西县| 疏勒县| 渭南市| 鄄城县| 台南县| 定南县| 汽车| 沛县| 灌南县| 松滋市| 彰化县| 昌吉市| 盐山县| 利津县| 南京市| 新乐市| 视频| 沽源县| 和田县| 枣强县| 寻乌县| 宜君县| 灯塔市| 芜湖县| 玉屏| 临城县| 大兴区| 布尔津县| 卢龙县| 姚安县| 望谟县|