电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

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

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

KeyWords: Mybatis 原理,源碼,Mybatis Mapper 接口實現(xiàn)類,代理模式,動態(tài)代理,Java動態(tài)代理,

Proxy.newProxyInstance,Mapper 映射,Mapper 實現(xiàn)

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

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

Mapper 接口是怎么找到實現(xiàn)類的

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

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

構(gòu)建 SqlSessionFactory ( 通過 xml 配置文件 , 或者直接編寫Java代碼) 從 SqlSessionFactory 中獲取 SqlSession 從SqlSession 中獲取 Mapper 調(diào)用 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 編碼的形式來實現(xiàn) SqlSessionFactory ,也可以使用 xml 。如果使用xml的話,上面的第一部分代碼就是這樣的:

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

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

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

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

Mapper 接口的注冊

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

configuration.addMapper(BlogMapper.class);

跟著這個 addMapper 方法的代碼實現(xiàn)是這樣的:

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

我們看到這里 mapper

標(biāo)簽: Mybatis 數(shù)據(jù)庫
相關(guān)文章:
主站蜘蛛池模板: 深圳离婚律师咨询「在线免费」华荣深圳婚姻律师事务所专办离婚纠纷案件 | 电池高低温试验箱-气态冲击箱-双层电池防爆箱|简户百科 | 青州开防盗门锁-配汽车芯片钥匙-保险箱钥匙-吉祥修锁店 | 粉末包装机,拆包机厂家,价格-上海强牛包装机械设备有限公司 | 西门子伺服控制器维修-伺服驱动放大器-828D数控机床维修-上海涌迪 | 玻璃钢板-玻璃钢防腐瓦-玻璃钢材料-广东壹诺 | 板框压滤机-隔膜压滤机-厢式压滤机生产厂家-禹州市君工机械设备有限公司 | 拉卡拉POS机官网 - 官方直营POS机办理|在线免费领取 | 沧州友城管业有限公司-内外涂塑钢管-大口径螺旋钢管-涂塑螺旋管-保温钢管生产厂家 | 安全,主动,被动,柔性,山体滑坡,sns,钢丝绳,边坡,防护网,护栏网,围栏,栏杆,栅栏,厂家 - 护栏网防护网生产厂家 | 石家庄网站建设|石家庄网站制作|石家庄小程序开发|石家庄微信开发|网站建设公司|网站制作公司|微信小程序开发|手机APP开发|软件开发 | 菲希尔FISCHER测厚仪-铁素体检测仪-上海吉馨实业发展有限公司 | 重庆LED显示屏_显示屏安装公司_重庆LED显示屏批发-彩光科技公司 重庆钣金加工厂家首页-专业定做监控电视墙_操作台 | 一级建造师培训_一建培训机构_中建云筑建造师培训网校 | ★店家乐|服装销售管理软件|服装店收银系统|内衣店鞋店进销存软件|连锁店管理软件|收银软件手机版|会员管理系统-手机版,云版,App | 不锈钢管件(不锈钢弯头,不锈钢三通,不锈钢大小头),不锈钢法兰「厂家」-浙江志通管阀 | 天品互联-北京APP开发公司-小程序开发制作-软件开发 | 英思科GTD-3000EX(美国英思科气体检测仪MX4MX6)百科-北京嘉华众信科技有限公司 | 钢格板|镀锌钢格板|热镀锌钢格板|格栅板|钢格板|钢格栅板|热浸锌钢格板|平台钢格板|镀锌钢格栅板|热镀锌钢格栅板|平台钢格栅板|不锈钢钢格栅板 - 专业钢格板厂家 | 圣才学习网-考研考证学习平台,提供万种考研考证电子书、题库、视频课程等考试资料 | 防伪溯源|防窜货|微信二维码营销|兆信_行业内领先的防伪防窜货数字化营销解决方案供应商 | 对夹式止回阀_对夹式蝶形止回阀_对夹式软密封止回阀_超薄型止回阀_不锈钢底阀-温州上炬阀门科技有限公司 | 大倾角皮带机-皮带输送机-螺旋输送机-矿用皮带输送机价格厂家-河南坤威机械 | 沉降天平_沉降粒度仪_液体比重仪-上海方瑞仪器有限公司 | 高低温试验箱-模拟高低温试验箱订制-北京普桑达仪器科技有限公司【官网】 | 船用锚链|专业锚链生产厂家|安徽亚太锚链制造有限公司 | 合肥卓创建筑装饰,专业办公室装饰、商业空间装修与设计。 | 钢化玻璃膜|手机钢化膜|钢化膜厂家|手机保护膜-【东莞市大象电子科技有限公司】 | 艺术涂料_进口艺术涂料_艺术涂料加盟_艺术涂料十大品牌 -英国蒙太奇艺术涂料 | 真空搅拌机-行星搅拌机-双行星动力混合机-广州市番禺区源创化工设备厂 | 手板-手板模型-手板厂-手板加工-生产厂家,[东莞创域模型] | 药品/药物稳定性试验考察箱-埃里森仪器设备(上海)有限公司 | 量子管通环-自清洗过滤器-全自动反冲洗过滤器-沼河浸过滤器 | Jaeaiot捷易科技-英伟达AI显卡模组/GPU整机服务器供应商 | 深圳市超时尚职业培训学校,培训:月嫂,育婴,养老,家政;化妆,美容,美发,美甲. | 蒸压釜_蒸养釜_蒸压釜厂家-山东鑫泰鑫智能装备有限公司 | 国际学校_国际学校哪个好_国际课程学校-国际学校择校网 | 便民信息网_家电维修,家电清洗,开锁换锁,本地家政公司 | 消防设施操作员考试报名时间,报名入口,报考条件 | 食品质构分析仪-氧化诱导分析仪-瞬态法导热系数仪|热冰百科 | 非小号行情 - 专业的区块链、数字藏品行情APP、金色财经官网 |