简介

Druid:是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况

MariaDB:是最流行的开源关系型数据库之一。它由 MySQL 的原始开发者制作,并保证保持开源。它是大多数云产品的一部分,也是大多数Linux发行版的默认配置。MariaDB 被设计为 MySQL 的直接替代产品,具有更多功能,新的存储引擎,更少的错误和更好的性能。它建立在性能、稳定性和开放性的价值之上,MariaDB 基金会确保将根据技术优点接受贡献。最近的新功能包括与Galera Cluster 4的高级集群,与Oracle数据库和Temporal Data Tables的兼容功能,允许人们查询过去任何时候的数据

Lombok:是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具,简单来说,比如我们新建了一个类,然后在其中写了几个属性,然后通常情况下我们需要手动去建立getter和setter方法啊,构造函数啊之类的,lombok的作用就是为了省去我们手动创建这些代码的麻烦,它能够在我们编译源码的时候自动帮我们生成这些方法

Mybatis-Plus:(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生


一、Druid

pom.xml引入库

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.8</version>
</dependency>

application.yml文件配置

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource #引入自定义的Druid数据源
    druid:
      #初始化时建立物理连接的个数
      initial-size: 5
      #最小连接池数量
      min-idle: 5
      #最大连接池数量 maxIdle已经不再使用
      max-active: 20
      #获取连接时最大等待时间,单位毫秒
      max-wait: 60000
      #申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
      test-while-idle: true
      #既作为检测的间隔时间又作为testWhileIdel执行的依据
      time-between-eviction-runs-millis: 60000
      #销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接
      min-evictable-idle-time-millis: 30000
      #用来检测连接是否有效的sql 必须是一个查询语句
      #mysql中为 select 'x'
      #oracle中为 select 1 from dual
      validation-query: select 'x'
      #申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
      test-on-borrow: false
      #归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
      test-on-return: false
      #是否缓存preparedStatement,mysql5.5+建议开启
      pool-prepared-statements: true
      #当值大于0时poolPreparedStatements会自动修改为true
      max-pool-prepared-statement-per-connection-size: 20

二、MariaDB

pom.xml引入库

<dependency>
     <groupId>org.mariadb.jdbc</groupId>
     <artifactId>mariadb-java-client</artifactId>
     <scope>runtime</scope>
</dependency>

application.yml文件配置

spring:
  datasource:
    driver-class-name: org.mariadb.jdbc.Driver
    url: jdbc:mariadb://localhost:3306/test?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2B8
    username: root
    password: root

 三、Lombok

pom.xml引入库

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

其他配置查看:Lombok配置

 四、Mybatis-Plus

pom.xml引入库

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.2</version>
        </dependency>

        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.31</version>
        </dependency>

application.yml文件配置

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

五、MyBatis-Plus自动生成对应的pojo、service、dao、xml文件

特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操

整体pom.xml文件配置

<?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.6.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>springbootmybatisplus</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>springbootmybatisplus</name>
    <description>springbootmybatisplus</description>
    <properties>
        <java.version>1.8</java.version>
        <druid.version>1.2.8</druid.version>
        <mybatis.plus.version>3.5.1</mybatis.plus.version>
        <generator.version>3.5.2</generator.version>
        <freemarker.version>2.3.31</freemarker.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-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mariadb.jdbc</groupId>
            <artifactId>mariadb-java-client</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- 引入阿里巴巴druid线程池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>${druid.version}</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis.plus.version}</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>${generator.version}</version>
        </dependency>

        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>${freemarker.version}</version>
        </dependency>


    </dependencies>

    <repositories>
        <repository>
            <id>snapshots</id>
            <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
        </repository>
    </repositories>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

 整体application.yml文件配置

server:
  servlet:
    context-path: '/springbootmybatisplus'
  port: 8082
