1. 程式人生 > >Spring Boot + Mybatis-Plus 整合與使用(二)

Spring Boot + Mybatis-Plus 整合與使用(二)

前言: 

本章節介紹MyBatis-PulsCRUD使用。在開始之前,先簡單講解下上章節關於Spring Boot是如何自動配置MyBatis-Plus

  一、自動配置

Spring Boot應用從主方法main()啟動後,首先載入Spring Boot註解類@SpringBootApplication。

@SpringBootApplication
public class DemoApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

在該類里加載註解類@EnableAutoConfiguration。

EnableAutoConfiguration類使用註解類@Import匯入了AutoConfigurationImportSelector自動配置選擇器類來載入其他可自動配置的元件,步驟如下:

1、AutoConfigurationImportSelector自動配置選擇器呼叫getCandidateConfigurations方法,方法中SpringFactoriesLoader類通過loadFactoryNames方法掃描獲取各jar包類路徑下的META-INF/spring.factories檔案

2、將掃描到的META-INF/spring.factories

檔案封裝成Properties物件

3、遍歷Properties物件,從中取出屬性名org.springframework.boot.autoconfigure.EnableAutoConfiguration.EnableAutoConfiguration對應的值,值就為當前Jar包需Spring Boot載入的配置類,載入到容器中,並根據配置條件例項化配置類中的類物件

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
        Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
        return configurations;
}
private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {
        MultiValueMap<String, String> result = (MultiValueMap)cache.get(classLoader);
        if (result != null) {
            return result;
        } else {
            try {
                //掃描META-INF/spring.factories檔案
                Enumeration<URL> urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");
                LinkedMultiValueMap result = new LinkedMultiValueMap();
 
                while(urls.hasMoreElements()) {
                    URL url = (URL)urls.nextElement();
                    UrlResource resource = new UrlResource(url);
                    //通過spring.factories檔案Url封成Properties物件
                    Properties properties = PropertiesLoaderUtils.loadProperties(resource);
                    Iterator var6 = properties.entrySet().iterator();
 
                    while(var6.hasNext()) {
                        Entry<?, ?> entry = (Entry)var6.next();
                        String factoryClassName = ((String)entry.getKey()).trim();
                        String[] var9 = StringUtils.commaDelimitedListToStringArray((String)entry.getValue());
                        int var10 = var9.length;
 
                        for(int var11 = 0; var11 < var10; ++var11) {
                            String factoryName = var9[var11];
                            result.add(factoryClassName, factoryName.trim());
                        }
                    }
                }
 
                cache.put(classLoader, result);
                return result;
            } catch (IOException var13) {
                throw new IllegalArgumentException("Unable to load factories from location [META-INF/spring.factories]", var13);
            }
        }
    }

來看下mybatis-plus-boot-starter包下的META-INF/spring.factories檔案

檔案中只有一條配置屬性值,對應的自動配置類為MybatisPlusAutoConfiguration。至此,MyBatis-Plus是如何被自動配置並載入容器介紹到這裡,後續會講解Spring Boot時會更細緻自動配置原理,各位同伴們繼續關注。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration

二、通用CRUD

瞭解Spring Boot是如何自動配置MyBatis-Plus後,接下來講解使用MyBatis-Plus進行通用的CRUD操作以及相關操作的配置。

上一章節,我們準備了一個sql指令碼,執行指令碼後建立t_sys_log表,表結構可以檢視上一章節。接著我們在專案中建立對應entity類和mapper介面

1. 目錄結構如下

2. 實體類SysLog屬性如下

public class SysLog implements Serializable {
    
    private int logId;
 
    private Integer optionType;
 
    private String optionPerson;
 
    private String optionContent;
 
    private String optionIp;
 
    private String optionStatus;
 
    private String errorInfo;
 
    private Date optionTime;
    
    //get與set方法

3. 在SysLogMapper介面中繼承MyBatis-Plus包中BaseMapper介面,介面定義泛型,使用SysLog

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
public interface SysLogMapper extends BaseMapper<SysLog> {
    
}

4. 注入mapper介面,需要將mapper例項到Spring容器中,在這三種方式

