Spring Boot 数据库操作Druid和HikariDataSource

news2024/11/24 8:36:27

目录

Spring Boot  数据库操作

应用实例-需求

创建测试数据库和表

进行数据库开发, 在pom.xml 引入data-jdbc starter

参考官方文档

需要在pom.xml 指定导入数据库驱动

在application.yml 配置操作数据源的信息

创建bean\Furn.java

测试结果

整合Druid 到Spring-Boot 

官方文档

Durid 基本使用

修改pom.xml , 引入druid 依赖

创建DruidDataSourceConfig.java 配置类

完成测试,运行ApplicationTests.java , 观察数据源的运行类型

Durid 监控功能-SQL 监控

 完成测试

修改DruidDataSourceConfig.java , 加入监控功能 

 创建DruidSqlController.java

SQL 监控数据-测试页面

Durid 监控功能-Web 关联监控

Web 关联监控配置-Web 应用、URI 监控

为了测试方便,修改/WebConfig.java, 放行/sql 请求

重启项目,看看Web 应用和URI 监控页面

Durid 监控功能-SQL 防火墙

 修改DruidDataSourceConfig.java ,加入防火墙监控

 完成测试,重启项目,看看SQL 防火墙监控是否生效

Durid 监控功能-Session 监控

Session 监控

Druid Spring Boot Starter

基本介绍

修改pom.xml 注销druid 的依赖

注销DruidDataSourceConfig.java

查看druid 文档https://github.com/alibaba/druid,引入druid starter

确认druid starter 引入哪些依赖

​编辑

修改resources/application.yml 增加配置参数 

重启项目,完成测试


Spring Boot  数据库操作

JDBC+HikariDataSource

应用实例-需求

● 需求:演示Spring Boot 如何通过jdbc+HikariDataSource 完成对Mysql 操作

说明: HikariDataSource : 目前市面上非常优秀的数据源, 是springboot2 默认数据源

创建测试数据库和表

-- 创建furns_ssm
DROP DATABASE IF EXISTS spring_boot;
CREATE DATABASE spring_boot;
USE spring_boot;
-- 创建家居表
CREATE TABLE furn(
`id` INT(11) PRIMARY KEY AUTO_INCREMENT, ## id
`name` VARCHAR(64) NOT NULL, ## 家居名
`maker` VARCHAR(64) NOT NULL, ## 厂商
`price` DECIMAL(11,2) NOT NULL, ## 价格
`sales` INT(11) NOT NULL, ## 销量
`stock` INT(11) NOT NULL, ## 库存
`img_path` VARCHAR(256) NOT NULL ## 照片路径
);
-- 初始化家居数据
INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , ' 北欧风格小桌子' , ' 熊猫家居' , 180 , 666 , 7 ,
'assets/images/product-image/1.jpg');
INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , ' 简约风格小椅子' , ' 熊猫家居' , 180 , 666 , 7 ,
'assets/images/product-image/2.jpg');
INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , ' 典雅风格小台灯' , ' 蚂蚁家居' , 180 , 666 , 7 ,
'assets/images/product-image/3.jpg');
INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , ' 温馨风格盆景架' , ' 蚂蚁家居' , 180 , 666 , 7 ,
'assets/images/product-image/4.jpg');
SELECT * FROM furn;

进行数据库开发, 在pom.xml 引入data-jdbc starter

参考官方文档

https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.build-syst
ems.starters .

        <!--进行数据库开发,引入data-jdbc starter-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>

 

 

需要在pom.xml 指定导入数据库驱动

因为Spring Boot 不知道项目要操作Mysql 还是Oracle , 需要在pom.xml 指定导入数据库驱动, 并指定对应版本.

        <!--引入mysql的驱动
        1. 说明这里没有使用版本仲裁  <mysql.version>8.0.26</mysql.version>
        2. 指定的版本是5.1.49
        -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.49</version>
        </dependency>

在application.yml 配置操作数据源的信息

spring:
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 50MB
  datasource: #配置数据源
    # 说明: 如果你没有指定useSSL=true ,启动项目会报红警告, 环境的问题,要灵活处理
    url: jdbc:mysql://localhost:3306/spring_boot?useSSL=true&useUnicode=true&characterEncoding=UTF-8
    username: root
    password: 自己的密码
    driver-class-name: com.mysql.jdbc.Driver

创建bean\Furn.java