spring:
  datasource:
    driver-class-name: org.mariadb.jdbc.Driver
    url: jdbc:mariadb://localhost:3306/test?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2B8
    username: root
    password: root
    type: com.alibaba.druid.pool.DruidDataSource #引入自定义的Druid数据源
    druid:
      #初始化时建立物理连接的个数
      initial-size: 5
      #最小连接池数量
      min-idle: 5
      #最大连接池数量 maxIdle已经不再使用
      max-active: 20
      #获取连接时最大等待时间,单位毫秒
      max-wait: 60000
      #申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
      test-while-idle: true
      #既作为检测的间隔时间又作为testWhileIdel执行的依据
      time-between-eviction-runs-millis: 60000
      #销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接
      min-evictable-idle-time-millis: 30000
      #用来检测连接是否有效的sql 必须是一个查询语句
      #mysql中为 select 'x'
      #oracle中为 select 1 from dual
      validation-query: select 'x'
      #申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
      test-on-borrow: false
      #归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
      test-on-return: false
      #是否缓存preparedStatement,mysql5.5+建议开启
      pool-prepared-statements: true
      #当值大于0时poolPreparedStatements会自动修改为true
      max-pool-prepared-statement-per-connection-size: 20
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

快速生成文件FastAutoGeneratorTest测试类配置

package com.example.springbootmybatisplus.test;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.Collections;

/**
 * 快速生成
 */
public class FastAutoGeneratorTest {

    /**
     * 数据源配置
     */
    private static final String URL = "jdbc:mariadb://localhost:3306/test?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2B8";
    private static final String USER_NAME = "root";
    private static final String PASSWORD = "root";
    private static final DataSourceConfig.Builder DATA_SOURCE_CONFIG =
            new DataSourceConfig
                    .Builder(URL, USER_NAME, PASSWORD);

    private static final String JAVA_PAHT = System.getProperty("user.dir") + "/src/main/java";

    private static final String XML_PAHT = System.getProperty("user.dir") + "/src/main/resources/dao";

    /**
     * 执行run
     *
     * @param args
     */
    public static void main(String[] args) {
        FastAutoGenerator.create(DATA_SOURCE_CONFIG)
                /*全局配置(GlobalConfig)
                fileOverride	覆盖已生成文件	默认值:false
                disableOpenDir	禁止打开输出目录	默认值:true
                outputDir(String)	指定输出目录	/opt/baomidou/ 默认值: windows:D:// linux or mac : /tmp
                author(String)	作者名	baomidou 默认值:作者
                enableKotlin	开启 kotlin 模式	默认值:false
                enableSwagger	开启 swagger 模式	默认值:false
                dateType(DateType)	时间策略	DateType.ONLY_DATE 默认值: DateType.TIME_PACK
                commentDate(String)	注释日期	默认值: yyyy-MM-dd*/
                .globalConfig(builder -> {
                    builder.author("6464")
                            .outputDir(JAVA_PAHT)
                            .disableOpenDir();
                })
                /*包配置(PackageConfig)
                方法	说明	示例
                parent(String)	父包名	默认值:com.baomidou
                moduleName(String)	父包模块名	默认值:无
                entity(String)	Entity 包名	默认值:entity
                service(String)	Service 包名	默认值:service
                serviceImpl(String)	Service Impl 包名	默认值:service.impl
                mapper(String)	Mapper 包名	默认值:mapper
                xml(String)	Mapper XML 包名	默认值:mapper.xml
                controller(String)	Controller 包名	默认值:controller
                other(String)	自定义文件包名	输出自定义文件时所用到的包名
                pathInfo(Map<OutputFile, String>)	路径配置信息	Collections.singletonMap(OutputFile.mapperXml, "D://")*/
                .packageConfig(builder -> {
                    builder.parent("com.example.springbootmybatisplus")
                            .moduleName("user")
                            .entity("vo")
                            .mapper("dao")
                            .xml("dao.xml")
                            .pathInfo(Collections.singletonMap(OutputFile.xml, XML_PAHT));
                })
                /*策略配置(StrategyConfig)
                方法	说明	示例
                enableCapitalMode	开启大写命名	默认值:false
                enableSkipView	开启跳过视图	默认值:false
                disableSqlFilter	禁用 sql 过滤	默认值:true,语法不能支持使用 sql 过滤表的话,可以考虑关闭此开关
                enableSchema	启用 schema	默认值:false,多 schema 场景的时候打开
                likeTable(LikeTable)	模糊表匹配(sql 过滤)	likeTable 与 notLikeTable 只能配置一项
                notLikeTable(LikeTable)	模糊表排除(sql 过滤)	likeTable 与 notLikeTable 只能配置一项
                addInclude(String...)	增加表匹配(内存过滤)	include 与 exclude 只能配置一项
                addExclude(String...)	增加表排除匹配(内存过滤)	include 与 exclude 只能配置一项
                addTablePrefix(String...)	增加过滤表前缀
                addTableSuffix(String...)	增加过滤表后缀
                addFieldPrefix(String...)	增加过滤字段前缀
                addFieldSuffix(String...)	增加过滤字段后缀
                entityBuilder	实体策略配置
                controllerBuilder	controller 策略配置
                mapperBuilder	mapper 策略配置
                serviceBuilder	service 策略配置*/
                .strategyConfig(builder -> {
                    builder.addInclude("user_t") // 设置需要生成的表名
                            .addTableSuffix("_t");
                })
                /*模板配置(TemplateConfig)
                方法	说明	示例
                disable	禁用所有模板
                disable(TemplateType...)	禁用模板	TemplateType.ENTITY
                entity(String)	设置实体模板路径(JAVA)	/templates/entity.java
                entityKt(String)	设置实体模板路径(kotlin)	/templates/entity.java
                service(String)	设置 service 模板路径	/templates/service.java
                serviceImpl(String)	设置 serviceImpl 模板路径	/templates/serviceImpl.java
                mapper(String)	设置 mapper 模板路径	/templates/mapper.java
                mapperXml(String)	设置 mapperXml 模板路径	/templates/mapper.xml
                controller(String)	设置 controller 模板路径	/templates/controller.java*/
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                .strategyConfig(builder -> {
                    builder.entityBuilder()
                            .enableLombok()
                            .idType(IdType.ASSIGN_ID)
                            .formatFileName("%sVO")
                            .controllerBuilder()
                            .enableRestStyle()
                            .enableHyphenStyle()
                            .mapperBuilder()
                            .formatMapperFileName("%sDao")
                            .formatXmlFileName("%sDao")
                            .build();
                })
                .execute();
    }

}

