MyBatis-Plus 01- 整合SpringBoot

在這裏插入圖片描述

公司從 MyBatis 升級爲MyBatis-Plus,所以開始學習,在這裏留下學習總結,也希望能帶給讀者一些幫助,同時文章中有什麼不對的地方歡迎指出。
HERE 直達 MyBatis-Plus 官網
HERE 直達 MyBatis-Plus 02- 深入學習

一、什麼是MyBatis-Plus

MyBatis-Plus是 MyBatis 的增強工具包,在MyBatis的基礎上只做增強不做改變,爲簡化開發,提高效率而生。MyBatis-Plus簡化了CRUD操作,提供了代碼生成器,強大的條件構造器,同時內置了多個實用插件:標配的分頁插件、性能分析插件、全局攔截插件等。使得開發過程中,基本的範式代碼都一句話解決了,省去了很多重複的操作。

二、MyBatis-Plus的特性

  • 1.無侵入:只做增強不做改變,引入它不會對現有工程產生影響,如絲般順滑。

  • 2.損耗小:啓動即會自動注入基本CRUD,性能基本無損耗,直接面向對象操作。

  • 3.強大的CRUD操作:內置通用mapper、通用service、僅僅通過少量配置即可實現單表大部分CRUD操作,更有強大的條件構造器,滿足各類使用需求。

  • 4.支持Lambda形式調用:通過Lambda表達式,方便的編寫各類查詢條件,無需再擔心字段寫錯。

  • 5.支持主鍵自動生成:支持多達4種主鍵策略(內含分佈式唯一ID生成器-Sequence),可自由配置,完美解決主鍵問題。

  • 6.支持ActiveRecord模式:支持ActiveRecord形式調用,實體類只需繼承Model類即可進行強大的CRUD操作。

  • 7.支持自定義全局通用操作:支持全局通用方法注入(Write One,use anywhere)。

  • 8.內置代碼生成器:採用代碼或Maven插件可快速生成Mapper、Modle、Service、Controller層代碼,支持模板引擎。

  • 9.內置分頁插件:基於MyBatis物理分頁,開發者無需關心具體操作,配置好插件以後,寫分頁等同於普通List查詢。

  • 10.分頁插件支持多種數據庫:支持MySQL、MariaDB、Oracle、DB2、H2、HSQL、Sqlite、Postgre、SQLServer。

  • 11.內置性能分析插件:可輸出SQL語句以及其執行時間,建議開發測試時啓用該功能,能快速找出慢查詢。

  • 12.內置全局攔截插件:提供全表delete、update操作智能分析阻斷,也可自定義攔截規則,預防誤操作。

  • 13.支持多種數據庫: mysql、mariadb、oracle、db2、h2、hsql、sqlite、postgresql、sqlserver、達夢數據庫、虛谷數據庫、人大金倉數據庫。

三、SpringBoot 快速集成 MyBatis-Plus

1.初始化一個SpringBoot項目

