日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Mybatis Mapper接口工作原理實例解析

瀏覽:33日期:2023-10-24 11:25:10

KeyWords: Mybatis 原理,源碼,Mybatis Mapper 接口實現類,代理模式,動態代理,Java動態代理,

Proxy.newProxyInstance,Mapper 映射,Mapper 實現

MyBatis 是一款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。我們在使用 Mybaits 進行 ,通常只需要定義幾個 Mapper 接口,然后在編寫一個 xml 文件,我們在配置文件中寫好 sql , Mybatis 幫我們完成 Mapper 接口道具體實現的調用。以及將結果映射到 model bean 中。

我們在項目中所編寫的眾多的 Mapper 類只是一個接口(interface ),根據 Java 的多態性我們知道,可以使用接口接口作為形參,進而在運行時確定具體實現的對象是什么。但是,對于 Mapper 接口,我們并沒有編寫其實現類!Mybatis是如何找到其實現類,進而完成具體的 CRUD 方法調用的呢?原理何在?

Mapper 接口是怎么找到實現類的

為了弄清楚 Mapper 接口是如何找到實現類的,我們先回憶一下 Mybatis 是怎么使用的,根據實際的例子,進而一點點的去分析。這里的使用指的是Mybatis 單獨使用,而不是整合 spring , 因為整合 spring 的話,還需要涉及 Mapper dao 裝載到 spring 容器的問題,spring 幫忙創建數據源配置等問題。

通常我們使用 Mybatis 的主要步驟是:

構建 SqlSessionFactory ( 通過 xml 配置文件 , 或者直接編寫Java代碼) 從 SqlSessionFactory 中獲取 SqlSession 從SqlSession 中獲取 Mapper 調用 Mapper 的方法 ,例如:blogMapper.selectBlog(int blogId)

從一段代碼看起

上面我們概括了使用 Mybatis 的4個步驟。這4個步驟看起來很簡單,但是用代碼寫出來就很多。我們不妨先記著這4個步驟,再去看代碼,會容易點。

// 1. DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();TransactionFactory transactionFactory = new JdbcTransactionFactory();Environment environment = new Environment('development', transactionFactory, dataSource);Configuration configuration = new Configuration(environment);configuration.addMapper(BlogMapper.class);// 添加Mapper接口SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);// 2. SqlSession session = sqlSessionFactory.openSession();try { // 3. BlogMapper mapper = session.getMapper(BlogMapper.class); // 4. Blog blog = mapper.selectBlog(1);} finally { session.close();}

在這塊代碼中,第 1 部分我們使用了 Java 編碼的形式來實現 SqlSessionFactory ,也可以使用 xml 。如果使用xml的話,上面的第一部分代碼就是這樣的:

String resource = 'org/mybatis/example/mybatis-config.xml'; // xml內容就不貼了InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

我們本次的目標是弄清楚 “ Mapper 是如何找到實現類的 ”,我們注意上面代碼 3 , 4 的位置:

// 3. BlogMapper mapper = session.getMapper(BlogMapper.class); // 4. Blog blog = mapper.selectBlog(1);

這里 mapper 可以調用selectBlog(1) 這個方法,說明 mapper 是個對象,因為對象才具有方法行為實現啊。BlogMapper接口是不能實例化的,更沒有具體方法實現。我們并沒有定義一個類,讓它實現BlogMapper接口,而在這里它只是通過調用session.getMapper() 所得到的。由此,我們可以推斷:肯定是session.getMapper() 方法內部產生了BlogMapper的實現類。有什么技術可以根據BlogMapper 接口生成了一個實現類呢?想到這里,對于有動態代理 使用經驗的程序員來說,很容易想到,這背后肯定是基于動態代理技術,具體怎么實現的呢?下面我們來根據源碼一探究竟。

Mapper 接口的注冊

從上面的代碼中,我們知道 BlogMapper 接口的實現類是從session.getMapper中得來的,大概是基于動態代理技術實現。我們既然能夠從SqlSession中得到BlogMapper接口的,那么我們肯定需要先在哪里把它放進去了,然后 SqlSession 才能生成我們想要的代理類啊。上面代碼中有這么一行:

configuration.addMapper(BlogMapper.class);

跟著這個 addMapper 方法的代碼實現是這樣的:

public <T> void addMapper(Class<T> type) { mapperRegistry.addMapper(type); }

我們看到這里 mapper