分页插件MybatisPlusConfig配置

 

package com.example.springbootmybatisplus.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author 64641
 * <p>
 * 分页插件配置
 */
@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor getMybatisPlusInterceptor() {
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MARIADB));
        return mybatisPlusInterceptor;
    }

}

Controller类测试

package com.example.springbootmybatisplus.user.controller;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.springbootmybatisplus.user.service.IUserService;
import com.example.springbootmybatisplus.user.vo.UserVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.websocket.server.PathParam;
import java.util.List;

/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author 6464
 * @since 2022-04-18
 */
@RestController
@Slf4j
@RequestMapping("/user")
public class UserController {

    private final IUserService userService;

    public UserController(IUserService userService) {
        this.userService = userService;
    }

    @GetMapping("/getUser")
    public UserVO getUser() {
        UserVO userVO = userService.getById(1);
        log.info("----getUser----: {}", userVO.toString());
        return userVO;
    }

    @GetMapping("/getAllUser")
    public List<UserVO> getAllUser() {
        List<UserVO> list = userService.list();
        for (UserVO userVO : list) {
            log.info("---getAllUser----: {}", userVO.toString());
        }
        return list;
    }

    @GetMapping("/getUserByParam")
    public List<UserVO> getUserByParam(@RequestParam("age") String age, @RequestParam("name") String name) {
        QueryWrapper<UserVO> queryWrapper = new QueryWrapper();
        queryWrapper.ge("age", age);
        queryWrapper.eq("name", name);
        List<UserVO> list = userService.list(queryWrapper);
        for (UserVO userVO : list) {
            log.info("---getUserByParam----: {}", userVO.toString());
        }
        return list;
    }

    @GetMapping("/getPageUser/{size}/{current}")
    public Page<UserVO> getPageUser(@PathVariable("current") Integer current, @PathVariable("size") Integer size) {
        Page<UserVO> page = new Page<>(current, size);
        Page<UserVO> userVOPage = userService.page(page);
        return userVOPage;
    }

}

 SpringBoot启动类配置

package com.example.springbootmybatisplus;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

/**
 * @author 64641
 */
@SpringBootApplication
@MapperScan("com.example.springbootmybatisplus./*.**.dao")
public class SpringbootmybatisplusApplication extends SpringBootServletInitializer {

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

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(SpringbootmybatisplusApplication.class);
    }

}

 源代码资源:SpringBoot集成Druid+MariaDB+Lombok+Mybatis-Plus详解

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