  • Spring Boot主方法類上加上@MapperScan("com.banxun.demo.mapper"),配置mapper介面所在包路徑,自動掃描此路徑下的mapper介面
@SpringBootApplication
@MapperScan("com.banxun.demo.mapper")
public class DemoApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
  • 直接在mapper介面上加入@Mapper註解
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
 
@Mapper
public interface SysLogMapper extends BaseMapper<SysLog> {
    
}
  • 在專案中新建config目錄,再新建MybatisConfig配置類,使用註解@Configuration定義此類為配置類,使用註解註解@Bean。容器啟動時,建立MapperScannerConfigurer物件,設定basePackage屬性值為mapper介面的包路徑
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class MybatisConfig {
 
    @Bean
    public MapperScannerConfigurer MapperScannerConfigurer(){
        MapperScannerConfigurer scannerConfigurer = new MapperScannerConfigurer();
        scannerConfigurer.setBasePackage("com.banxun.demo.mapper");
        return scannerConfigurer;
    }
}

三、測試通用CRUD

到此,MyBatis-Plus基本配置完成,我們來使用junit進行測試,看看測試有什麼問題,針對具體問題來解決。後續章節中對MyBatis-Plus其他配置一一進行講解。

1、插入資料

junit測試類中注入SysLogMapper,編寫如下程式碼插入一條日誌記錄,執行junit測試方法

@RunWith(SpringRunner.class)
@SpringBootTest
public class BootApplicationTests {
 
    @Autowired
    private SysLogMapper sysLogMapper;
 
    @Test
    public void contextLoads() {
        SysLog sysLog = new SysLog();
        sysLog.setOptionTime(new Date());
        sysLog.setOptionType(1);
        sysLog.setOptionContent("測試mybatis-plus");
        sysLogMapper.insert(sysLog);
    }
}

問題1: Error updating database.  Cause: java.sql.SQLSyntaxErrorException: Table 'wechat.sys_log' doesn't exist

執行完成控制檯輸出列印上面的異常資訊,報sys_log表不存在,而我們建立的表名為t_sys_log,有字首"t_"。在現在配置下,MyBatis-Plus預設自動按駝峰結構類名進行對映成帶下劃線_隔離的表名,解決此問題有兩種方法:

  • 在實體類名SysLog上加@TableName註解指定對映表名
@TableName("t_sys_log")
public class SysLog implements Serializable {
  • 在配置檔案application.properties新增全域性配置屬性統一處理未註解指定表名實體類對映表名時加入字首"t_"
mybatis-plus.global-config.db-config.table-prefix=t_

問題2: Cause: java.sql.SQLSyntaxErrorException: Unknown column 'log_id' in 'field list'

根據問題1配置完成後再次執行junit測試方法,控制檯輸出列印上面的異常資訊,報log_id列不存在。在t_sys_log表中,主鍵名為f_log_id,這裡同樣缺少欄位字首,解決方法有兩種:

預設MyBatis-Plus會根據屬性駝峰命名自動進行欄位對映及主鍵名叫id都可無註解指定欄位名

  • 屬性名上加@TableField("欄位名")註解指定對映欄位名,主鍵欄位使用@TableId("欄位名")註解
  • 通過配置檔案application.properties新增全域性配置屬性統一處理,%s對應自動對映欄位名
mybatis-plus.global-config.db-config.column-format=f_%s

問題3:org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: Could not set property 'logId' of 'class com.banxun.demo.entity.SysLog' with value '1164549971505057794' Cause: java.lang.IllegalArgumentException: argument type mismatch

配置完問題2後,控制檯輸出再次列印上面的異常資訊。此問題原因是插入資料時MyBatis-Plus為主鍵生成的Id值過長,需要配置主鍵生成策略。這問題解決也有兩種方式:

  • 在主鍵性加上@TableId(value = "f_log_id", type = IdType.AUTO),IdType有六個選項值,預設ID_WORKER,我們表使用鍵值自動遞增,所以選AUTO
public enum IdType {
    AUTO(0),  //資料庫自增
    NONE(1),  //無狀態
    INPUT(2), //自行輸入
    ID_WORKER(3), //分散式全域性唯一ID 長整型型別
    UUID(4),   //32位UUID字串
    ID_WORKER_STR(5); //分散式全域性唯一ID 字串型別

在配置檔案application.properties新增全域性配置屬性統一處理

mybatis-plus.global-config.db-config.id-type=auto

經過前面的配置後,junit方法執行成功,在庫中插入了一條日誌記錄

2、查詢資料