public class Furn {
    private Integer id;

    private String name;

    private String maker;

    private BigDecimal price;

    private Integer sales;

    private Integer stock;

    private String imgPath = "assets/images/product-image/1.jpg";

    public Furn(Integer id, String name, String maker, BigDecimal price, Integer sales, Integer stock, String imgPath) {
        this.id = id;
        this.name = name;
        this.maker = maker;
        this.price = price;
        this.sales = sales;
        this.stock = stock;
        this.imgPath = imgPath;
    }

    public Furn() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getMaker() {
        return maker;
    }

    public void setMaker(String maker) {
        this.maker = maker;
    }

    public BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    public Integer getSales() {
        return sales;
    }

    public void setSales(Integer sales) {
        this.sales = sales;
    }

    public Integer getStock() {
        return stock;
    }

    public void setStock(Integer stock) {
        this.stock = stock;
    }

    public String getImgPath() {
        return imgPath;
    }

    public void setImgPath(String imgPath) {
        this.imgPath = imgPath;
    }

    @Override
    public String toString() {
        return "Furn{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", maker='" + maker + '\'' +
                ", price=" + price +
                ", sales=" + sales +
                ", stock=" + stock +
                ", imgPath='" + imgPath + '\'' +
                '}';
    }
}

测试结果

test 目录下的usersys/ApplicationTests.java , 完成测试

如果不知道JdbcTemplate请看一下spring的博客文章 

使用BeanPropertyRowMapper时,是给query()方法传递一个BeanPropertyRowMapper对象让JdbcTemplate帮我们把执行sql语句的结果集自动帮我们封装到对应的属性

@SpringBootTest
public class ApplicationTests {

    //如果不知道JdbcTemplate请看一下spring的博客文章
    @Resource
    private JdbcTemplate jdbcTemplate;

    @Test
    public void contextLoads() {

        BeanPropertyRowMapper<Furn> rowMapper =
                new BeanPropertyRowMapper<>(Furn.class);

        List<Furn> furns = jdbcTemplate.query("SELECT * FROM `furn`", rowMapper);
        for (Furn furn : furns) {
            System.out.println(furn);
        }

        System.out.println(jdbcTemplate.getDataSource().getClass());
    }
}

整合Druid 到Spring-Boot 

官方文档

使用手册: https://github.com/alibaba/druid 

中文手册: https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98

基本介绍
1. HiKariCP: 目前市面上非常优秀的数据源, 是springboot2 默认数据源

2. Druid: 性能优秀,Druid 提供性能卓越的连接池功能外 这个在专题javaEE的数据库和jdbc的这篇博客中有说明 链接

,还集成了SQL 监控,黑名单拦截等功能,强大的监控特性,通过Druid 提供的监控功能,可以清楚知道连接池和SQL 的工作情况,所以根据项目需要,我们也要掌握Druid 和SpringBoot 整合

3. 整合Druid 到Spring-Boot 方式

        ● 自定义方式
        ● 引入starter 方式

Durid 基本使用

需求: 将Spring-Boot 的数据源切换成Druid

修改pom.xml , 引入druid 依赖

        <!--引入druid starter-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.17</version>
        </dependency>

创建DruidDataSourceConfig.java 配置类

@Configuration
public class DruidDataSourceConfig {

    //编写方法,注入DruidDataSource
    //还有说明一下为什么我们注入自己的DataSource , 默认的HiKariDatasource失效?
    //1. 默认的数据源是如配置? @ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
    //  解读通过@ConditionalOnMissingBean({ DataSource.class}) 判断如果容器有DataSource Bean 就不注入默认的HiKariDatasource
    @ConfigurationProperties("spring.datasource")
    @Bean
    public DataSource dataSource() throws SQLException {
        //1. 配置了 @ConfigurationProperties("spring.datasource")
        //   就可以读取到application.yml的配置
        //2. 我们就不需要调用DruidDataSource 对象的setXxx, 会自动关联

        DruidDataSource druidDataSource = new DruidDataSource();
        return druidDataSource;
    }
}

完成测试,运行ApplicationTests.java , 观察数据源的运行类型

Durid 监控功能-SQL 监控

需求: 配置Druid 的监控功能,包括SQL 监控、SQL 防火墙、Web 应用、Session 监控等 

修改DruidDataSourceConfig.java , 增加druid 监控功能

