springboot系列文章(八)springboot与jdbc

jdbc大家都不会陌生了把,那么springboot中是如何使用jdbc呢:

JDBC

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

 

spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://192.168.15.22:3306/jdbc
    driver-class-name: com.mysql.jdbc.Driver

效果:

默认是用org.apache.tomcat.jdbc.pool.DataSource作为数据源;

数据源的相关配置都在DataSourceProperties里面;

自动配置原理:

org.springframework.boot.autoconfigure.jdbc:

1、参考DataSourceConfiguration,根据配置创建数据源,默认使用Tomcat连接池;可以使用spring.datasource.type指定自定义的数据源类型;

2、SpringBoot默认可以支持;

org.apache.tomcat.jdbc.pool.DataSource、HikariDataSource、BasicDataSource、

3、自定义数据源类型

/**
 * Generic DataSource configuration.
 */
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type")
static class Generic {
​
   @Bean
   public DataSource dataSource(DataSourceProperties properties) {
       //使用DataSourceBuilder创建数据源,利用反射创建响应type的数据源,并且绑定相关属性
      return properties.initializeDataSourceBuilder().build();
   }
​
}

4、DataSourceInitializer:ApplicationListener

作用:

1)、runSchemaScripts();运行建表语句;

2)、runDataScripts();运行插入数据的sql语句;

默认只需要将文件命名为:

schema-*.sql、data-*.sql
默认规则:schema.sql,schema-all.sql;
可以使用   
    schema:
      - classpath:department.sql
      指定位置

5、操作数据库:自动配置了JdbcTemplate操作数据库

看代码实现:


/**
 * @Author kay三石
 * @date:2019/6/30
 */
@Controller
public class JdbcController {
    @Autowired
    JdbcTemplate jdbcTemplate;

//    execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
//
//    update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
//
//    query方法及queryForXXX方法:用于执行查询相关语句;
//
//    call方法:用于执行存储过程、函数相关语句。

    @ResponseBody
    @GetMapping("/query")
    public Map<String,Object> map(){
        List<Map<String, Object>> list = jdbcTemplate.queryForList("select * FROM department");
        return list.get(0);
    }
}
spring:
  datasource:
    username: root
    password: 123
    url: jdbc:mysql://localhost:3306/spring-boot-jdbc?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver
    schema:
      - classpath:department.sql#执行建表文件

Durid:

Druid是一个关系型数据库连接池,它是阿里巴巴的一个开源项目。Druid支持所有JDBC兼容的数据库,包括Oracle、MySQL、Derby、PostgreSQL、SQL Server、H2等。Druid在监控、可扩展性、稳定性和性能方面具有明显的优势。通过Druid提供的监控功能,可以实时观察数据库连接池和SQL查询的工作情况。使用Druid连接池,在一定程度上可以提高数据库的访问性能。

Spring Boot的数据源配置的默认类型是org.apache.tomcat.jdbc.pool.DataSource,为了使用Druid连接池,可以将数据源类型更改为com.alibaba.druid.pool.DruidData-Source,如代码清单4-2所示。其中,url、username、password是连接MySQL服务器的配置参数,其他一些参数设定Druid的工作方式。

                    spring:
                        datasource:
                            type: com.alibaba.druid.pool.DruidDataSource
                            driver-class-name: com.mysql.jdbc.Driver
                            url: jdbc:mysql:// localhost:3306/test?characterEncoding=utf8
                            username: root
                            password: 12345678
                            # 初始化大小,最小,最大
                            initialSize: 5
                            minIdle: 5
                            maxActive: 20
                            # 配置获取连接等待超时的时间
                            maxWait: 60000
                            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
                            timeBetweenEvictionRunsMillis: 60000
                            # 配置一个连接在池中的最小生存时间,单位是毫秒
                            minEvictableIdleTimeMillis: 300000
                            validationQuery: SELECT 1 FROM DUAL
                            testWhileIdle: true
                            testOnBorrow: false
                            testOnReturn: false
                            # 打开PSCache,并且指定每个连接上PSCache的大小
                            poolPreparedStatements: true
                            maxPoolPreparedStatementPerConnectionSize: 20
                            # 配置监控统计拦截的filters,去掉后监控界面sql将无法统计,'wall'用于防火墙
                            filters: stat,wall,log4j
                            # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
                            connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
                            # 合并多个DruidDataSource的监控数据
                            #useGlobalDataSourceStat=true
 

上面配置中的filters:stat表示已经可以使用监控过滤器,这时结合定义一个过滤器,就可以用来监控数据库的使用情况。

[插图]注意 在Spring Boot低版本的数据源配置中,是没有提供设定数据源类型这一功能的,这时如果要使用上面这种配置方式,就需要使用自定义的配置参数来实现。

@Configuration public class DruidConfiguration {

@Bean public ServletRegistrationBean statViewServle(){

ServletRegistrationBean servletRegistrationBean = new ServletRegist rationBean(new StatViewServlet(),"/druid/*"); // IP白名单 servletRegistrationBean.addInitParameter("allow","192.168.1.218,127. 0.0.1"); // IP黑名单 (共同存在时,deny优先于allow) servletRegistrationBean.addInitParameter("deny","192.168.1.100"); // 控制台管理用户 servletRegistrationBean.addInitParameter("loginUsername","druid"); servletRegistrationBean.addInitParameter("loginPassword","12345678"); // 是否能够重置数据 servletRegistrationBean.addInitParameter("resetEnable","false");

return servletRegistrationBean; }

@Bean public FilterRegistrationBean statFilter(){

FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean (new WebStatFilter()); // 添加过滤规则 filterRegistrationBean.addUrlPatterns("/*"); // 忽略过滤的格式 filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*. png,*.css,*.ico,/druid/*"); return filterRegistrationBean;

} }

开启监控功能后,运行应用时,可以通过网址http://localhost/durid/index.html打开控制台,输入上面程序设定的用户名和密码,登录进去,可以打开如图4-2所示的监控后台。

在监控后台中,可以实时查看数据库连接池的情况,每一个被执行的SQL语句使用的次数和花费的时间、并发数等,以及一个URI请求的次数、时间和并发数等情况。这就为分析一个应用系统访问数据库的情况和性能提供了可靠、详细的原始数据,让我们能在一些基础的细节上修改和优化一个应用访问数据库的设计。

durid的配置文件application-druid.yml:

spring:
  datasource:
#   数据源基本配置
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ssm_crud
    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,去掉后监控界面sql无法统计,'wall'用于防火墙  
    filters: stat,wall,log4j
    maxPoolPreparedStatementPerConnectionSize: 20
    useGlobalDataSourceStat: true  
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

配置durid的监控:

通过下面的配置然后运行即可实现自己的想要的结果了。

package com.kayleoi.springbootdatajdbc.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 kay三石
 * @date:2019/6/29
 */
@Configuration
public class DruidConfig {

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

    /**
     * 配置Druid的监控
     *1、配置一个管理后台的Servlet
     * @return
     */
    @Bean
    public ServletRegistrationBean statViewServlet(){
        ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
        Map<String,String> initParams = new HashMap<>();

        initParams.put("loginUsername","admin");
        initParams.put("loginPassword","123456");
        initParams.put("allow","");//默认就是允许所有访问
        initParams.put("deny","192.168.15.21");

        bean.setInitParameters(initParams);
        return bean;
    }


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

        Map<String,String> initParams = new HashMap<>();
        initParams.put("exclusions","*.js,*.css,/druid/*");

        bean.setInitParameters(initParams);

        bean.setUrlPatterns(Arrays.asList("/*"));

        return  bean;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kay三石 [Alay Kay]

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值