![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20200520134949941.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzA5NDM2MQ==,size_16,color_FFFFFF,t_70

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
項目到這裏就創建好了,然後建一些開發需要的包,比如dao層、service層、controller等,創建好的最終項目目錄如下,僅供參考。
在這裏插入圖片描述

2.添加相關依賴

<?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.1.12.RELEASE</version>
        <relativePath/>
    </parent>

    <groupId>com.demo.kathy</groupId>
    <artifactId>demo_springboot_mybatisplus</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!--springboot-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <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>
        </dependency>

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!--Druid數據連接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>

        <!-- mysql數據庫驅動 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>

        <!-- swagger -->
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-annotations</artifactId>
            <version>1.5.20</version>
        </dependency>

        <!--mybatisplus和springboot的集成包-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.0.6</version>
        </dependency>

        <!--mybatis-plus代碼生成器依賴包-->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.0</version>
        </dependency>

        <!--mybatis puls分頁插件-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.10</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3.配置

application.yml

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test_kathy?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false
    username: root
    password: root

mybatis-plus:
  # 如果是放在src/main/java目錄下 classpath:/com/yourpackage/*/mapper/*Mapper.xml
  # 如果是放在resource目錄 classpath:mapper/*Mapper.xml
  mapper-locations: classpath:mappers/*Mapper.xml
  #實體掃描,多個package用逗號或者分號分隔
  typeAliasesPackage: com.demo.kathy.domain.entity
  global-config:
    #主鍵類型  0:"數據庫ID自增", 1:"用戶輸入ID",2:"全局唯一ID (數字類型唯一ID)", 3:"全局唯一ID UUID";
    id-type: 0
    #字段策略 0:"忽略判斷",1:"非 NULL 判斷"),2:"非空判斷"
    field-strategy: 1
    #駝峯下劃線轉換
    #db-column-underline: true
    #刷新mapper 調試神器
    #refresh-mapper: true
    #數據庫大寫下劃線轉換
    #capital-mode: true
    # Sequence序列接口實現類配置
    #key-generator: com.baomidou.mybatisplus.incrementer.OracleKeyGenerator
    #邏輯刪除配置(下面3個配置)
    #logic-delete-value: 1
    #logic-not-delete-value: 0
    #sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector
    #自定義填充策略接口實現
    #meta-object-handler: com.baomidou.springboot.MyMetaObjectHandler
  configuration:
    map-underscore-to-camel-case: true
    cache-enabled: false
    #配置JdbcTypeForNull
    jdbc-type-for-null: 'null'


druid.properties

#屬性類型的字符串,通過別名的方式配置擴展插件, 監控統計用的stat 日誌用log4j 防禦sql注入:wall
filters=stat
#初始化時池中建立的物理連接個數。
initialSize=2
#最大的可活躍的連接池數量
maxActive=300
#獲取連接時最大等待時間,單位毫秒,超過連接就會失效。配置了maxWait之後,缺省啓用公平鎖,併發效率會有所下降, 如果需要可以通過配置useUnfairLock屬性爲true使用非公平鎖。
maxWait=60000
#連接回收器的運行週期時間,時間到了清理池中空閒的連接,testWhileIdle根據這個判斷
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000
#用來檢測連接是否有效的sql,要求是一個查詢語句。
validationQuery=SELECT 1
#建議配置爲true,不影響性能,並且保證安全性。 申請連接的時候檢測,如果空閒時間大於timeBetweenEvictionRunsMillis, 執行validationQuery檢測連接是否有效。
testWhileIdle=true
#申請連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能。設置爲false
testOnBorrow=false
#歸還連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能,設置爲flase
testOnReturn=false
#是否緩存preparedStatement,也就是PSCache。
poolPreparedStatements=false
#池中能夠緩衝的preparedStatements語句數量
maxPoolPreparedStatementPerConnectionSize=200

SpringBoot啓動類

package com.demo.kathy;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.demo.kathy.domain.mapper")
public class DemoSpringbootMybatisplusApplication {

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

}

DruidConfig 連接池配置類

package com.demo.kathy.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import com.alibaba.druid.pool.DruidDataSource;

import javax.sql.DataSource;

/**
 * @Author kathy
 * @Date 2020/5/19 13:12
 * @Version 1.0
 */
@Configuration
@PropertySource(value = "classpath:druid.properties")
public class DruidConfig {

    @Bean(destroyMethod = "close",initMethod = "init")
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource druidDataSource(){
        DruidDataSource druidDataSource=new DruidDataSource();
        return druidDataSource;
    }
}

MybatisConfiguration 配置類

package com.demo.kathy.config;

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Author kathy
 * @Date 2020/5/19 13:28
 * @Version 1.0
 */
@EnableTransactionManagement
@Configuration
@MapperScan("com.demo.kathy.domain.mapper")
public class MybatisConfiguration {

    @Bean
    public PaginationInterceptor paginationInterceptor(){
        return new PaginationInterceptor();
    }
}

創建數據庫表以備測試使用

DROP TABLE IF EXISTS user;

CREATE TABLE user
(
	id BIGINT(20) NOT NULL COMMENT '主鍵ID',
	name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
	age INT(11) NULL DEFAULT NULL COMMENT '年齡',
	email VARCHAR(50) NULL DEFAULT NULL COMMENT '郵箱',
	PRIMARY KEY (id)
);

測試數據

DELETE FROM user;

INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, '[email protected]'),
(2, 'Jack', 20, '[email protected]'),
(3, 'Tom', 28, '[email protected]'),
(4, 'Sandy', 21, '[email protected]'),
(5, 'Billie', 24, '[email protected]');

------------------------------至此配置完成------------------------------

4.MyBatis-Plus代碼生成器

AutoGenerator 是 MyBatis-Plus 的代碼生成器,通過 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各個模塊的代碼,極大的提升了開發效率。

編寫代碼生成器類 Generator.java

package com.demo.kathy.domain.utils;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

/**
 * @Descrption 自動代碼生成工具類
 * @Author kathy
 * @Date 2020/5/19 13:30
 * @Version 1.0
 */
