springBoot整合JDBC+druid

前言:

  对于数据访问层,无论是 SQL(关系型数据库) 还是 NOSQL(非关系型数据库),Spring Boot 底层都是采用 Spring Data 的方式进行统一处理。

一,整合JDBC

  1,在建立springboot时,引用相应模块,(springWeb,JDBC API,Mysql driver)

  2.引入成功后在pom.xml中有相关启动器

        <!--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>

  3,在yaml配置文件中配置连接数据库

spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
    driver-class-name: com.mysql.cj.jdbc.Driver

注意:当没有指定数据源时,springBoot用到是自己的默认数据源(class com.zaxxer.hikari.HikariDataSource),hikari

  4.此时,我们就可以利用JDBCTemplate直接对sql进行操作了,那么什么是JDBCTemplate呢?

    1、有了数据源(com.zaxxer.hikari.HikariDataSource),然后可以拿到数据库连接(java.sql.Connection),有了连接,就可以使用原生的 JDBC 语句来操作数据库;

    2、即使不使用第三方第数据库操作框架,如 MyBatis等,Spring 本身也对原生的JDBC 做了轻量级的封装,即JdbcTemplate。

    3、数据库操作的所有 CRUD 方法都在 JdbcTemplate 中。

    4、Spring Boot 不仅提供了默认的数据源,同时默认已经配置好了 JdbcTemplate 放在了容器中,程序员只需自己注入即可使用

    5、JdbcTemplate 的自动配置是依赖 org.springframework.boot.autoconfigure.jdbc 包下的 JdbcTemplateConfiguration 类

      JdbcTemplate主要提供以下几类方法:

        execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;

        update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;  

        query方法及queryForXXX方法:用于执行查询相关语句;

        call方法:用于执行存储过程、函数相关语句。

5.测试

package com.king.Controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

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

@RestController
public class JDBCController {

    @Autowired
    JdbcTemplate jdbcTemplate;

    //查询数据库的所有信息
    //没有实体类,数据库中的东西,怎么获取?Map
    @GetMapping("/userList")
    public List<Map<String,Object>> userList(){
        String sql="select * from user";
        List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
        return maps;
    }

    //事务无需手动提交jdbcTemplate已经封装好了
    @GetMapping("/userAdd")
    public String add(){
        String sql="insert into user(id,`name`,pwd) values(7,'2','3')";
        jdbcTemplate.update(sql);
        return "success";
    }

    @GetMapping("/userUpdate/{id}")
    public String upaDate(@PathVariable("id")int id){
        //预编译,防止sql注入
        String sql="update user set `name` = ?,pwd=? where id="+id;

        //封装
        Object[] objects= new Object[2];
        objects[0]="小明" ;
        objects[1]="41111";
        jdbcTemplate.update(sql,objects);
        return "success";
    }

    @GetMapping("/userDelete")
    public String delete(){
        //预编译,防止sql注入
        String sql="delete from user where id=?";

        //封装
        Object[] objects= new Object[1];
        objects[0]="1";
        jdbcTemplate.update(sql,objects);
        return "success";
    }

}

二、指定数据源(druid)

  为什么要用druid的数据源:它具备DBCP,C3P0等普通数据源的所有功能外,还具有监听功能,在不占用资源的情况下,非常好的监听了开发人员的数据库操作。方便debug

  1.yaml配置

spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/mybatis?useSSL=false&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

注意:在这里用log4j时候会有warn,仅需在resources文件夹下新建log4j.properties,编写如下配置,就可以解决

log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

  2,配置完druid后,但是还没有和springboot绑定,所以需要自己去写接口实现类去绑定它

package com.king.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.HashMap;

@Configuration
public class DruidConfig {


    @ConfigurationProperties(prefix = "spring.datasource")//将druid的独有属性预spring绑定
    @Bean
    public DataSource druidDataSource(){

        return new DruidDataSource();

    }

    //后台监控()web.xml,ServletRegistrationBean注册bean
    //因为SpringBoot内置了servlet容器,所以没有web.xml,代替方法 :ServletRegistrationBean
    @Bean
    public ServletRegistrationBean StatViewServlet(){
        ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");

        //后台有人需要登录,账户密码配置
        HashMap<String,String>initParameters = new HashMap<>();

        //增加配置
        initParameters.put("loginUsername","admin");//登录的key是固定的loginUsername,loginPassword
        initParameters.put("loginPassword","123456");

        //允许谁能访问
        initParameters.put("allow","");


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


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

    //filter,过滤那些请求不进入druid监控日志
    @Bean
    public FilterRegistrationBean webStatFilter(){
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new WebStatFilter());

        HashMap<String, String> initParameters = new HashMap<>();

        //可以过滤的请求(js,css,druid请求下的所有),exclusions排除
        initParameters.put("exclusions","*.js,*.css,/druid/*");
        bean.setInitParameters(initParameters);
        return bean;
    }

}
原文地址:https://www.cnblogs.com/CL-King/p/14075997.html