hikaricp druid比较_Spring Boot整合MybatisPlus和Druid

2023-11-12

在Java中,我比较ORM熟悉的只有Hibernate和Mybatis,其他的并未实践使用过,在这二者之间我更喜欢Mybatis,因为它精简、灵活(毕竟我是上年纪的程序员,喜欢自己写SQL)。

刚才有提到Mybatis,但是这里的重点是介绍Mybatis-Plus,它是Mybatis的增强版,如果要了解Mybatis的细节的话请点击这里。

简介

据MyBatis-Plus官网介绍,MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。这看上去挺香的,所以必须得尝尝。
这里涉及到的环境、组件如下:

  • MariaDB 10.3.10
  • Windows 10
  • IntelliJ IDEA 2019.3.1
  • 64 bit JDK 1.8.0_231
  • Spring Boot 2.2.3.RELEASE
  • Lombok 1.18.10
  • Knife4j 2.0.1
  • Mybatis-plus 3.3.0
  • Druid

Spring Boot 整合Mybatis-Plus

我之前一直是直接用的Mybatis,但是作为喜欢偷懒的人,当然得想办法来提高我们的效率,所以就想着用Mybatis-Plus来省去一些单表的CRUD操作再结合MyBatis-Plus配套的AutoGenerator代码生成器,就能为我们节省不少时间。

引入依赖包

首先,我们得引入Mybatis-Plus和mariadb-java-client等几个包:

       com.github.xiaoymin           knife4j-spring-boot-starter           2.0.1com.baomidou           mybatis-plus-boot-starter           3.3.0org.mariadb.jdbc           mariadb-java-client           2.5.3

在application.yml配置我们的数据库连接信息

spring:  datasource:    driver-class-name: org.mariadb.jdbc.Driver    url: jdbc:mysql://127.0.0.1:3306/nacos_config?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true    username: root    password: root    minimum-idle: 5    maximum-pool-size: 50    auto-commit: true    idle-timeout: 30000    max-lifetime: 1800000    connection-timeout: 30000    connection-test-query: SELECT 1

这里我新建一个名为User的实体,具体属性如下:

@Data@Builder@TableName("users")public class User {    private String username;    private String password;    private int enabled;}

新建一个UserMapper接口:

public interface UserMapper extends BaseMapper {}

在我们的启动类加上@MapperScan来指定我们的Mapper扫描目录:

@MapperScan("com.eyiadmin.demo.mapper")我新建一个单元测试,来试试我们的UserMapper的selectList:

@RunWith(SpringRunner.class)@SpringBootTestpublic class UserTests {    @Autowired    private UserMapper userMapper;    @Test    public void testUser() {        List userList = userMapper.selectList(null);        userList.forEach(System.out::println);    }}

会看到Mybatis-Plus为我取出的数据:

2020-01-20 09:44:14.125 TRACE org.apache.ibatis.logging.jdbc.BaseJdbcLogger.trace(BaseJdbcLogger.java:149) 2CNU7X5OLAUE004 --- [           main] c.e.d.m.U.selectList                     : <==    Columns: username, password, enabled2020-01-20 09:44:14.125 TRACE org.apache.ibatis.logging.jdbc.BaseJdbcLogger.trace(BaseJdbcLogger.java:149) 2CNU7X5OLAUE004 --- [           main] c.e.d.m.U.selectList                     : <==        Row: nacos, $2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu, 12020-01-20 09:44:14.131 DEBUG org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) 2CNU7X5OLAUE004 --- [           main] c.e.d.m.U.selectList                     : <==      Total: 1User(username=nacos, password=$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu, enabled=1)

我们再试试Mybatis-Plus为什么封装的Insert:

@Test    public void TestUserInsert() {        int row = userMapper.insert(User.builder().password("aaaa").username("bbbb").enabled(1).build());        Assert.assertEquals(row, 1);    }

可以看到日志:

