Mybatis是一個優秀的持久層框架,底層基於JDBC實現與數據庫的交互。並在JDBC操做的基礎上作了封裝和優化,它藉助靈活的SQL定製,參數及結果集的映射方式,更好的適應了當前互聯網技術的發展。Mybatis框架的簡單應用架構如圖所示:
在當今的互聯網應用中項目,mybatis框架一般會由spring框架進行資源整合,做爲數據層技術實現數據交互操做。java
第一步:建立項目module,例如:mysql
第二步:添加依賴spring
mysql 驅動依賴sql
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
spring jdbc 依賴數據庫
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId> </dependency>
mybatis starter依賴apache
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.1</version> </dependency>
第二步:application.properties 配置文件中添加簡易配置api
鏈接池配置springboot
spring.datasource.url=jdbc:mysql:///dbgoods?serverTimezone=GMT%2B8&characterEncoding=utf8 spring.datasource.username=root spring.datasource.password=root
mybatis配置session
mybatis.mapper-locations=classpath:/mapper/*/*.xml
在src/test/java目錄中添加測試類,對mybatis框架整合進行基本測試,代碼以下:mybatis
package com.cy.pj.goods.dao; import java.sql.Connection; import org.apache.ibatis.session.SqlSession; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest public class MyBatisTests { @Autowired private SqlSession sqlSession; @Test public void testGetConnection() { Connection conn=sqlSession.getConnection(); System.out.println("connection="+conn); } }
在SpringBoot腳手架工程中,Spring框架會基於MyBatis框架底層配置,建立SqlSessionFactory對象,而後再經過此工廠對象建立SqlSession,最後基於Springku框架爲測試類注入SqlSession對象,接下來,咱們能夠經過SqlSession對象實現與數據庫的會話了。
基於SpringBoot腳手架工程對MyBatis框架的整合,實現對商品庫中商品數據的查詢業務。
第一步:定義商品模塊POJO對象類型(基於此對象存儲商品數據),代碼以下:
package com.cy.pj.goods.pojo; import java.util.Date; /**用於存儲商品信息的pojo對象*/ public class Goods { private Long id; private String name; private String remark; private Date createdTime; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } public Date getCreatedTime() { return createdTime; } public void setCreatedTime(Date createdTime) { this.createdTime = createdTime; } }
第二步:定義商品模塊持久層對象GoodsDao接口及方法映射,代碼以下
GoodsDao接口及方法定義
package com.cy.pj.goods.dao; import com.cy.pj.goods.pojo.Goods; import org.apache.ibatis.annotations.Mapper; import java.util.List; /**商品模塊持久層對象,基於此對象的實現類操做商品庫中的數據 * @Mapper MyBatis框架中定義,用於描述持久層接口,告訴mybatis * 這個接口的實現類由mybatis建立,而且交給spring框架管理. * */ @Mapper public interface GoodsDao { List<Goods> findGoods(); }
GoodsDao接口映射文件及SQL映射定義
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.cy.pj.goods.dao.GoodsDao"> <select id="findGoods" resultType="com.cy.pj.goods.pojo.Goods"> select * from tb_goods </select> </mapper>
定義單元測試類,對GoodsDao方法進行單元測試,例如:
package com.cy.pj.goods.dao; @SpringBootTest public class GoodsDaoTests { @Autowired private GoodsDao goodsDao; @Test void testFindGoods(){ List<Goods> list=goodsDao.findGoods(); for(Goods g:list){ System.out.println(g); } } }
測試運行,底層API分析,如圖所示:
如今有一個業務,須要記錄數據持久層api方法調用時執行時長,如何實現?
要求:
1)咱們不能直接將日誌記錄寫到單元測試類中。
2)咱們不能修改數據持久層實現類。
基於日誌記錄業務進行API設計,如圖所示:
商品查詢並進行日誌記錄,其運行時序分析,如圖所示:
第一步:定義GoodsService接口,代碼以下:
package com.cy.pj.goods.service; import com.cy.pj.goods.pojo.Goods; import java.util.List; public interface GoodsService { List<Goods> findGoods(); }
第二步:定義GoodsServiceImpl實現類並進行日誌記錄,代碼以下:
package com.cy.pj.goods.service; import com.cy.pj.goods.dao.GoodsDao; import com.cy.pj.goods.pojo.Goods; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class GoodsServiceImpl implements GoodsService{ private static final Logger log= LoggerFactory.getLogger(GoodsServiceImpl.class); @Autowired private GoodsDao goodsDao; @Override public List<Goods> findGoods() { long t1=System.currentTimeMillis(); List<Goods> list=goodsDao.findGoods(); long t2=System.currentTimeMillis(); log.info("findGoods()->t2-t1={}",t2-t1);//日誌輸出 return list; } }
日誌API應用分析,如圖所示:
編寫單元測試類GoodsServiceTests,對GoodsService對象方法進行單元測試,例如:
package com.cy.pj.goods.service; import com.cy.pj.goods.pojo.Goods; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.List; @SpringBootTest public class GoodsServiceTests { @Autowired private GoodsService goodsService; @Test void testFindGoods(){ List<Goods> list=goodsService.findGoods(); for(Goods g:list){ System.out.println(g); } } }
本小節主要是對MyBatis框架作了一個基本介紹,而且基於springboot工程作了mybatis框架的整合實現,重點掌握其應用架構,代碼結構,編寫過程、運行過程以及在實現過程當中的問題分析和對應的解決方案。