地址:
https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AE 

    //配置druid的监控页功能
    @Bean
    public ServletRegistrationBean statViewServlet() {
        //创建StatViewServlet
        StatViewServlet statViewServlet = new StatViewServlet();
        ServletRegistrationBean<StatViewServlet> registrationBean =
                new ServletRegistrationBean<>(statViewServlet, "/druid/*");
        //设置init-parameter, 设置用户名和密码
        registrationBean.addInitParameter("loginUsername", "wyx");
        registrationBean.addInitParameter("loginPassword", "666666");

        return registrationBean;
    }

 完成测试

访问http://localhost:10000/druid/index.html 不会被拦截, 如果没有问题,会看到这个页面

修改DruidDataSourceConfig.java , 加入监控功能 

参考: https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter

 创建DruidSqlController.java

@Controller
public class DruidSqlController {

    @Resource
    private JdbcTemplate jdbcTemplate;

    @ResponseBody
    @GetMapping("/sql")
    public List<Furn> crudDB() {

        BeanPropertyRowMapper<Furn> rowMapper = new BeanPropertyRowMapper<>(Furn.class);
        List<Furn> furns = jdbcTemplate.query("select * from `furn`", rowMapper);
        for (Furn furn : furns) {
            System.out.println(furn);
        }
        return furns;
    }
}

SQL 监控数据-测试页面

● 完成测试, 观察SQL 监控数据, 浏览器http://localhost:10000/druid/sql.html

Durid 监控功能-Web 关联监控

需求: 配置Web 关联监控配置:Web 应用、URI 监控

官方文档

https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98

Web 关联监控配置-Web 应用、URI 监控

DruidDataSourceConfig.java , 注入/ 增加WebStatFilter 用于采集web-jdbc 关联监控的数据

    //配置WebStatFilter, 用于采集web-jdbc关联的监控数据
    @Bean
    public FilterRegistrationBean webStatFilter() {
        //创建 WebStatFilter
        WebStatFilter webStatFilter = new WebStatFilter();

        FilterRegistrationBean<WebStatFilter> filterRegistrationBean =
                new FilterRegistrationBean<>(webStatFilter);

        //默认对所有的url请求进行监控
        filterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));

        //排除指定的url
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return filterRegistrationBean;
    }

为了测试方便,修改/WebConfig.java, 放行/sql 请求

重启项目,看看Web 应用和URI 监控页面

完成测试,重启项目,看看Web 应用和URI 监控是否生效

 

 

Durid 监控功能-SQL 防火墙

需求: 配置SQL 防火墙

官方文档https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98

 

 修改DruidDataSourceConfig.java ,加入防火墙监控

    @ConfigurationProperties("spring.datasource")
    @Bean
    public DataSource dataSource() throws SQLException {
        //1. 配置了 @ConfigurationProperties("spring.datasource")
        //   就可以读取到application.yml的配置
        //2. 我们就不需要调用DruidDataSource 对象的setXxx, 会自动关联

        DruidDataSource druidDataSource = new DruidDataSource();
        //加入监控功能, 加入了sql防火墙监控
        druidDataSource.setFilters("stat,wall");
        return druidDataSource;
    }

 完成测试,重启项目,看看SQL 防火墙监控是否生效

 

Durid 监控功能-Session 监控

需求: 配置Session 监控

官方文档https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98 

  

Session 监控

重启项目, 先登录管理系统

完成测试, 查看监控页需要输入用户名和密码, 点击Session 监控,可以看到相关信息
(注意要登录用户系统,才能看到Session 监控信息)

 

 

Druid Spring Boot Starter

基本介绍

1. 前面我们使用的是自己引入druid+配置类方式整合Druid 和监控
2. Druid Spring Boot Starter 可以让程序员在Spring Boot 项目中更加轻松集成Druid 和监控 

修改pom.xml 注销druid 的依赖

注销DruidDataSourceConfig.java

这时测试,druid 失效 

查看druid 文档https://github.com/alibaba/druid,引入druid starter

确认druid starter 引入哪些依赖

修改resources/application.yml 增加配置参数 