2020-01-20 09:51:32.021 DEBUG org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) 2CNU7X5OLAUE004 --- [           main] c.e.d.m.U.insert                         : ==>  Preparing: INSERT INTO users ( username, password, enabled ) VALUES ( ?, ?, ? ) 2020-01-20 09:51:32.036 DEBUG org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) 2CNU7X5OLAUE004 --- [           main] c.e.d.m.U.insert                         : ==> Parameters: bbbb(String), aaaa(String), 1(Integer)

其他高端操作请阅读相关文档https://mp.baomidou.com/guide/quick-start.html

Spring Boot整合Druid数据库连接池

在Spring Boot 2.X默认使用了HikariCP作为数据库连接池,据说hikariCP性能最高(hikariCP>druid>dbcp>c3p0),但是我更喜欢Druid全面的功能和毫不逊色的性能。
开撸吧,首先当然还是引入我们的需要的Druid依赖包:

com.alibaba    druid-spring-boot-starter    1.1.21

接下来就是修改我们的的application.yml配置:

spring:  datasource:    driver-class-name: org.mariadb.jdbc.Driver    url: jdbc:mysql://127.0.0.1:3306/nacos_config?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true    username: root    password: root    ### 连接池配置    druid:      initial-size: 50      max-active: 200      min-idle: 50      max-wait: 50      validation-query: SELECT 1

可以看到我们的日志信息为:

2020-01-20 10:14:54.581  INFO com.alibaba.druid.pool.DruidDataSource.close(DruidDataSource.java:2003) 2CNU7X5OLAUE004 --- [extShutdownHook] c.a.d.p.DruidDataSource                  : {dataSource-1} closing ...2020-01-20 10:14:54.691  INFO com.alibaba.druid.pool.DruidDataSource.close(DruidDataSource.java:2075) 2CNU7X5OLAUE004 --- [extShutdownHook] c.a.d.p.DruidDataSource                  : {dataSource-1} closed

现在我们增加一个Controller来获取Druid的监控数据:

@RestControllerpublic class DruidStatController {    @GetMapping("/druid/status")    public Object druidStat(){        // DruidStatManagerFacade#getDataSourceStatDataList 该方法可以获取所有数据源的监控数据,除此之外 DruidStatManagerFacade 还提供了一些其他方法,你可以按需选择使用。        return DruidStatManagerFacade.getInstance().getDataSourceStatDataList();    }}

访问http://localhost:8080/druid/status可以得到一个json:

[{"Identity": 1914285129,"Name": "DataSource-1914285129","DbType": "mysql","DriverClassName": "org.mariadb.jdbc.Driver","URL": "jdbc:mysql://127.0.0.1:3306/nacos_config?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true","UserName": "root","FilterClassNames": [],"WaitThreadCount": 0,"NotEmptyWaitCount": 0,"NotEmptyWaitMillis": 0,"PoolingCount": 50,"PoolingPeak": 50,"PoolingPeakTime": "2020-01-20T02:26:22.466+0000","ActiveCount": 0,"ActivePeak": 0,"ActivePeakTime": null,"InitialSize": 50,"MinIdle": 50,"MaxActive": 200,"QueryTimeout": 0,"TransactionQueryTimeout": 0,"LoginTimeout": 0,"ValidConnectionCheckerClassName": null,"ExceptionSorterClassName": null,"TestOnBorrow": false,"TestOnReturn": false,"TestWhileIdle": true,"DefaultAutoCommit": true,"DefaultReadOnly": null,"DefaultTransactionIsolation": null,"LogicConnectCount": 0,"LogicCloseCount": 0,"LogicConnectErrorCount": 0,"PhysicalConnectCount": 50,"PhysicalCloseCount": 0,"PhysicalConnectErrorCount": 0,"DiscardCount": 0,"ExecuteCount": 0,"ExecuteUpdateCount": 0,"ExecuteQueryCount": 0,"ExecuteBatchCount": 0,"ErrorCount": 0,"CommitCount": 0,"RollbackCount": 0,"PSCacheAccessCount": 0,"PSCacheHitCount": 0,"PSCacheMissCount": 0,"StartTransactionCount": 0,"TransactionHistogram": [0, 0, 0, 0, 0, 0, 0],"ConnectionHoldTimeHistogram": [0, 0, 0, 0, 0, 0, 0, 0],"RemoveAbandoned": false,"ClobOpenCount": 0,"BlobOpenCount": 0,"KeepAliveCheckCount": 0,"KeepAlive": false,"FailFast": false,"MaxWait": 50,"MaxWaitThreadCount": -1,"PoolPreparedStatements": false,"MaxPoolPreparedStatementPerConnectionSize": 10,"MinEvictableIdleTimeMillis": 1800000,"MaxEvictableIdleTimeMillis": 25200000,"LogDifferentThread": true,"RecycleErrorCount": 0,"PreparedStatementOpenCount": 0,"PreparedStatementClosedCount": 0,"UseUnfairLock": true,"InitGlobalVariants": false,"InitVariants": false}]

我们还可以打开stat-view-servlet,需要加入如下配置:

spring: datasource: druid: stat-view-servlet: enabled: true login-username: admin login-password: admin

这是启动后,访问http://localhost:8080/druid/index.html页面就会跳转到登录页面,输入我们配置的用户名和密码admin/admin:


可以看到Druid提供的功能是比较全面的,另外在第三张图可以看到我们的相关参数,大家也可以参照这个来配置连接池。

MyBatis-Plus的代码生成器

Mybatis有Generator工具为我们提高编码效率,MyBatis-Plus也不示弱,它也提供有MyBatis-Plus AutoGenerator 。在上面的简单实体只有3个属性,假如有几十个属性怎么办呢?这时候AutoGenerator就可以帮我们一个大忙。首先引入所需包:

