7.springboot中使用Druid数据源实现CRUD(使用jdbcTemplate模版)

前言

一、Druid是什么?

在java中要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池。
Druid 是阿里巴巴开源平台上一个数据库连接池实现,结合了 C3P0、DBCP 等 DB 池的优点,同时加入了日志监控,并且 Hikari 与 Driud 都是当前 Java Web 上最优秀的数据源。
Druid优点:强大的监控特性、方便扩展、监控连接池的物理连接创建和销毁次数、逻辑连接的申请和关闭次数、非空等待次数、PSCache命中率等

二、使用步骤

1.添加数据源的依赖和日志的依赖

<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.4</version>
        </dependency>
   <!-- log4j -->
		<dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

注:springboot默认使用的是Hikari ,我们可以通过在application.yml中配置druid数据源

spring:
  datasource:
    username: root
    password: 123456
    #?serverTimezone=UTC解决时区的报错
    url: jdbc:mysql://localhost:3306/springmybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
    driver-class-name: com.mysql.cj.jdbc.Driver
    #修改数据源类型
    type: com.alibaba.druid.pool.DruidDataSource

测试:在测试类中测试是否成功

@SpringBootTest
class SpringbootjdbcApplicationTests {

    @Autowired
    DataSource dataSource;

    @Test
    void contextLoads() throws SQLException {
        //看一下默认数据源
        System.out.println(dataSource.getClass());
        //获得连接
        Connection connection =   dataSource.getConnection();
        System.out.println(connection);
        System.out.println("......");

        /*注入数据源并且测试*/
        //测试数据源druid是否配置成功
        DruidDataSource druidDataSource = (DruidDataSource) dataSource;
        System.out.println("druidDataSource 最大连接池数:"+druidDataSource.getMaxActive());
        System.out.println("druidDataSource 数据源初始化连接数:"+druidDataSource.getInitialSize());
        //关闭连接
        connection.close();
    }

在这里插入图片描述

2.配置Druid数据源监控

注:Druid 数据源具有监控的功能,并提供了一个 web 界面方便用户查看数据的变化。所以第一步需要设置 Druid 的后台管理页面,比如 登录账号、密码 等;配置后台管理。
提示:努力去看源码才能更加进步。
这也是从源码仿抄过来的
代码如下(示例):

/*
* 现在需要程序员自己为 DruidDataSource 绑定全局配置文件中的参数,再添加到容器中,
* 而不再使用 Spring Boot 的自动生成了;
* 我们需要 自己添加 DruidDataSource 组件到容器中,并绑定属性;
* */
@Configuration
public class DruidConfig {
    /*将自定义的 Druid数据源添加到容器中,不再让 Spring Boot 自动创建
       绑定全局配置文件中的 druid 数据源属性到 com.alibaba.druid.pool.DruidDataSource从而让它们生效
       @ConfigurationProperties(prefix = "spring.datasource"):作用就是将 全局配置文件中
       前缀为 spring.datasource的属性值注入到 com.alibaba.druid.pool.DruidDataSource 的同名参数中*/

    /*配置指定的yml中取得值*/
    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource druidDataSour(){
        return new DruidDataSource();
    }
    /*配置监控*/
    //配置 Druid 监控管理后台的Servlet;
    //内置 Servlet 容器时没有web.xml文件,所以使用 Spring Boot 的注册 Servlet 方式
    @Bean
    public ServletRegistrationBean statViewServlet(){
        //写入构造器
        ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");

        //这些参数可以在com.alibaba.druid.support.http.StatViewServlet
        // 的父类 com.alibaba.druid.support.http.ResourceServlet 中找到
        //读源码的方式导入
        Map<String,String> initParams = new HashMap<>();
        initParams.put("loginUsername","admin");//后台管理界面的登录账户
        initParams.put("loginPassword","123456");//后台管理界面的登录密码

        //后台允许谁可以访问
        //initParams.put("allow","localhsot");//表示只有本机可以访问
        initParams.put("allow","");//为空或者未null时,表示允许所有访问

        //deny:Druid 后台拒绝谁可以访问
        //initParams.put("kuangshen","192.168.1.20");//禁止该ip访问

        //设置初始化参数
        bean.setInitParameters(initParams);
        return bean;
    }

运行界面:http://localhost:8080/druid/login.html
在这里插入图片描述
在这里插入图片描述

2.注入jdbcTemplate实现CURD

进行CRUD(增删改查)
1.导入依赖