spring:
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 50MB
  datasource: #配置数据源
    # 说明: 如果你没有指定useSSL=true ,启动项目会报红警告, 环境的问题,灵活处理
    url: jdbc:mysql://localhost:3306/spring_boot?useSSL=true&useUnicode=true&characterEncoding=UTF-8
    username: root
    password: 自己的密码
    driver-class-name: com.mysql.jdbc.Driver
    #配置druid和监控功能
    druid:
      stat-view-servlet:
        enabled: true
        login-username: jack
        login-password: 666
        reset-enable: false
      web-stat-filter: #配置web监控
        enabled: true
        url-pattern: /*
        exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
      filter:
        stat: #sql监控
          slow-sql-millis: 1000
          log-slow-sql: true
          enabled: true
        wall: #配置sql防火墙
          enabled: true
          config:
            drop-table-allow: false
            select-all-column-allow: false

重启项目,完成测试

测试完成后,记得改回成原来的代码.(个人习惯) ...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/540386.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

六、easyUI中的window(窗口)组件

1.window&#xff08;窗口&#xff09;组件的概述 窗口控件是一个浮动和可拖拽的面板&#xff0c;它可以用作应用程序窗口。默认情况下&#xff0c;窗口可以移动&#xff0c;调整大小和关闭。它的内容也可以被定义为静态HTML或要么通过Ajax动态加载 2.window&#xff08;窗口&…

MySQL-备份+日志:介质故障与数据库恢复

MySQL-备份日志&#xff1a;介质故障与数据库恢复 第1关&#xff1a;备份与恢复任务描述相关知识MySQL的恢复机制MySQL的备份与恢复工具编程要求代码参考 第2关 备份日志&#xff1a;介质故障的发生与数据库的恢复任务描述相关知识编程要求测试说明代码参考 第1关&#xff1a;备…

《分布式微服务电商源码》-项目简介

1.常见的电商模式 市面上有 5 种常见的电商模式 B2B、B2C、C2B、C2C、O2O 1.1.B2B 模式 B2B(Business to Business)&#xff0c;是指商家和商家建立的商业关系&#xff0c;如阿里巴巴. 1.2.B2C 模式 B2C(Business to Consumer) 就是我们经常看到的供应商直接把商品买个用户&a…

057:cesium设置纯颜色材质

第057个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置纯颜色的材质,颜色的表达方式可以参考这篇文章 Cesium七种方法设置颜色 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共87行)相关API参考:专…

用友BIP新零售产品发布,与零售企业共创新未来

随着数智化时代的到来&#xff0c;零售企业不断面临着更多的挑战和机遇。为了满足消费者多元化的需求&#xff0c;零售企业需要采用多种方式来提高竞争力&#xff0c;如多渠道销售、线上线下融合、数智化运营、个性化营销和无缝化体验等。用友BIP新零售为零售企业提供了数智化转…

Jenkins的持续集成与持续部署

系统总体架构 Gitlab Gitlab是一款主要用于代码管理的工具&#xff0c;相较于GitHub&#xff0c;可以自己搭建服务器&#xff0c;这可以避免因为网络速度慢导致部署效率低下&#xff0c;同时&#xff0c;自己搭建服务器&#xff0c;安全性更高。Jenkins Jenkins主要用于管理版本…

改图片分辨率:提升图像质量的关键步骤

无论您是一名摄影师、设计师&#xff0c;还是一个爱好者&#xff0c;改变图片分辨率都是必不可少的工作。在本文中&#xff0c;我们将介绍改图片分辨率的作用以及它在哪些场景下使用。 改图片分辨率介绍 图片分辨率是指图像中所包含的像素数量&#xff0c;通常以“每英寸像素…

threejs 相机OrbitControls常用方法及属性

相机控件OrbitControls 通过OrbitControls可以对三维场景进行缩放、平移、旋转&#xff0c;本质上改变的不是场景&#xff0c;而是相机的参数&#xff0c;相机的位置角度不同&#xff0c;同一个场景的渲染效果是不一样&#xff0c;比如相机围绕着一个场景旋转&#xff0c;就像…

有哪些工具软件一旦用了就离不开?

&#x1f496;前言 目前&#xff0c;随着科技的快速发展&#xff0c;电脑已经进入了许许多多人的生活 &#xff0c;在平日的学习、工作和生活里&#xff0c;我们会用的各种各样的强大软件。市面上除了某些大公司开发在强大软件&#xff0c;还有各路大神开发具有某些功能的强大…

nodejs+vue网上课程在线教学网站平台a53y0

(1) vue引入elementui 1.使用npm安装element-ui npm i element-ui -S 2.在main.js中导入使用vue import element-ui/lib/theme-chalk/index.css //别忘了导入样式 import ElementUI from element-ui Vue.use(ElementUI) 后端&#xff1a;java(springbootssm)/python/php/node…

MySQL入门到精通——运维篇(基础篇——进阶篇——运维篇)本文以MySQL8.0版本以上为例

文章目录 前言MySQL——运维篇一、日志1.日志-错误日志2.日志-二进制日志3.日志-查询日志4.日志-慢查询日志 二、主从复制1.主从复制-概述2.主从复制-原理3.主从复制-搭建3.1.主从复制-搭建-主库配置3.2.主从复制-搭建-从库配置3.2.主从复制-搭建-测试 三、分库分表1.分库分表-…

Nacos简介和安装

1.Nacos简介 1.1.为什么叫Nacos 前四个字母分别为Naming和Configuration的前两个字母&#xff0c;最后的s为Service。 1.2.是什么 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos: Dynamic Naming and Configuration ServiceNacos就是注册中心&am…

Fiddler 到底能做什么?一篇文章给你详细介绍

Fiddler是检查 Http 流量的最流行的工具之一。此工具可帮助我们非常轻松地测试 REST API / SOAP Web 请求。 题主的问题&#xff1a;Fiddler 到底能做什么。仔细思考&#xff0c;其实有两层意思&#xff1a; 第一层&#xff1a;Fiddler工具的应用范围 第二层&#xff1a;Fiddl…

手搓哈希表

手搓哈希 哈希概念哈希冲突为什么会有哈希冲突的产生?常见的哈希函数 如何解决哈希冲突&#xff1f;闭散列闭散列的简单模拟实现插入查找删除 总代码开散列开散列的模拟实现插入删除查找 存在的问题迭代器 开散列总的代码 哈希概念 顺序结构以及平衡树中&#xff0c;元素关键码…

在研制带处理器的电子产品时,如何提高抗干扰能力和电磁兼容性?

一、下面的一些系统要特别注意抗电磁干扰 1、微控制器时钟频率特别高&#xff0c;总线周期特别快的系统。 2、系统含有大功率&#xff0c;大电流驱动电路&#xff0c;如产生火花的继电器&#xff0c;大电流开关等。 3、含微弱模拟信号电路以及高精度A/D变换电路的系统。 二、…

GPU物理位置查询:从nvidia编号到物理位置

supermicro AS -4125GS-TNRT 服务器GPU出现问题&#xff0c;有几张GPU速度较慢。需要确定其物理位置,具体流程如下&#xff1a; 1 GPU编号与BUS_ID对应关系 使用nvidia-smi即可查看&#xff0c;如下所示&#xff1a;![在这里插入图片描述](https://img-blog.csdnimg.cn/3807d…

分布式锁解决方案_基于Redisson实现的分布式锁实现

Redisson介绍&#xff1a; https://github.com/redisson/redisson/wiki Redisson - 是一个高级的分布式协调Redis客服端&#xff0c;能帮助用户在分布式环境中轻松实现一些Java的对象&#xff0c;Redisson、Jedis、Lettuce是三个不同的操作 Redis 的客户端&#xff0c;Jedis、…

常见的8种用户需求评估方法

1、人性法 在评估用户需求时&#xff0c;需要判断这个需求所实现的功能&#xff0c;是否符合人性&#xff0c;与哪几种人性相匹配&#xff0c;如果非常匹配则值得做。当然并不是需求反应的人性越多越好&#xff0c;需要根据团队实际资源做到极致。 如格林人性法则包括&#xff…

【已解决】Arduino编译错误error: ordered comparison of pointer with integer zero的解决方法

在使用Arduino的资源库对STM32编程时&#xff0c;出现&#xff1a; error: ordered comparison of pointer with integer zero (byte* {aka unsigned char*} and int) 编译错误的解决方法。 Arduino因其开源和易用性&#xff0c;丰富的三方资源&#xff0c;受到很多人的喜欢…

CCIG 2023 从视觉-语言模型到智能文档图像处理

前言 一、视觉-语言模型是什么&#xff1f; 二、视觉-语言模型可以用来做什么&#xff1f; 三、视觉-语言 预训练模型 3.1、模型架构 3.2、训练目标 3.2.1、图像-文本匹配损失&#xff08;ITM&#xff09; 3.2.2、掩码语言建模损失&#xff08;MLM&#xff09; 3.2.3、…