druid连接池_SpringBoot整合JDBCTemplate及Druid连接池

SpringBoot整合JDBCTemplate

本篇文章将会介绍用SpringBoot整合JDBCTemplate来实现简单的增删改查的功能、及通过SpringBoot整合Druid数据库连接池实时监控数据库的连接信息 ,为优化数据库性能提供更好的指导。

前言

在使用JDBCTemplate之前,我们先来了解一下JDBC。它是java用于连接数据库的规范,也就是用于执行数据库SQL语句的java API。是由一组用java语言编写的类和接口组成,为大部分关系型数据库提供了访问接口。
而JDBC每次使用前进行数据库的连接,然后处理SQL语句、传值、关闭数据库等,如果都由开发人员编写代码,很容易出错,可能会出现在使用完成以后,数据库连接忘记关闭的情况,从而导致连接被占用降低性能,为了减少这种可能的错误,减少开发人员的工作量,JDBCTemplate就被设计出来了。


JdbcTemplate是Spring提供的一套JDBC模板框架,利用AOP技术来解决直接使用JDBC时大量重复代码的问题。JdbcTemplate虽然没有MyBatis那么的灵活,但是比直接使用JDBC要方便很多。
下面就通过一个实例来具体介绍JDBCTemplate的使用:

开发工具及环境: IDEA、Maven、jdk1.8、Mysql、postman、

一、创建数据库

创建表(book)

二、项目结构

三、导入依赖

在pom.xml文件中引入下面依赖:


        
            org.springframework.boot
            spring-boot-starter-jdbc
        
        
        
            com.alibaba
            druid
            1.1.9
        

        
        
            mysql
            mysql-connector-java
            5.1.37
            runtime
        

        
            log4j
            log4j
            1.2.17
        

四、配置数据库连接信息

在这里使用的是application.yml的配置文件:

spring:
  datasource:
    username: root
    password: 123
    url: jdbc:mysql://localhost:3306/jdbctemplate?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.jdbc.Driver
#    使用Druid数据源
    type: com.alibaba.druid.pool.DruidDataSource



    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注入
    filters: stat,wall,log4j
    maxPoolPreparedStatementPerConnectionSize: 20
    useGlobalDataSourceStat: true
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

五、创建实体类

Book.java
package com.example.entity;

/**
 * @author 2017810402084
 */
public class Book {
    private Integer id;
    private String name;
    private String author;

    public Book() {
    }

    public Book(Integer id, String name, String author) {
        this.id = id;
        this.name = name;
        this.author = author;
    }

    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 getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", name='" + name + ''' +
                ", author='" + author + ''' +
                '}';
    }
}

六、创建数据库访问层(DAO)

BookDao.java
package com.example.dao;

import com.example.entity.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * @author 2017810402084
 */

@Repository
public class BookDao {

    @Autowired
    JdbcTemplate  jdbcTemplate;

    public int addBook(Book book) {
        return jdbcTemplate.update("insert into book(name,author) values (?,?)",book.getName(),book.getAuthor());
    }

    public int updateBook(Book book) {
        return jdbcTemplate.update("update book set name = ?,author = ? where id = ?" ,book.getName(),book.getAuthor(),book.getId());
    }

    public int deleteBook(Integer id) {
        return jdbcTemplate.update("delete from book where id = ?",id);
    }

    public Book getBookById(Integer id) {
        return jdbcTemplate.queryForObject("select *  from book where id = ?",new BeanPropertyRowMapper<>(Book.class),id);
    }

    public List getAllBooks() {
        return jdbcTemplate.query("select *  from book",new BeanPropertyRowMapper<>(Book.class));
    }
}
  • jdbcTemplate中,增删改操作主要使用updatebatchUpdate方法来完成的。
  • queryqueryForObject方法主要来完成查询的功能。

七、创建Controller

BookController.java
package com.example.controller;

import com.example.entity.Book;
import com.example.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


import java.util.List;

/**
 * @author 2017810402084
 */

@RestController
@RequestMapping("/book")
public class BookController {

    @Autowired
    private BookService bookService;

    @RequestMapping(value = "/addBook")
    public String addBook() {
        Book book = new Book("数据库","李四");
        int result =  bookService.addBook(book);
        if(result >0) {
            return "数据插入成功";
        }else {
            return "数据插入失败";
        }

    }

    @RequestMapping(value = "/getBookById")
    public Book getBookById(Integer id){
        try {
            Book bookresult = bookService.getBookById(id);
            if(bookresult != null) {
                return bookresult;
            }else {
                return null;
            }
        }catch (Exception e) {
            return null;
        }
    }

    @RequestMapping(value = "/getBooksList")
    public List getBooksList() {
        return bookService.getAllBooks();
    }
}

八、创建Service

BookService.java
package com.example.service;

import com.example.dao.BookDao;
import com.example.entity.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author 2017810402084
 */
@Service
public class BookService {

    @Autowired
    private BookDao bookDao;

    public int addBook(Book book) {
        return bookDao.addBook(book);
    }

    public int updateBook(Book book) {
        return bookDao.updateBook(book);
    }

    public int deleteBook(Integer id) {
        return bookDao.deleteBook(id);
    }

    public Book getBookById(Integer id) {
        return bookDao.getBookById(id);

    }

    public List getAllBooks() {
        return bookDao.getAllBooks();
    }

}

九、整合Druid数据库连接池

9.1、配置Druid的监控功能

package com.example.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * @author 2017810402084
 */

@Configuration
public class DruidConfig {

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

    //配置后台Druid监控功能
    @Bean
    public ServletRegistrationBean statViewServlet(){
        ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");

        //后台需要登录
        HashMap initParameters = new HashMap<>();

        //增加配置
        initParameters.put("loginUsername", "admin");
        initParameters.put("loginPassword","123456");

        //允许谁可以访问
        initParameters.put("allow", "");  //允许所有访问

        //禁止谁能访问
        initParameters.put("druid", "192.168.11.123");

        //设置初始化参数
        bean.setInitParameters(initParameters);

        return bean;
    }
    //配置一个web监控的filter
    @Bean
    public FilterRegistrationBean webStatFilter(){
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new WebStatFilter());

        Map initParams = new HashMap<>();

        //不进行统计
        initParams.put("exclusions","*.js,*.css,/druid/*"); //排除静态资源和请求

        bean.setInitParameters(initParams);

        bean.setUrlPatterns(Arrays.asList("/*"));  //拦截所有请求

        return  bean;
    }


}

9.2、配置Druid

具体的配置内容已在前面的数据库连接信息中进行配置了,这里不再进行展示。

十、启动项目

项目启动后发现控制台出现下面的情况:


具体的解决方法参见:springboot整合Druid数据(出现log4j:WARN No appenders could be found for logger (druid.sql.Connection))的解决方案


接下来用postman进行测试:

十一、整合结果展示

  • 访问:http://127.0.0.1:8080/druid/login.html输入admin/123456进行登录


用户名和密码设置如下:

//增加配置
        initParameters.put("loginUsername", "admin");
        initParameters.put("loginPassword","123456");
  • 登录成功后,进入首页。

  • 运行相应的 sql 查看 druid SQL监控。


总结

本篇文章通过SpringBoot与JDBCTemplate整合实现简单的增删改查的功能,以及怎样与Druid整合实时监控数据库的连接信息等;希望通过这个例子能给予大家帮助。

原文作者:浅殇忆流年

原文链接:https://segmentfault.com/a/1190000023961648

原文出处:CSDN

你可能感兴趣的:(druid连接池,jdbctemplate,执行多条sql,springboot,druid,springboot,druid连接池配置)