干貨來襲!Spring整合Mybatis框架扒磁,看完秒懂

整合MyBatis的初步分析

概述

Mybatis是一個優(yōu)秀的持久層框架庆揪,底層基于JDBC實現(xiàn)與數(shù)據(jù)庫的交互。并在JDBC操作的基礎(chǔ)上做了封裝和優(yōu)化妨托,它借助靈活的SQL定制缸榛,參數(shù)及結(jié)果集的映射方式,更好的適應(yīng)了當(dāng)前互聯(lián)網(wǎng)技術(shù)的發(fā)展兰伤。Mybatis框架的簡單應(yīng)用架構(gòu)如圖所示:


在當(dāng)今的互聯(lián)網(wǎng)應(yīng)用中項目内颗,mybatis框架通常會由spring框架進(jìn)行資源整合,作為數(shù)據(jù)層技術(shù)實現(xiàn)數(shù)據(jù)交互操作敦腔。

準(zhǔn)備工作

第一步:創(chuàng)建項目module,例如:

第二步:添加依賴

mysql 驅(qū)動依賴

mysqlmysql-connector-javaruntime

spring jdbc 依賴

org.springframework.bootspring-boot-starter-data-jdbc

mybatis starter依賴

org.mybatis.spring.bootmybatis-spring-boot-starter2.1.1

第三步:application.properties 配置文件中添加簡易配置

連接池配置

spring.datasource.url=jdbc:mysql:///dbgoods?serverTimezone=GMT%2B8&characterEncoding=utf8spring.datasource.username=rootspring.datasource.password=root

mybatis配置

mybatis.mapper-locations=classpath:/mapper/*/*.xml

環(huán)境測試代碼實現(xiàn)

在src/test/java目錄中添加測試類均澳,對mybatis框架整合進(jìn)行基本測試,代碼如下:

packagecom.cy.pj.goods.dao;importjava.sql.Connection;importorg.apache.ibatis.session.SqlSession;importorg.junit.jupiter.api.Test;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;@SpringBootTestpublicclassMyBatisTests{@AutowiredprivateSqlSession sqlSession;@TestpublicvoidtestGetConnection(){? ? ? ? ? Connection conn=sqlSession.getConnection();? ? ? ? ? System.out.println("connection="+conn);? ? ? }}

在SpringBoot腳手架工程中,Spring框架會基于MyBatis框架底層配置找前,創(chuàng)建SqlSessionFactory對象糟袁,然后再通過此工廠對象創(chuàng)建SqlSession,最后基于Springku框架為測試類注入SqlSession對象躺盛,接下來项戴,我們可以通過SqlSession對象實現(xiàn)與數(shù)據(jù)庫的會話了。

整合MyBatis業(yè)務(wù)代碼實現(xiàn)及原理分析

業(yè)務(wù)描述

基于SpringBoot腳手架工程對MyBatis框架的整合槽惫,實現(xiàn)對商品庫中商品數(shù)據(jù)的查詢業(yè)務(wù)周叮。

API架構(gòu)設(shè)計

業(yè)務(wù)時序圖分析

業(yè)務(wù)代碼設(shè)計及實現(xiàn)

第一步:定義商品模塊POJO對象類型(基于此對象存儲商品數(shù)據(jù)),代碼如下:

package com.cy.pj.goods.pojo;importjava.util.Date;/**用于存儲商品信息的pojo對象*/publicclassGoods{privateLong id;privateString name;privateString remark;privateDate createdTime;publicLonggetId(){returnid;? ? }publicvoidsetId(Long id){this.id = id;? ? }publicStringgetName(){returnname;? ? }publicvoidsetName(String name){this.name = name;? ? }publicStringgetRemark(){returnremark;? ? }publicvoidsetRemark(String remark){this.remark = remark;? ? }publicDategetCreatedTime(){returncreatedTime;? ? }publicvoidsetCreatedTime(Date createdTime){this.createdTime = createdTime;? ? }}

第二步:定義商品模塊持久層對象GoodsDao接口及方法映射,代碼如下

GoodsDao接口及方法定義

packagecom.cy.pj.goods.dao;importcom.cy.pj.goods.pojo.Goods;importorg.apache.ibatis.annotations.Mapper;importjava.util.List;/**商品模塊持久層對象,基于此對象的實現(xiàn)類操作商品庫中的數(shù)據(jù)

* @Mapper MyBatis框架中定義,用于描述持久層接口,告訴mybatis

* 這個接口的實現(xiàn)類由mybatis創(chuàng)建,并且交給spring框架管理.

* */@Mapperpublic interface GoodsDao {ListfindGoods();}

GoodsDao接口映射文件及SQL映射定義

<?xml version="1.0" encoding="UTF-8" ?>select * from tb_goods

測試代碼的編寫及運行

定義單元測試類,對GoodsDao方法進(jìn)行單元測試,例如:

packagecom.cy.pj.goods.dao;@SpringBootTestpublicclassGoodsDaoTests{@AutowiredprivateGoodsDao goodsDao;@TestvoidtestFindGoods(){? ? ? ? List list=goodsDao.findGoods();for(Goods g:list){? ? ? ? ? ? System.out.println(g);? ? ? ? }? ? }}

