成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

認識MyBatis-創(chuàng)新互聯(lián)

MyBatis是什么?

MyBatis是dao層(持久層)框架,它支持自定義SQL、存儲過程以及高級映射。

在南潯等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、網(wǎng)站設(shè)計 網(wǎng)站設(shè)計制作按需求定制開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)整合營銷推廣,外貿(mào)營銷網(wǎng)站建設(shè),南潯網(wǎng)站建設(shè)費用合理。

MyBatis 免除了幾乎所有的JDBC代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作。MyBatis 可以通過簡單的XML或注解來配置和映射原始類型、接口和Java POJo (Plain old java Objects,普通老式Java對象)為數(shù)據(jù)庫中的記錄。

MyBatis流行的主要原因在于它的簡單性和易使用性。在Java應(yīng)用程序中,數(shù)據(jù)持久化層涉及到的工作有:

  • 將從數(shù)據(jù)庫查詢到的數(shù)據(jù)生成所需要的Java對象
  • 將Java對象中的數(shù)據(jù)通SQL持久化到數(shù)據(jù)庫中

MyBatis通過抽象底層的JDBC代碼,自動化封裝SQL結(jié)果集產(chǎn)生Java對象、Java對象的數(shù)據(jù)持久化數(shù)據(jù)庫中的過程使得對SQL的使用變得容易

MyBatis的特點 Mybatis 的主要功能是 數(shù)據(jù)持久化
  • 消除了大量的JDBC冗余代碼
  • 能很好地與傳統(tǒng)數(shù)據(jù)庫協(xié)同工作
  • 提供了與Spring框架的集成支持
  • 提供了與第三方緩存類庫的集成支持
  • 引入了更好的性能

Mybatis的執(zhí)行原理

  1. 讀取MyBatis 配置文件mybatis-config.xml,加載數(shù)據(jù)源、事務(wù)等

    InputStream in= Resources.getResourceAsStream("mybatis-config.xml");
  2. 加載映射文件mapper.xml

  3. 定義SQL語句,在上一步的文件中加載。

  4. 創(chuàng)建會話工廠。(SqlSessionFactory)

    private static SqlSessionFactory sqlSessionFactory;  
    sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
  5. 創(chuàng)建會話(SqlSession)

    sqlSession =  sqlSessionFactory.openSession();
  6. 通過Executor 操作數(shù)據(jù)庫

  7. 輸入?yún)?shù)和輸出結(jié)果


mybatis應(yīng)用程序通過SqlSessionFactoryBuilder從mybatis-config.xml配置文件中構(gòu)建出SqlSessionFactory,然后,SqlSessionFactory的實例直接開啟一個SqlSession,再通過SqlSession實例獲得Mapper對象并運行Mapper映射的SQL語句,完成對數(shù)據(jù)庫的CRUD和事務(wù)提交,之后關(guān)閉SqlSession。

public static void main(String[] args) throws IOException {
 
        // 加載mybatis配置文件
        Reader reader = Resources.getResourceAsReader("config/configuration.xml");
      //  InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
		
        //創(chuàng)建數(shù)據(jù)工廠
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = builder.build(reader);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);

 
        // 獲取mapper接口對象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
 
        // 查詢
        User user = mapper.selectByPrimaryKey("1");

        //釋放會話
        sqlSession.clearCache();
        sqlSession.close();
    }

初始化

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);

SqlSessionFactory build方法里的XMLConfigBuilder是專門解析mybatis的配置文件的類,parser.parse()的返回值是Configuration對象,Configuration對象的結(jié)構(gòu)和xml配置文件的對象幾乎相同。

xml中的配置標(biāo)簽有哪些:

properties(屬性),settings(設(shè)置),typeAliases(類型別名),typeHandlers(類型處理器),objectFactory(對象工廠),mappers(映射器)等

讀取了xml文件各個標(biāo)簽內(nèi)容并封裝到Configuration中的屬性中。

解析xml是對把xml文件中的標(biāo)簽內(nèi)容復(fù)制到Configuration中的屬性中

SqlSession sqlSession = factory.openSession();

MappedStatement??Mybatis內(nèi)部存儲緩存

MappedStatement與Mapper配置文件中的一個select/update/insert/delete節(jié)點相對應(yīng)。

mapper中配置的等標(biāo)簽都被封裝到了此對象中,然后存儲在Configuration對象的mappedStatements屬性中,mappedStatements 是一個HashMap,key為hashCode+sqlId+Sql語句 (全限定類名 + 方法名),value為從查詢出來映射生成的java對象(MappedStatement對象)。

MapmappedStatements = new StrictMap("Mapped Statements collection")

進入 executor.query()

為本次查詢創(chuàng)建緩存的Key,進入query的重載方法中,如果?A進程在對數(shù)據(jù)庫操作的時候 B進程將sqlSession關(guān)閉了,會報throw new ExecutorException("Executor was closed.");?

如果緩存中沒有本次查找的值,那么從數(shù)據(jù)庫中查詢。

從數(shù)據(jù)庫查詢,調(diào)用查詢方法 finally localCache.removeObject(key); 清空該key的value后將再查詢結(jié)果放入緩存,

