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;
        }
    
    }
  • 相关阅读:
    Atitit fms Strait (海峡) lst 数据列表目录1. 4大洋 12. 著名的海大约40个,总共约55个海 13. 海区列表 23.1. 、波利尼西亚(Polynesia,
    Atitit trave islands list 旅游资源列表岛屿目录1. 东南亚著名的旅游岛屿 21.1. Cjkv 日韩 冲绳 琉球 济州岛 北海道 21.2. 中国 涠洲岛 南澳
    Atitit Major island groups and archipelagos 主要的岛群和群岛目录资料目录1. 岛群 波利尼西亚(Polynesia, 美拉尼西亚(Melanesia,
    Atitit glb 3tie city lst 三线城市列表 数据目录1. 全球范围内约90个城市 三线 12. 世界性三线城市全球共
    Atitit glb 1tie 2tie city lst 一二线城市列表数据约50个一线城市Alpha ++ 阿尔法++,,London 伦敦,,New York 纽约,,Alpha +
    Attit 现代编程语言重要特性目录第一章 类型系统 基本三大类型 2第一节 字符串 数字 bool 2第二节 推断局部变量 2第三节 动态类型 2第二章 可读性与开发效率 简单性 2
    Atitit 未来数据库新特性展望目录1. 统一的翻页 21.1. 2 Easy Top-N
    使用Chrome DevTools(console ande elements panel)进行xpath/css/js定位
    chrome -console妙用之定位xpath/js/css
    表达式树之构建Lambda表达式
  • 原文地址:https://www.cnblogs.com/CL-King/p/14075997.html
Copyright © 2011-2022 走看看