測試運行,底層API分析界斜,如圖所示:

測試運行過程中的BUG分析

idea中@autowired注解錯誤提示配置,如圖:

BindingException,如圖所示:

單元測試類位置錯誤仿耽,如圖所示:

找不到對應(yīng)的映射元素,如圖所示:

業(yè)務(wù)層記錄MyBatis底層SQL會話時長

業(yè)務(wù)描述

現(xiàn)在有一個業(yè)務(wù)锄蹂,需要記錄數(shù)據(jù)持久層api方法調(diào)用時執(zhí)行時長氓仲,如何實現(xiàn)?

要求:

1)我們不能直接將日志記錄寫到單元測試類中得糜。

2)我們不能修改數(shù)據(jù)持久層實現(xiàn)類敬扛。

API架構(gòu)設(shè)計

基于日志記錄業(yè)務(wù)進(jìn)行API設(shè)計,如圖所示:

業(yè)務(wù)時序圖分析

商品查詢并進(jìn)行日志記錄朝抖,其運行時序分析啥箭,如圖所示:

業(yè)務(wù)代碼設(shè)計及實現(xiàn)

第一步:定義GoodsService接口,代碼如下:

packagecom.cy.pj.goods.service;importcom.cy.pj.goods.pojo.Goods;importjava.util.List;publicinterfaceGoodsService{ListfindGoods();}

第二步:定義GoodsServiceImpl實現(xiàn)類并進(jìn)行日志記錄治宣,代碼如下:

packagecom.cy.pj.goods.service;importcom.cy.pj.goods.dao.GoodsDao;importcom.cy.pj.goods.pojo.Goods;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importjava.util.List;@ServicepublicclassGoodsServiceImplimplementsGoodsService{privatestaticfinalLogger log=? ? LoggerFactory.getLogger(GoodsServiceImpl.class);@AutowiredprivateGoodsDao goodsDao;@OverridepublicListfindGoods(){longt1=System.currentTimeMillis();? ? ? ? List list=goodsDao.findGoods();longt2=System.currentTimeMillis();? ? ? ? log.info("findGoods()->t2-t1={}",t2-t1);//日志輸出returnlist;? ? }}

日志API應(yīng)用分析急侥,如圖所示:

測試代碼的編寫及運行

編寫單元測試類GoodsServiceTests,對GoodsService對象方法進(jìn)行單元測試侮邀,例如:

packagecom.cy.pj.goods.service;importcom.cy.pj.goods.pojo.Goods;importorg.junit.jupiter.api.Test;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;importjava.util.List;@SpringBootTestpublicclassGoodsServiceTests{@AutowiredprivateGoodsService goodsService;@TestvoidtestFindGoods(){? ? ? ? List list=goodsService.findGoods();for(Goods g:list){? ? ? ? ? ? System.out.println(g);? ? ? ? }? ? }}

測試運行過程中的BUG分析

NullPointerException坏怪,如圖所示:

NoSuchBeanDefinitionException,如圖所示:


總結(jié)(Summary)

本小節(jié)主要是對MyBatis框架做了一個基本介紹,并且基于springboot工程做了mybatis框架的整合實現(xiàn)绊茧,重點掌握其應(yīng)用架構(gòu)铝宵,代碼結(jié)構(gòu),編寫過程华畏、運行過程以及在實現(xiàn)過程中的問題分析和對應(yīng)的解決方案鹏秋。

原文鏈接:https://www.toutiao.com/a6926055790948270604/?log_from=b1d37ed62d1cc_1641283467143

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市亡笑,隨后出現(xiàn)的幾起案子侣夷,更是在濱河造成了極大的恐慌,老刑警劉巖仑乌,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件百拓,死亡現(xiàn)場離奇詭異琴锭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)耐版,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門祠够,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人粪牲,你說我怎么就攤上這事古瓤。” “怎么了腺阳?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵落君,是天一觀的道長。 經(jīng)常有香客問我亭引,道長绎速,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任焙蚓,我火速辦了婚禮纹冤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘购公。我一直安慰自己萌京,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布宏浩。 她就那樣靜靜地躺著知残,像睡著了一般。 火紅的嫁衣襯著肌膚如雪比庄。 梳的紋絲不亂的頭發(fā)上求妹,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機(jī)與錄音佳窑,去河邊找鬼制恍。 笑死,一個胖子當(dāng)著我的面吹牛神凑,可吹牛的內(nèi)容都是我干的吧趣。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼耙厚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了岔霸?” 一聲冷哼從身側(cè)響起薛躬,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呆细,沒想到半個月后型宝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體八匠,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年趴酣,在試婚紗的時候發(fā)現(xiàn)自己被綠了梨树。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡岖寞,死狀恐怖抡四,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情仗谆,我是刑警寧澤指巡,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站隶垮,受9級特大地震影響藻雪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜狸吞,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一勉耀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蹋偏,春花似錦便斥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至字逗,卻和暖如春京郑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背葫掉。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工些举, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人俭厚。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓户魏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親挪挤。 傳聞我的和親對象是個殘疾皇子叼丑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容