SimpleExecutor中實現(xiàn)父類的doQuery抽象方法,傳入?yún)?shù)創(chuàng)建StatementHanlder對象來執(zhí)行查詢,創(chuàng)建jdbc中的statement對象,是原生jdbc的執(zhí)行,StatementHandler進行處理 return handler.query(stmt, resultHandler);? ResultHandler對象,用于對返回的結(jié)果進行處理

動態(tài)代理——通常的Mapper接口我們都沒有實現(xiàn)的方法卻可以使用

當(dāng)判斷解析到接口時,會創(chuàng)建此接口對應(yīng)的MapperProxyFactory對象,存入HashMap中, key = 接口的字節(jié)碼對象,value = 此接口對應(yīng)的MapperProxyFactory對象。

MyBatis初始化時對接口的處理:MapperRegistry是Configuration中的一個屬性,它內(nèi)部維護一個HashMap用于存放mapper接口的工廠類MapperProxyFactory,每個接口對應(yīng)一個工廠類?

MapperMethod最終調(diào)用了執(zhí)行的方法?.execute(sqlSession, args)

?command.getType() 判斷mapper中的方法類型是insert還是delete,最終調(diào)用的還是SqlSession中的方法

此段為邊閱讀別人寫的博客邊復(fù)制的 (主要用于能夠讓自己讀得下去。。)

原文鏈接:http://t.csdn.cn/Yl3Hv


掌握MyBatis的工作原理,要結(jié)合JDBC來理解MyBatis的工作原理往往才能更透徹。我們知道,JDBC有四個核心對象:
(1)DriverManager,用于注冊數(shù)據(jù)庫連接
(2)Connection,與數(shù)據(jù)庫連接對象
(3)Statement/PrepareStatement,操作數(shù)據(jù)庫SQL語句的對象
(4)ResultSet,結(jié)果集或一張?zhí)摂M表

而MyBatis也有四大核心對象:
(1)SqlSession對象,該對象中包含了執(zhí)行SQL語句的所有方法【1】。類似于JDBC里面的Connection?【2】。
(2)Executor接口,它將根據(jù)SqlSession傳遞的參數(shù)動態(tài)地生成需要執(zhí)行的SQL語句,同時負責(zé)查詢緩存的維護。類似于JDBC里面的Statement/PrepareStatement。
(3)MappedStatement對象,該對象是對映射SQL的封裝,用于存儲要映射的SQL語句的id、參數(shù)等信息。
(4)ResultHandler對象,用于對返回的結(jié)果進行處理,最終得到自己想要的數(shù)據(jù)格式或類型??梢宰远x返回類型。

原文鏈接:http://t.csdn.cn/KlzWU

  • 通過Executor 操作數(shù)據(jù)庫

SqlSession: 是一個接口

SqlSession是MyBatis中用于和數(shù)據(jù)庫交互的頂層類,通常將它與ThreadLocal綁定,一個會話使用一個SqlSession,并且在使用完畢后需要close。

使用的實現(xiàn)類: DefaultSqlSession

Executor接口的實現(xiàn)類:

BatchExecutor(重用語句并執(zhí)行批量更新)?

SimpleExecutor(普通的執(zhí)行器,默認)

執(zhí)行sql語句的屬性: select

  1. 調(diào)用CachingExecutor的query()方法, CachingExecutor( 二級緩存) 二級緩存名: transactionalCaches HashMap

  2. 調(diào)用BaseExecutor的query()方法 BaseExcutor(一級緩存) 一級緩存: localCache HashMap

  3. 調(diào)用SimpleExecutor的doQuery()方法: 從數(shù)據(jù)庫查詢

執(zhí)行selectById selectOne()也是調(diào)用selectList() 三目運算

list.isEmpt() || list ==null ? null : list.get(0)

找cache緩存 二級再到一級

BaseExecutor是SimpleExecutor的父類 子類沒有的方法 使用的是繼承父類的方法

一級緩存沒有 才去數(shù)據(jù)庫查詢

父類沒的方法 是執(zhí)行子類重寫的方法

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

文章標(biāo)題:認識MyBatis-創(chuàng)新互聯(lián)
當(dāng)前地址:http://jinyejixie.com/article6/dhdsig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、企業(yè)網(wǎng)站制作、網(wǎng)站導(dǎo)航、外貿(mào)網(wǎng)站建設(shè)域名注冊、網(wǎng)站收錄

廣告

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

外貿(mào)網(wǎng)站制作
湘西| 东兴市| 蚌埠市| 敦化市| 静海县| 大田县| 阳新县| 鹤山市| 漯河市| 黄山市| 肥乡县| 静海县| 余庆县| 镇沅| 西宁市| 夏津县| 丹东市| 普兰县| 胶南市| 寿阳县| 鹿邑县| 闻喜县| 建瓯市| 清镇市| 南投市| 三门县| 唐河县| 十堰市| 重庆市| 印江| 绥化市| 来安县| 绥芬河市| 饶阳县| 江阴市| 盘锦市| 东乌珠穆沁旗| 建宁县| 正阳县| 昌图县| 通渭县|