標簽: Mybatis 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美在线不卡| 久久99国产精品视频| 精品国产成人| 国产极品久久久久久久久波多结野| 日本aⅴ亚洲精品中文乱码| 中文字幕亚洲影视| 国产精品日本| 丝袜a∨在线一区二区三区不卡| av亚洲免费| 国产亚洲毛片| 亚洲五月综合| 奇米亚洲欧美| 欧美精品成人| 日韩av在线播放网址| 三上亚洲一区二区| 午夜精品成人av| 极品日韩av| 激情综合在线| 久久亚洲影院| 777久久精品| 麻豆精品av| 久久夜夜操妹子| 欧美不卡视频| 美美哒免费高清在线观看视频一区二区| 亚洲免费观看高清完整版在线观| 欧美日韩18| 精品一区av| 欧美一区二区三区激情视频 | 岛国av在线网站| 福利一区二区免费视频| 日韩av福利| 国产农村妇女精品一二区| 亚洲网址在线观看| 国产精区一区二区| 成人免费网站www网站高清| 亚洲欧美日韩国产综合精品二区 | 久久精品凹凸全集| 丰满少妇一区| 激情综合自拍| 在线一区二区三区视频| 国产欧美大片| 日韩欧美一区二区三区在线观看 | 久久亚洲精品中文字幕| 欧产日产国产精品视频| 国产精品日韩| 欧美精品导航| 日韩一区二区久久| 亚洲久久在线| 91亚洲国产成人久久精品| 亚洲国产成人精品女人| 91精品在线免费视频| 日韩伦理福利| 亚洲精品中文字幕99999| 国产在线视频欧美一区| 乱人伦精品视频在线观看| 久久99蜜桃| 亚洲一区二区三区高清| 毛片不卡一区二区| 红桃视频亚洲| 精品视频亚洲| 蜜臀av在线播放一区二区三区| 麻豆一区二区三区| 欧美香蕉视频| 国产亚洲电影| 欧美福利在线| 九九九精品视频| 免费日本视频一区| 天堂√中文最新版在线| 91福利精品在线观看| 欧美69视频| 精品一区二区三区免费看| 一区二区三区四区日韩| 日韩久久电影| 国产精品国码视频| 亚洲欧美日韩精品一区二区| 国产一区二区三区天码| 亚洲精品伊人| 日韩一区欧美| 国产精品九九| 亚洲精品影视| 国内精品福利| 欧美激情另类| 国产精品乱战久久久| 午夜亚洲精品| 深夜视频一区二区| 国产高清精品二区| 亚洲一级大片| 亚洲性图久久| а√在线中文在线新版| 国产精品亚洲二区| 亚洲久久视频| 欧美日韩视频| 成人台湾亚洲精品一区二区| 欧美久久一区二区三区| 免费在线观看不卡| 日韩视频在线一区二区三区 | 日本欧美韩国一区三区| 91精品国产调教在线观看| 欧美极品中文字幕| 天堂久久一区| 久久亚洲美女| 91久久黄色| 不卡中文字幕| 亚洲先锋成人| sm捆绑调教国产免费网站在线观看| 国产精品午夜av| 91欧美精品| 久久国产精品免费一区二区三区| 亚洲人成毛片在线播放女女| 欧美午夜不卡| 久久国产中文字幕| 色老板在线视频一区二区| 中文在线а√在线8| 福利视频一区| 三上亚洲一区二区| 黑人精品一区| 国产 日韩 欧美一区| 9999国产精品| 日韩av片子| 精品国产亚洲一区二区三区在线 | 精品在线网站观看| 久久精品三级| 国产成人77亚洲精品www| 老色鬼精品视频在线观看播放| 国产欧美日韩亚洲一区二区三区| 日韩不卡在线观看日韩不卡视频| 日韩**一区毛片| 欧美中文一区| 国产精品欧美大片| 国产精品一级| 久久永久免费| 黄在线观看免费网站ktv| 久久99蜜桃| 精品视频在线你懂得| 麻豆视频在线观看免费网站黄| 日韩av免费大片| 少妇久久久久| 婷婷亚洲五月| 美女被久久久| 香蕉久久久久久| 国产探花一区在线观看| 欧美激情麻豆| 日本久久黄色| 蜜臀久久99精品久久一区二区| 欧美 日韩 国产精品免费观看| 免播放器亚洲| 奇米色欧美一区二区三区| 奇米狠狠一区二区三区| 欧美激情99| 日韩天堂在线| 久久www成人_看片免费不卡| 亚洲乱码视频| 捆绑调教美女网站视频一区| 四虎884aa成人精品最新| 激情欧美日韩一区| 免费观看日韩电影| 国产欧美大片| 欧洲在线一区| 视频一区国产视频| 国产日本亚洲| 中文在线а√在线8| 午夜电影亚洲| 免费久久99精品国产自在现线| 日韩不卡手机在线v区| 久久精品福利| 欧美特黄视频| 国产精品一区二区中文字幕| 97精品在线| 男女精品网站| 久久免费影院| 日韩视频在线一区二区三区| 欧美日本精品| 色综合www| 日本中文字幕不卡| 成年男女免费视频网站不卡| 亚洲永久字幕| 国产另类在线| 亚洲风情在线资源| 中文无码日韩欧| 美女精品视频在线| 亚洲激情欧美| 精品伊人久久久| 爽爽淫人综合网网站| 欧美国产中文高清| 在线视频免费在线观看一区二区| 国产毛片久久久| 波多野结衣一区| 麻豆免费精品视频| 亚洲综合日本| 精品久久久中文字幕| 三级在线观看一区二区| 久久精品午夜| 亚洲自啪免费| 日韩免费福利视频| 国产精品一级| 日韩在线第七页| 久久视频一区| 欧美1区2区3区| 蜜桃精品在线| 国产精品一在线观看|