        com.baomidou            mybatis-plus-generator            3.3.0org.apache.velocity    velocity-engine-core    2.1

具体使用方式,可以去`mybatis-plus`官网查看详细教程

Knife4j的使用

这里我引入了Knife4j包:

        com.github.xiaoymin            knife4j-spring-boot-starter            2.

新建一个SwaggerConfiguration类配置我们的Swagger:

@Configuration@EnableSwagger2@EnableKnife4j@Import(BeanValidatorPluginsConfiguration.class)public class SwaggerConfiguration {    @Bean("createRestApi")    public Docket createRestApi() {        return new Docket(DocumentationType.SWAGGER_2)                .apiInfo( new ApiInfoBuilder()                        //页面标题                        .title("Demo Web Api文档")                        //创建人                        .contact(new Contact("eyiadmin", "https://springfox.github.io/springfox/", "eyiadmin@163.com"))                        .version("1.0")                        .description("Demo Web Api文档")                        .build())                .select()                //API接口所在的包位置                .apis(RequestHandlerSelectors.basePackage("com.eyiadmin.demo.controller"))                .paths(PathSelectors.any())                .build();    }}

新建一个名为UserController的Controller:

@RequestMapping("/v1/user")@RestController@Api(tags = "User API展示")public class UserController {    @Autowired    UserMapper userMapper;    @GetMapping("/list")    public ResponseResult> getUserList()    {        return ResponseResult.success(userMapper.selectList(null));    }}

启动起来,访问localhost:8080/doc.html:


调用我们的接口,可以看到Druid监控到了我们SQL语句的执行情况


过于Swagger也可以看看我之前的一篇文章Spring Boot集成Swagger

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

hikaricp druid比较_Spring Boot整合MybatisPlus和Druid 的相关文章

  • window中如何用命令行新建文件夹和文件

    1 新建文件夹 D gt mkdir test 通过mkdir 文件夹名 回车即可用命令行工具新建文件夹 2 新建文件 cd test文件目录下 D gt test type nul 文件名 回车即可创建新的文件
  • Element UI的table表格中实现复选框勾选

    需求 在table中实现勾选多行复选框的内容 点击提交按钮 选择的复选框与表格内容对应
  • Matlab 常用快捷键

    MATLAB Numpy函数对照表 http mathesaurus sourceforge net matlab python xref pdf 常见快捷键 Ctrl R 注释代码 Ctrl T 取消注释代码 Ctrl 或 先将光标移动到
  • stm32——PWM实现呼吸灯效果

    使用pwm点亮led 实现呼吸灯效果 led为什么可以越来越亮 越来越暗 由不同的占空比决定 占空比由CCRx决定 1 芯片手册查看引脚pwm通道 2 cubeMX sys设置串口 RCC设置时钟来源 配置时钟 配置io口的pwm输出 三
  • 华为机顶盒系统时间同步服务器,华为悦盒主时间同步服务器地址

    华为悦盒主时间同步服务器地址 内容精选 换一换 华为云存储容灾服务 简称SDRS 提供了虚拟机级别的容灾保护 当主站点故障的时候 虚拟机可以在备站点迅速恢复 以确保业务的联系性 来自 产品 边缘节点既可以是物理机 也可以是虚拟机 边缘节点需
  • Linux下C/C++语言gdb调试方法

    1 gdb参数列表 启动程序准备调试 gdb your proceduce 或者先输入gdb 然后输入 file your proceduce 然后使用run或者r命令开始程序的执行 也可以使用 run parameter将参数传递给该程序
  • 核酸检测安排

    题目描述 在系统 网络均正常的情况下组织核酸采样员和志愿者对人群进行核酸检测筛查 每名采样员的效率不同 采样效率为N人 小时 由于外界变化 采样员的效率会以M人 小时为粒度发生变化 M为采样效率浮动粒度 M N 10 输入保证N 10 的结
  • 软件测试工程师(4k~6k)的工作怎么找?转行IT人特别是应届生得好好看看这篇文章了...

    前言 作为一个入行软件测试10多年的老兵来说 最初我的工作也不是做软件测试的 只是一个偶然后机会可以转到这个行业 所以就豪不犹豫的转到这个行业 虽然前期会感觉有点压力 毕竟没有真正的做过 但是只要在工作中保持积极乐观的态度 多问 多学 多实
  • C语言数据结构篇——用栈实现四则运算

    作者名 Demo不是emo 主页面链接 主页传送门创作初心 舞台再大 你不上台 永远是观众 没人会关心你努不努力 摔的痛不痛 他们只会看你最后站在什么位置 然后羡慕或鄙夷座右铭 不要让时代的悲哀成为你的悲哀专研方向 网络安全 数据结构 每日
  • 【RocketMQ】NameServer总结

    NameServer是一个注册中心 提供服务注册和服务发现的功能 NameServer可以集群部署 集群中每个节点都是对等的关系 没有像ZooKeeper那样在集群中选举出一个Master节点 节点之间互不通信 服务注册 Broker启动的
  • “左三圈右三圈”,莫言开收割机 收割大批网友喜爱

    昨晚十点 莫言公众号如期更新 半夜就有网友在朋友圈里奔走相告 莫言为大家表演开联合收割机啦 看完莫言紧张又努力开收割机的视频 网友直呼 莫言老师抓紧方向盘使劲转动的样子太可爱了 爱了 爱了 在大家的印象中 莫言是深邃而丰腴的大作家 但这个视
  • [STM32F1]STM32上的DWT与延时实现

    对于做单片机程序开发来说 定时管理的需求非常普遍 不管是 系统滴答定时器systick计数器延时或者是通过外设定时器timer的向上向下等计数来延时 甚至在精度要求不高的地方还可以通过变量自加判断来延时 这都是一种延时管理实现的方法 但是对
  • java并发的概念

    1 并发的概念 并发 concurrency 指在同一时刻只能有一条指令执行 但多个进程指令被快速的轮换执行 使得在宏观上具有多个进程同时执行的效果 但在微观上并不是同时执行的 只是把时间分成若干段 使多个进程快速交替的执行 2 并行的概念
  • Ubuntu配置中文环境

    用了一段时间的英文开发了想起来要不换中文试试 所以闲暇之余配置了一个中文 做了一个小记录 这个是英文的环境下面的界面 在安装前简称系统的网络 和源是否正常 检查网络ping www baidu com 检查源 cat etc apt sou
  • 老板的思维模式:投资与浪费

    有人说 人生最大的投资 不是房子 不是股票 是人 是跟什么人交往 跟随什么人 交什么样的朋友 其实就是你投资什么人 而这是对人生影响最大的 钱不会给你机会 股票不会 房子也不会 只有人会给你机会 当你需要帮助的时候 只有跟你要好的人会帮你
  • 企业运维实践-如何在K8S集群环境Gitlab+Jenkins+Jmeter+Grafana技术中实现自动化分布压力测试数据展示...

    关注 WeiyiGeek 公众号 设为 特别关注 每天带你玩转网络安全运维 应用开发 物联网IOT学习 本章目录 0x00 前言简述 0x01 安装配置 在 Windows 中安装 Apache jmeter 工具 以二进制方式安装Helm
  • STM32 定时器

    include timer h include led h 本程序只供学习使用 未经作者许可 不得用于其它任何用途 Mini STM32开发板 通用定时器 驱动代码 正点原子 ALIENTEK 技术论坛 www openedv com 修改
  • 关于char类型变量输入与输出的区别

    笔者前几天看到了一个小项目 请输入一个小写字母 输出对应的大写字母 乍一看挺简单 可实际操作却难倒了我 直到我打开看了老师的视频之后 我才恍然大悟 char的输入其实输入的永远是数字 没有单纯的字符 与此同时char的输出却有两种形式 c对

随机推荐

  • covariance matrix r语言_时间序列分析

    这是关于时间序列的第N篇文章 本文将介绍ARIMAX模型 简单来说就是在ARIMA的基础上增加一个外生变量 ARIMAX和ARIMA相比在理论上没有太多新的内容 所以本文直接介绍在R里怎么一步一步跑ARIMAX 在阅读这篇文章前 需要对AR
  • MySQL 的主从复制原理详解高级

    首先要明白为什么要用 mysql 的主从复制 1 在从服务器可以执行查询工作 即我们常说的读功能 降低主服务器压力 主库写 从库读 降压 2 在从主服务器进行备份 避免备份期间影响主服务器服务 确保数据安全 3 当主服务器出现问题时 可以切
  • eclipse中package,source folder和folder

    在eclipse的Package explorer中 如下图所示 Source folder 存放Java的源代码 eclipse会自动编译里面的文件 以 来进行文件夹的分级 默认为src文件夹 Package 一般位于source fol
  • 【深度学习】 Python 和 NumPy 系列教程(六):Python容器:4、字典Dictionary详解(初始化、访问元素、常用操作、常用函数、遍历、解析)

    目录 一 前言 二 实验环境 三 Python容器 Containers 0 容器介绍 4 字典 Dictionary 0 基本概念 1 初始化 a 使用 创建字典 b 使用dict 函数创建字典 2 访问字典元素 a 使用方括号 b 使用
  • nexus下载安装

    进入官网http www sonatype org 点击Jion Now 展开downloads 选择Nexus Repository Manager OSS 目前已经更新到3 X了 这里暂且还是选2 X的吧 下载完 解压 cmd打开命令提
  • 【软件工程】第五章 结构化设计

    5 1 结构化设计的概念 5 1 1 设计的定义 何谓设计 一种软件开发活动 定义实现需求规约所需的软件结构 目标 依据需求规约在一个抽象层上建立系统软件模型 包括软件体系结构 数据和程序结构 以及详细的处理算法 给出软件解决方案 产生设计
  • 欧拉回路【总结】【题解】

    题目 欧拉回路 UOJ 欧拉回路 Liuser s OJ 题目描述 有一天一位灵魂画师画了一张图 现在要你找出欧拉回路 即在图中找一个环使得每条边都在环上出现恰好一次 一共两个子任务 无向图 有向图 输入格式 第一行一个整数 t 表示子任务
  • vue项目启动后,js-base64依赖报错Cannot read properties of null (reading ‘replace’)

    cannot read properties of null reading replace 关于这种乱七八糟的问题 咱也不敢说 在哪也不敢问 项目运行之后 有一些警告 都是一些依赖版本的问题 平时也能直接给运行起来 这次就是项目可以运行起
  • rabbitmq+springboot实现幂等性操作

    文章目录 1 场景描述 1 1 场景1 1 2 场景2 2 原理 3 实战开发 3 1 建表 3 2 集成mybatis plus 3 3 集成RabbitMq 3 3 1 安装mq 3 3 2 springBoot集成mq 3 4 具体实
  • 阿里云服务器使用xshell连接

    阿里云服务器使用xshell连接 当购买了第一次阿里云服务器时 如何使用xshell连接 其实是非常简单的 1 登录阿里云控制台 1 是你的阿里云服务器所在地址 2 是公网IP 将来远程连接时需要使用 3 是设置远程连接的密码 用户名默认r
  • 在x86和arm编译libmodbus

    编译libmodbus 下载路径 1 编译准备 sudo apt get install libtool autogen sh 2 arm编译 autogen sh mkdir install configure ac cv func ma
  • 电压电流的驱动能力分析以及计算方法

    文章为笔者学习过程中看到的 感觉帮助较大 分享出来希望能帮助到大家 在电子电路中为什么有的地方电压会被拉低2 驱动能力是什么意思 如何提高驱动能力 在很多资料上看到说驱动能力不够是因为提供的电流太小 为什么不说电压呢 在很多限制的条件都是电
  • BIOS开启虚拟化技术

    什么是BIOS BIOS 是一个内置于个人计算机的程序 当您打开计算机时该程序启动操作系统 也称为系统固件 BIOS 是计算机硬件的一部分 不同于 Windows 怎么进入BIOS 电脑进入BIOS的方法各有不同 通常会在开机时 显示电脑l
  • atoi函数源代码

    atoi函数源代码 isspace int x if x x t x n x f x b x r return 1 else return 0 isdigit int x if x lt 9 x gt 0 return 1 else ret
  • CPU是如何读写内存的?

    如果你不知道CPU是如何读写内存的 那你应该好好看看这篇文章 如果你觉得这是一个非常简单的问题 那你更应该好好读读本文 这个问题绝没有你想象那么简单 一定要读完 闲话少说 让我们来看看CPU在读写内存时底层究竟发生了什么 1 谁来告诉CPU
  • Mybatis二级缓存应用场景和局限性

    二级缓存应用场景 对查询频率高 变化频率低的数据建议使用二级缓存 对于访问多的查询请求且用户对查询结果实时性要求不高 此时可采用mybatis二级缓存技术降低数据库访问量 提高访问速度 业务场景比如 耗时较高的统计分析sql 电话账单查询s
  • ChatGPT是否具有记忆能力?

    ChatGPT在某种程度上具有记忆能力 但它的记忆能力有限且不像人类的记忆那样全面和持久 以下是对ChatGPT的记忆能力的详细分析 1 上下文记忆 ChatGPT可以在对话过程中记住先前的对话历史 以便更好地理解和回应后续的问题 通过将上
  • 带你了解并实践monorepo和pnpm,绝对干货!熬夜总结!

    大厂技术 高级前端 Node进阶 点击上方 程序员成长指北 关注公众号 回复1 加入高级Node交流群 为什么使用monorepo 什么是monorepo 简单来说就是 将多个项目或包文件放到一个git仓库来管理 目前比较广泛应用的是yar
  • java面试笔试基本知识点总结

    1 正则表达式 正则表达式定义了字符串的模式 正则表达式可以用来搜索 编辑或处理文本 正则表达式并不仅限于某一种语言 但是在每种语言中有细微的差别 在编写处理字符串的程序时 经常会有查找符合某些复杂规则的字符串的需要 正则表达式就是用于描述
  • hikaricp druid比较_Spring Boot整合MybatisPlus和Druid

    在Java中 我比较ORM熟悉的只有Hibernate和Mybatis 其他的并未实践使用过 在这二者之间我更喜欢Mybatis 因为它精简 灵活 毕竟我是上年纪的程序员 喜欢自己写SQL 刚才有提到Mybatis 但是这里的重点是介绍My