		<!--jdbc-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        
        <!--mysql连接-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

2.配置数据库连接

spring:
  datasource:
  	#数据用户名
    username: root
    #数据库密码
    password: 123456
    #?serverTimezone=UTC解决时区的报错
    url: jdbc:mysql://localhost:3306/springmybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
    driver-class-name: com.mysql.cj.jdbc.Driver
    #修改数据源类型
    type: com.alibaba.druid.pool.DruidDataSource

    #Spring Boot 默认是不注入这些属性值的,需要自己绑定
    #druid 数据源专有配置
    # 初始化时建立物理连接的个数
    initialSize: 5
    # 最小连接池数量
    minIdle: 5
    maxActive: 20
    # 最大等待时间
    maxWait: 60000
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true

    #配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
    #如果允许时报错  java.lang.ClassNotFoundException: org.apache.log4j.Priority
    #则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j
    filters: stat,wall,log4j
    maxPoolPreparedStatementPerConnectionSize: 20
    useGlobalDataSourceStat: true
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

3.CRUD

package com.jdbc.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

//http://localhost:8080/jdbc/list
//也可以用
//@RestController
@Controller
@ResponseBody
@RequestMapping(value = "/jdbc")
public class JDBCController {
    /**
     * Spring Boot 默认提供了数据源,默认提供了 org.springframework.jdbc.core.JdbcTemplate
     * JdbcTemplate 中会自己注入数据源,用于简化 JDBC操作
     * 还能避免一些常见的错误,使用起来也不用再自己来关闭数据库连接
     */
    @Autowired
    JdbcTemplate jdbcTemplate;
    /*public String queryAll(){
        String sql = "select * from user"
    }*/
    //查询所有 在没有实体类的情况下使用增删改查
    @GetMapping("/list")
    public List<Map<String,Object>> findList(){
       String sql = "select * from user";
       List<Map<String,Object>> maps = jdbcTemplate.queryForList(sql);
       return maps;
    }
    //新增一个
    @GetMapping("/add")
    public String addList(){
        //插入语句,注意时间问题
        String sql = "insert into user(name,pwd)" + " values ('哈哈',123456)";
        jdbcTemplate.update(sql);
        return "addOk";
    }
    //修改
    //http://localhost:8080/jdbc/update/2
    //也可以写固定id
    @GetMapping("/update/{id}")
    public String updateList(@PathVariable("id") int id){
        //将语句放到sql中
        String sql = "update user set name=?,pwd=? where id="+id;
        //声明一个数组存放信息
        Object[] objects = new Object[2];
        objects[0]="修改";
        objects[1]=123456;
        //使用模版执行结果
        jdbcTemplate.update(sql,objects);
        return "updateYes";
    }
    //删除一个
    @GetMapping("/delete/{id}")
    public String deleteList(@PathVariable("id") int id){
        String sql = "delete from user where id=?";
        jdbcTemplate.update(sql,id);
        return "deleteYes";
    }
    /*//删除一个
    @GetMapping("/deletes/{id}")
    public String delete(@PathVariable("id") int id){
        jdbcTemplate.update("delete from user where id=?",id);
        return "deleteYes";
    }*/
}

注:这已经是偏向于javaweb的代码l,直接在表现层写,没有经过持久和dao和业务service,当然我们开发的时候不需要用这种方式。
运行成功
在这里插入图片描述
查看监控
在这里插入图片描述

总结

好好学习,少玩手机、多看书、加油加油加油。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值