整合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