zoukankan      html  css  js  c++  java
  • 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;
        }
    
    }
  • 相关阅读:
    将字符串按指定间隔分隔
    C#汉字转化为拼音
    Silverlight客户端分页 DataPager控件的使用
    c# EnumUtil
    【AS3代码】通过两者间的距离,检测是否碰撞
    【AS3代码】遮罩用法
    【AS3代码】XML操作
    【AS3代码】数组知识
    【AS3代码】深度的设置
    【AS3代码】模仿现实世界中(地球重力)的甩球游戏
  • 原文地址:https://www.cnblogs.com/CL-King/p/14075997.html
Copyright © 2011-2022 走看看