public class Generator {

    public static void main(String[] args) {
        String packageName="com.demo.kathy";
        boolean serviceNameStartWithI=false;    //auth -> UserService, 設置成true: auth -> IUserService
        generateByTables(serviceNameStartWithI,packageName,"kathy","test_kathy","user");
    }

    /**
     *
     * @param serviceNameStartWithI
     * @param packageName  包名
     * @param author       作者
     * @param databaseName 數據庫名
     * @param tableName    表名
     */
    private static void generateByTables(boolean serviceNameStartWithI,String packageName,String author,String databaseName,String tableName){

        //數據庫連接URL
        String dbUrl="jdbc:mysql://localhost:3306/"+databaseName+"?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false";

        //全局策略配置
        GlobalConfig globalConfig=new GlobalConfig();
        globalConfig.setAuthor(author)          //開發人員/作者
                .setOutputDir("D:\\autoGenerator")    //生成文件的輸出目錄
                .setFileOverride(true)          //是否覆蓋已有文件,默認false
                .setEnableCache(false)          //是否在XML中添加二級緩存配置
                .setSwagger2(true);             //實體屬性 Swagger2 註解 3.x版本可設置此屬性

        //是否指定Service的命名方式
        if (!serviceNameStartWithI) {
            //設置service命名方式默認null,例如%sBusiness 生成後 UserBusiness
            globalConfig.setServiceName("%sService");
        }

        //設置controller 命名方式
        //globalConfig.setControllerName("%sAction");

        //數據源配置
        DataSourceConfig dataSourceConfig=new DataSourceConfig();
        dataSourceConfig.setDbType(DbType.MYSQL)        //數據庫類型
                .setUrl(dbUrl)                          //驅動連接URL
                .setUsername("root")                    //用戶名
                .setPassword("root")               //密碼
                .setDriverName("com.mysql.jdbc.Driver");//驅動名稱

        //策略配置
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig
                .setCapitalMode(true)
                .setEntityLombokModel(false)
                //.setDbColumnUnderline(true)   //3.0版本沒有
                .setNaming(NamingStrategy.underline_to_camel)
                //.setSuperMapperClass("SuperClass")    //你自己的父類實體,沒有就不用設置!
                .setInclude(tableName)          //修改替換成你需要的表名,多個表名傳數組
                .setEntityLombokModel(true)     //啓用lombok
                .setRestControllerStyle(true);  //設置controller爲RESTful風格

        //創建代碼生成器並將以上配置入參
        new AutoGenerator().setGlobalConfig(globalConfig)
                .setDataSource(dataSourceConfig)
                .setStrategy(strategyConfig)
                .setPackageInfo(    //包配置
                        new PackageConfig()
                                .setParent(packageName)
                                .setController("controller")
                                .setEntity("domain.entity")
                                .setMapper("domain.mapper")
                                .setService("domain.service")
                                .setServiceImpl("domain.service.impl")
                                .setXml("mappers")
                ).execute();
    }
}

更多代碼生成器的 詳細配置

然後執行main方法,執行成功後去我們設置的輸出目錄裏查看,可以看到文件已生成,將這些文件copy到我們的項目包中,如圖。

在這裏插入圖片描述

在這裏插入圖片描述

生成的實體類

在這裏插入圖片描述

Mapper

在這裏插入圖片描述

Service

在這裏插入圖片描述
在這裏插入圖片描述

Controller

在這裏插入圖片描述

5.進行測試

我們之前已經創建了一個test測試包,忘記的小可愛請上樓翻下哦。 然後我們在這個包下創建類SampleTest測試下我們剛纔搭建的環境。

SampleTest.java

@RunWith(SpringRunner.class)
@SpringBootTest
public class SampleTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testSelect(){
        System.out.println(("----- selectAll method test ------"));
        //UserMapper中的selectList()方法的參數爲MP內置的條件封裝器Wrapper,傳null表示無任何條件
        List<User> userList=userMapper.selectList(null);
        //斷言方法:如果兩者一致,程序繼續往下執行;如果兩者不一致,中斷測試方法,拋出異常信息AssertionFailedError
        Assert.assertEquals(5, userList.size());
        userList.forEach(System.out::println);
    }
}

執行結果
在這裏插入圖片描述

博客部分內容來自: 程序員不棄
https://blog.csdn.net/kye055947/article/details/83692476

關注微信公衆號【程序媛琬淇】,專注分享Java乾貨,給你意想不到的收穫。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章