  • 根據id查詢
@Test
public void contextLoads() {
    SysLog sysLog = sysLogMapper.selectById(173);
    System.out.println(sysLog.getOptionContent());
}

控制檯列印輸入前面插入的日誌內容資訊

2019-08-22 23:16:00.489  INFO 5112 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
 _ _   |_  _ _|_. ___ _ |    _ 
| | |\/|_)(_| | |_\  |_)||_|_\ 
     /               |         
                        3.1.2 
2019-08-22 23:16:00.867  INFO 5112 --- [           main] com.banxun.demo.DemoApplicationTests     : Started DemoApplicationTests in 2.204 seconds (JVM running for 3.16)
測試mybatis-plus
2019-08-22 23:16:01.132  INFO 5112 --- [       Thread-2] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2019-08-22 23:16:01.317  INFO 5112 --- [       Thread-2] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.
  • 根據內容模糊查詢,這使用QueryWrapper條件構造器進行條件查詢
@Test
public void contextLoads() {
    QueryWrapper<SysLog> queryWrapper = new QueryWrapper<>();
    queryWrapper.like("f_option_content", "plus");
    List<SysLog> sysLogs = sysLogMapper.selectList(queryWrapper);
    for (SysLog sysLog : sysLogs) {
        System.out.println(sysLog.getOptionContent());
    }
}

3、更新資料

@Test
public void contextLoads() {
    SysLog sysLog = new SysLog();
    sysLog.setLogId(173);
    sysLog.setOptionContent("測試Spring Boot + MyBatis-Plus");
    sysLogMapper.updateById(sysLog);
}

執行完成後,我們再通過上面根據id查詢,可以看到控制檯列印輸入更新的日誌內容資訊

2019-08-22 23:26:57.358  INFO 22964 --- [           main] com.banxun.demo.DemoApplicationTests     : Starting DemoApplicationTests on LAPTOP-6AQTBBR1 with PID 22964 (started by karanatarm in E:\ideaplace\demo)
2019-08-22 23:26:57.359  INFO 22964 --- [           main] com.banxun.demo.DemoApplicationTests     : No active profile set, falling back to default profiles: default
2019-08-22 23:26:58.369  INFO 22964 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2019-08-22 23:26:58.813  INFO 22964 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
 _ _   |_  _ _|_. ___ _ |    _ 
| | |\/|_)(_| | |_\  |_)||_|_\ 
     /               |         
                        3.1.2 
2019-08-22 23:26:59.167  INFO 22964 --- [           main] com.banxun.demo.DemoApplicationTests     : Started DemoApplicationTests in 2.087 seconds (JVM running for 3.044)
測試Spring Boot + MyBatis-Plus
2019-08-22 23:26:59.456  INFO 22964 --- [       Thread-2] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2019-08-22 23:26:59.518  INFO 22964 --- [       Thread-2] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.

4、刪除資料

@Test
public void tes() {
    SysLog sysLog = new SysLog();
    sysLog.setLogId(173);
    sysLogMapper.deleteById(sysLog);
}

執行完成後,我們再根據id查詢,可以看到控制檯沒有列印輸入日誌內容

四、小結

本章節介紹MyBatis-Plus如何自動配置、CRUD基礎配置以及測試CRUD操作。一起學習的同伴們應該對MyBatis-PlusCRUD意猶未盡。接下來的章節我們在一起學習MyBatis-Plus的進階CRUD操作,結合JDK8新特性的lambda方式的條件結構查詢及相關配置。

掃描下方二維碼,關注微信公眾號,掌握最新動態。與關注的同伴們一起學習,一起程式設計!

相關推薦

Spring Boot + Mybatis-Plus 整合使用

前言:  本章節介紹MyBatis-Puls的CRUD使用。在開始之前,先簡單講解下上章節關於Spring B

Spring boot+Mybatis plus整合+Mybatis plus逆向工程

環境引數 jdk 1.8 資料庫 Mysql5.5+ IDE IDEA2018.2 Maven 3.3.9 Spring boot 2.1.0.RELEASE Mybatis plus 3.0.5 1.建立Spring Ini

Spring Boot幹貨系列:配置文件解析

set test profile ava java prefix 標註 了解 pre Spring Boot:配置文件解析 前言 上一篇介紹了Spring Boot的入門,知道了Spring Boot使用“習慣優於配置”(項目中存在大量的配置,此外

Spring Boot中使用WebSocket總結:向指定使用者傳送WebSocket訊息並處理對方不線上的情況

Spring Boot中使用WebSocket總結(二):向指定使用者傳送WebSocket訊息並處理對方不線上的情況 在上一篇文章(www.zifangsky.cn/1355.html)中我介紹了在Spring專案中使用WebSocket的幾種實現方式。但是,上篇文章中只介紹了服務端採用廣播模式給所有客戶

Spring Boot 入門之 Web 篇

一、前言 上一篇《Spring Boot 入門之基礎篇(一)》介紹了 Spring Boot 的環境搭建以及專案啟動打包等基礎內容,本篇繼續深入介紹 Spring Boot 與 Web 開發相關的知識。 二、整合模板引擎 由於 jsp 不被 SpringBoot 推薦使用,所以模板引擎主

Spring Boot實現OAuth 2.0-- 自定義許可權驗證

自定義攔截器進行許可權驗證 涉及到的姿勢: 自定義註解 攔截器 Spring Boot新增攔截器 文章目錄: 自定義註解 @Target(ElementType.METHOD)//作用在方法 @Retention(RetentionP

構建 Zookeeper + Dubbo + Spring Boot 的分散式呼叫專案

一、使用 Spring Initializr 構建 Dubbo 服務消費者 dubbo-consumer 專案 1. 登入 http://start.spring.io/ 填寫如下資訊後點擊 “

Spring Boot 學習之 Web 篇

該系列並非完全原創,官方文件、作者一、前言上一篇《Spring Boot 入門之基礎篇(一)》介紹了 Spring Boot 的環境搭建以及專案啟動打包等基礎內容,本篇繼續深入介紹 Spring Boot 與 Web 開發相關的知識。二、整合模板引擎由於 jsp 不被 Spr

spring boot 整合 jpa -- 之資料操作

spring boot 整合 jpa (一) – 之基礎配置 https://blog.csdn.net/qq_41463655/article/details/82939481 spring boot 整合 jpa (三) – 之表關係對映 https://blog.csdn.net/

Spring+SpringMVC+Mybatis整合系列Eclipse新建Maven web專案

這是SSM搭建的第二篇,關於eclipse整合Maven環境搭建部分已經在上一篇中 Spring+SpringMVC+Mybatis整合系列(一)Maven安裝與配置講解完畢,下面主要講解如何使用Eclipse新建Maven專案,以及建立完後的一個BUG處理方法

HBase 系列十一—— Spring/Spring Boot + Mybatis + Phoenix 整合

一、前言 使用 Spring+Mybatis 操作 Phoenix 和操作其他的關係型資料庫(如 Mysql,Oracle)在配置上是基本相同的,下面會分別給出 Spring/Spring Boot 整合步驟,完整程式碼見本倉庫: Spring + Mybatis + Phoenix SpringBoot

Spring框架學習筆記8——spring boot+mybatis plus+mysql專案環境搭建

之前寫的那篇Spring框架學習筆記(5)——Spring Boot建立與使用,發現有多小細節沒有提及,,正好現在又學習了mybatis plus這款框架,打算重新整理一遍,並將細節說清楚 1.通過IDEA建立spring boot 2.專案相關配置 只需要修改第一個和第二個,下面的其他選項會自動改變

使用Spring+MySql實現讀寫分離spring整合多數據庫

ont 依據 xml配置 實現 整合 配置 item 匹配 mic 緊接著上一章,因為現在做的項目還是以spring為主要的容器管理框架,所以寫以下spring如何整合多個數據源。 1. 背景 我們一般應用對數據庫而言都是“讀多寫少”,也就說對數據庫讀取數據的壓力比較大

Spring Boot + Spring Cloud 構建微服務系統:服務消費和負載Ribbon

使用RestTemplate呼叫服務 在上一篇教程中,我們是這樣呼叫服務的,先通過 LoadBalancerClient 選取出對應的服務,然後使用 RestTemplate 進行遠端呼叫。 LoadBalancerClient 就是負載均衡器,預設使用的是 Ribbon 的實現 RibbonLoadBa

使用 kotlin+spring-boot+Mybatis-plus+Mysql進行web開發

說明:     1、在這裡關於kotlin語言和springboot及mybatis-plus、mysql、這些不做過多解說。直接快速搭建環境,開發專案。     2、在這裡只是一個小demo,後續會出專案開發完成流程、及較差、 &nb

Spring Boot學習之旅:springboot 整合 fastjson

springboot 預設使用的 jackson 但是聽說某寶的fastjson 效能很好,而且平時用的習慣,所以來整合一下。 首先在pom 中匯入依賴 <dependency> <groupId>

Mybatis步步進階——SQL的基本配置執行

  Mybatis使用過程中,相對於hibernate更為靈活、簡潔之處就在於它利用mybatis封裝的標籤配置sql語句,在程式碼中載入配置檔案執行sql。咱採取“先做,再總結”方針,方便大家理解。

Spring boot入門五 spring mvc spring boot mybatis配置整合

備註:通過前面幾章的操作,對Spring Boot已經有了基本的瞭解,不過Spring Boot他也僅僅是個封裝整合引用的盒子而已,需要與具體的專案相結合才能真正的使用起來,主要是記錄下 使用Spring Boot實現 Spring Mvc 和mybatis的整合:具體配置如

Spring boot+ Mybatis 完美整合之註解版

開發環境: 開發工具:Intellij IDEA 2017.1.3JDK : 1.8.0_101spring boot 版本 : 1.5.8.RELEASEmaven : 3.3.9 拓展: springboot 整合 Mybatis 事務管理 開始 1.新建一個spr

雙劍合璧————Spring Boot + Mybatis Plus

引言最近在學習Mybatis Plus的使用,希望通過spring boot快速將mybatis plus整合進來。對於springboot專案,mybatis plus團隊也有自己的啟動器 :mybatis-plus-boot-starter。這個依賴內部已經整合了myba