首頁 > 軟體

SpringBoot整合Mybatis與druid實現流程詳解

2022-10-26 14:02:48

SpringBoot整合junit

SpringBoot整合junit

①還是一樣,我們首先建立一個SpringBoot模組。

由於我們並不測試前端,而只是整合junit,所以不用選擇模板,選擇其中的web即可。

完成以後我們開啟Pom.xml,會發現報錯,這裡我的版本不能到2.7.5,降版本。

②匯入對應的starter

檢視Pom.xml檔案:我們發現已經有了一個Spring-Boot-stater-test,這其實就是SpringBoot已經自己整合了junit

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>SpringBoot-juint</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringBoot-juint</name>
    <description>SpringBoot-juint</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

問題隨之而來,既然SpringBoot已經整合了junit,那我們還整合啥?答案是不用整合!

因為SpringBoot專案在建立的時候已經預設整合了junit,至於為什麼是這樣,是因為SpringBoot是一個maven專案,而maven在執行它的生命週期的時候測試是跳不過去的,它必須執行測試。

③測試類新增@SpringBootTest註解修飾

package com.example;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringBootJuintApplicationTests {
    @Test
    void contextLoads() {
    }
}

④ 使用自動裝配新增要測試的物件

這裡測試啥呢?測試一下dao層

一、編寫Dao層介面:

package com.example.Dao;
public interface UserDao {
    public void selectAll();
}

二、編寫Dao層介面的實現類:值得說明的是,一般情況下,因為Dao層的mapper需要用到反射,一般是沒有實現類的,這裡只是為了測試方便!!!

package com.example.Dao.impl;
import com.example.Dao.UserDao;
import org.springframework.stereotype.Repository;
@Repository//把這個類交給Spring容器管理
public class ImplUserDao implements UserDao {
    @Override
    public void selectAll() {
        System.out.println("selectAll.......");
    }
}

三、在測試類中使用@Autowired進行注入

package com.example;
import com.example.Dao.UserDao;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringBootJuintApplicationTests {
    @Autowired
    UserDao userDao;
    @Test
    void contextLoads() {
        userDao.selectAll();
    }
}

四、執行測試

SpringBoot整合junit的classes

在上面整合的junit並不完整,為什麼這樣說,請看:

現在SpringBoot的引導類和測試類的引導類都在同級目錄下,現在我要把測試類的引導類移動到com包下

執行測試,輸出:Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test

:說的是它找不到SpringBoot的設定類,需要你使用@ContextConfiguration或者@SpringBootTest為你的測試類指定SpringBoot的設定類

為什麼出現以下情況,原來是@SpringBootTest會預設從當前包及其子包下尋找SpringBoot的設定類,當我們把測試類中的SpringBootJuintApplicationTests移動到com包下時,它就找不到對應的SpringBoot的設定類,因為它這時不在引導類包及其子包下,也就無法從spring容器中獲取對應bean,則無法進行注入。

解決方法:在@SpringBootTest註解中指定引導類或者使用@ContextConfiguration

@SpringBootTest(classes = SpringBootJuintApplication.class)
@ContextConfiguration(classes = SpringBootJuintApplication.class)

SpringBoot整合Mybatis

整合前的準備

值得說明的是,這裡整合Mybatis用的是註解的方式

一、建立資料庫資料

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `username` varchar(20) CHARACTER SET utf8 COLLATE utf8_esperanto_ci NULL DEFAULT NULL,
  `password` varchar(20) CHARACTER SET utf8 COLLATE utf8_esperanto_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_esperanto_ci ROW_FORMAT = Dynamic;
INSERT INTO `user` VALUES ('zhangsan', '775033');
INSERT INTO `user` VALUES ('lisi', '330678');
SET FOREIGN_KEY_CHECKS = 1;

二、建立工程、新建對應實體類

SpringBoot方便的一部分原因就是,用什麼匯入就勾選什麼技術。

或者手動加入:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>SpringBoot-Mybatis</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringBoot-Mybatis</name>
    <description>SpringBoot-Mybatis</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.21</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

建立實體類物件:

package com.example.entity;
public class User {
    private String username;
    private String password;
    @Override
    public String toString() {
        return "User{" +
                "username='" + username + ''' +
                ", password='" + password + ''' +
                '}';
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public User() {
    }
    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }
}

整合Mybatis

一、上面已經匯入了對應技術用到的座標,現在要設定資料來源,在哪設定呢,在SpringBoot的組態檔:

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springboot
    username: root
    password: ******

二、編寫dao層介面()

package com.example.dao;
import com.example.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface UserDao {
    @Select("select username,password from user")
    public List<User> selectAll();
}

三、編寫測試

package com.example.springbootmybatis;
import com.example.dao.UserDao;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringBootMybatisApplicationTests {
    @Autowired
    UserDao userDao;
    @Test
    void contextLoads() {
        System.out.println(userDao.selectAll());
    }
}

測試:

報了以上兩個錯誤,這是我們希望看到的,為什麼?

原因:在上面的驅動中我們使用的是MySQL 8.X版本的,在8及以上的MySQL驅動中,SpringBoot強制我們進行時區設定,並且要用:com.mysql.cj.jdbc.Driver

解決:這裡我們只需要在組態檔中新增失去設定和更改Driver即可

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC
    username: root
    password: ******

測試:

值得注意的是:在MySQL8才需要設定時區和使用cj.jdbc.

SpringBoot 整合druid

設定前置知識小點

因為druid是一個連線池,需要提供資料來源,測試也還是那一套,這裡直接複製上邊的模組進行重新開發。

整合druid

首先,我們應該知道的是,SpringBoot之所以好用,就是因為它可以很好的整合其他的第三方資源和技術,核心就是:匯入對應的stater,根據設定格式,編寫非預設值對應的設定項

一、匯入對應druid的stater

<!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.8</version>
</dependency>

二、在組態檔中設定資料來源

spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC
      username: root
      password: ******

三、測試

測試?設定完成了?完成了,SpringBoot就是這麼好用

到此這篇關於SpringBoot整合Mybatis與druid實現流程詳解的文章就介紹到這了,更多相關SpringBoot整合Mybatis與druid內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com