Spring Boot 默认数据源 HikariDataSource 与 JdbcTemplate 初遇

Spring Boot 默认数据源 HikariDataSource 与 JdbcTemplate 初遇目录环境准备新建项目pom.xml默认内容mysql数据库数据库CRUD全局配置文件默认数据源CRUD数据库PhoneController测试结果自动配置原理DataSourceConfiguration1、《SpringBoot数据库访问简介》中已经介绍,SpringBoot可以通过多种方式访问各种数据库,本文将介绍Spr…

大家好,又见面了,我是你们的朋友全栈君。

目录

环境准备与依赖

HikariDataSource 数据源常用配置

HikariDataSource 数据源测试

JdbcTemplate CRUD 数据库

数据源自动配置原理


环境准备与依赖

1、本文介绍 Spring Boot 内部集成的 JDBC 模板访问 Mysql 数据,环境:Java JDK 8 + Spring boot 2.1.5 + HikariDataSource + Mysql/Oracle + JdbcTemplate

2、pom. xml 依赖如下:

        <!-- 引入Spring封装的jdbc,内部默认依赖了 HikariDataSource  数据源-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>

        <!-- web项目启动模块-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- mysql数据库连接驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
            <version>8.0.16</version>
        </dependency>

pom.xml · 汪少棠/jdbc_template_app – Gitee.com

mysql 数据库表:

src/main/resources/data/iphone.sql · 汪少棠/jdbc_template_app – Gitee.com

HikariDataSource 数据源常用配置

1、全局配置文件内容如下:

spring:
  datasource:
    # jdbc 连接基础配置
    username: root
    password: root
    #使用的 mysql 版本为:Server version: 5.6.11 MySQL Community Server (GPL)
    #mysql 驱动版本:mysql-connector-java-8.0.16.jar
    #高版本 Mysql 驱动时,配置的 driver-class-name 不再是 com.mysql.jdbc.Driver,url 后面必须设置时区 serverTimezone
    url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8&serverTimezone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver

    #hikari数据源特性配置
    hikari:
      maximum-pool-size: 100 #最大连接数,默认值10.
      minimum-idle: 20 #最小空闲连接,默认值10.
      connection-timeout: 60000 #连接超时时间(毫秒),默认值30秒.
      #空闲连接超时时间,默认值600000(10分钟),只有空闲连接数大于最大连接数且空闲时间超过该值,才会被释放
      #如果大于等于 max-lifetime 且 max-lifetime>0,则会被重置为0.
      idle-timeout: 600000
      max-lifetime: 3000000 #连接最大存活时间,默认值30分钟.设置应该比mysql设置的超时时间短
      connection-test-query: select 1 #连接测试查询
高版本的 spring boot 搭配 mysql 驱动版本较高时,如 mysql-connector-java:8.0.16,此时 driver-class-name 的值要带 cj;url 的值要带时区 serverTimezone,如:
url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver

2、hikari 除了上面的配置,其它的配置还有:

spring.datasource.type

要使用的连接池实现的完全限定名称。默认情况下,它是从类路径自动检测到的

值比如:com.zaxxer.hikari.HikariDataSource

spring.datasource.hikari.pool-name hikari 连接池名称,默认 HikariPool-1
spring.datasource.hikari.auto-commit 此属性控制从池返回的连接的默认自动提交行为。它是一个布尔值。 默认值:true

spring.datasource.hikari.maximum-pool-size: 1000

池中允许达到的最大连接数,包括空闲和正在使用的连接,默认值10。

spring.datasource.hikari.minimum-idle: 200

最小空闲连接,默认值10. 默认与maximumPoolSize相同

spring.datasource.hikari.connection-timeout: 60000

连接超时时间(毫秒),默认值30秒.如果在没有可用连接的情况下超过此时间,则会抛出SQLException
spring.datasource.hikari.idle-timeout: 600000 空闲连接超时时间,默认值600000(10分钟),只有空闲连接数大于最大连接数且空闲时间超过该值,才会被释放
如果大于等于 max-lifetime 且 max-lifetime>0,则会被重置为0.

spring.datasource.hikari.max-lifetime: 3000000

连接最大存活时间,默认值30分钟.设置应该比mysql设置的超时时间短
spring.datasource.hikari.connection-test-query: select 1

连接测试查询,确认从池中获取的连接是否能使用。

如果驱动程序不符合JDBC4的要求,HikariCP将记录一个错误以告知您,默认值:无

3、关于上面的数据源公共配置的内容,都可以从 Spring Boot 官方文档 查看:

# DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
spring.datasource.continue-on-error=false # Whether to stop if an error occurs while initializing the database.
spring.datasource.data= # Data (DML) script resource references.
spring.datasource.data-username= # Username of the database to execute DML scripts (if different).
spring.datasource.data-password= # Password of the database to execute DML scripts (if different).
spring.datasource.dbcp2.*= # Commons DBCP2 specific settings
spring.datasource.driver-class-name= # Fully qualified name of the JDBC driver. Auto-detected based on the URL by default.
spring.datasource.generate-unique-name=false # Whether to generate a random datasource name.
spring.datasource.hikari.*= # Hikari specific settings
spring.datasource.initialization-mode=embedded # Initialize the datasource with available DDL and DML scripts.
spring.datasource.jmx-enabled=false # Whether to enable JMX support (if provided by the underlying pool).
spring.datasource.jndi-name= # JNDI location of the datasource. Class, url, username & password are ignored when set.
spring.datasource.name= # Name of the datasource. Default to "testdb" when using an embedded database.
spring.datasource.password= # Login password of the database.
spring.datasource.platform=all # Platform to use in the DDL or DML scripts (such as schema-${platform}.sql or data-${platform}.sql).
spring.datasource.schema= # Schema (DDL) script resource references.
spring.datasource.schema-username= # Username of the database to execute DDL scripts (if different).
spring.datasource.schema-password= # Password of the database to execute DDL scripts (if different).
spring.datasource.separator=; # Statement separator in SQL initialization scripts.
spring.datasource.sql-script-encoding= # SQL scripts encoding.
spring.datasource.tomcat.*= # Tomcat datasource specific settings
spring.datasource.type= # Fully qualified name of the connection pool implementation to use. By default, it is auto-detected from the classpath.
spring.datasource.url= # JDBC URL of the database.
spring.datasource.username= # Login username of the database.
spring.datasource.xa.data-source-class-name= # XA datasource fully qualified name.
spring.datasource.xa.properties= # Properties to pass to the XA data source.

4、也可以从 org.springframework.boot.autoconfigure.jdbc.DataSourceProperties 数据源配置文件类中进行查看。

HikariDataSource 数据源测试

1、全局配置文件 application.yml 中 spring.datasource 下只配置了账号、密码、数据库地址、连接驱动,因为默认使用的是 class com.zaxxer.hikari.HikariDataSource 数据源

2、如果过是自定义数据源,比如 DruidDataSource,则可以使用 type 指定,如下所示:type: com.alibaba.druid.pool.DruidDataSource,可以参考《切换 Druid 数据源

3、测试数据源如下:

@RunWith(SpringRunner.class)
@SpringBootTest
public class DataSourceTest {
    /**
     * Spring Boot 默认已经配置好了数据源,程序员可以直接 DI 注入然后使用即可
     */
    @Resource
    DataSource dataSource;
    @Test
    public void contextLoads() throws SQLException {
        Connection connection = dataSource.getConnection();
        DatabaseMetaData metaData = connection.getMetaData();

        //数据源>>>>>>class com.zaxxer.hikari.HikariDataSource
        System.out.println("数据源>>>>>>" + dataSource.getClass());
        System.out.println("连接>>>>>>>>" + connection);
        System.out.println("连接地址>>>>" + connection.getMetaData().getURL());
        System.out.println("驱动名称>>>>" + metaData.getDriverName());
        System.out.println("驱动版本>>>>" + metaData.getDriverVersion());
        System.out.println("数据库名称>>" + metaData.getDatabaseProductName());
        System.out.println("数据库版本>>" + metaData.getDatabaseProductVersion());
        System.out.println("连接用户名称>" + metaData.getUserName());

        connection.close();

        // 数据源>>>>>>class com.zaxxer.hikari.HikariDataSource
        // 连接>>>>>>>>HikariProxyConnection @554510956 wrapping com.mysql.cj.jdbc.ConnectionImpl@3bec5821
        // 连接地址>>>>jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8&serverTimezone=UTC
        // 驱动名称>>>>MySQL Connector/J
        // 驱动版本>>>>mysql-connector-java-8.0.16 (Revision: 34cbc6bc61f72836e26327537a432d6db7c77de6)
        // 数据库名称>>MySQL
        // 数据库版本>>8.0.26
        // 连接用户名称>root@localhost
    }
}

src/test/java/com/wmx/jdbc_template_app/DataSourceTest.java · 汪少棠/jdbc_template_app – Gitee.com

1、可以看出 Spring Boot 2.1.5 默认使用 com.zaxxer.hikari.HikariDataSource 数据源,而以前版本,如 Spring Boot 1.5 默认使用 org.apache.tomcat.jdbc.pool.DataSource 作为数据源;

2、HikariDataSource 号称 Java WEB 当前速度最快的数据源,相比于传统的 C3P0 、DBCP、Tomcat jdbc 等连接池更加优秀;

3、HikariDataSource 的内容本文暂时不做延伸,有了数据库连接,显然就可以 CRUD 操作数据库了。

JdbcTemplate CRUD 数据库

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

2、即使不使用第三方第数据库操作框架,如 MyBatis、Hibernate 、JDBC Utils 等,Spring 本身也对 原生的 JDBC 做了轻量级的封装,即 org.springframework.jdbc.core.JdbcTemplate。这原本是 Spring 的知识点!

3、数据库操作的所有 CRUD 方法都在 JdbcTemplate 中,有了 JdbcTemplate 就能更加轻松的操作数据库。

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

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

PhoneController 控制层

1、为了尽可能符合实际开发,新建一个控制层,通过浏览器访问来进行 CRUD,但是不再进行细致的分层,如 dao、service、domain 等都省略

@Controller
public class PhoneController {
    /**
     * JdbcTemplate 是 core 包的核心类,用于简化 JDBC 操作,还能避免一些常见的错误,如忘记关闭数据库连接
     * Spring Boot 默认提供了数据源,默认提供了 org.springframework.jdbc.core.JdbcTemplate
     * JdbcTemplate 中会自己注入数据源,使用起来也不用再自己来关闭数据库连接
     */
    @Resource
    private JdbcTemplate jdbcTemplate;
    /**
     * 查询 iphone 表所有数据
     * http://localhost:8080/phoneList
     *
     * @return
     */
    @ResponseBody
    @GetMapping("phoneList")
    public List<Map<String, Object>> userList() {
        /**
         * 查询 iphone 表所有数据
         * List 中的1个 Map 对应数据库的 1行数据
         * Map 中的 key 对应数据库的字段名,value 对应数据库的字段值
         */
        List<Map<String, Object>> mapList = jdbcTemplate.queryForList("SELECT * FROM iphone");
        return mapList;
    }
    /**
     * 新增 iphone 数据
     * http://localhost:8080/savePhone
     *
     * @return
     */
    @GetMapping("savePhone")
    public String savePhone() {
        String sql = "INSERT INTO iphone(id,name,price,publish_time) VALUES (?,?,?,?)";
        Object[] objects = new Object[4];
        objects[0] = null;
        objects[1] = "大米S" + String.valueOf(System.currentTimeMillis()).substring(10, 12);
        objects[2] = 800 + new SecureRandom().nextFloat() * 5000;
        objects[3] = new Date();

        //服务端调整,重新查询全部
        jdbcTemplate.update(sql, objects);
        return "forward:/phoneList";
    }
    /**
     * 修改 iphone 数据
     * http://localhost:8080/updatePhone/1/8888.08
     *
     * @return
     */
    @GetMapping("updatePhone/{id}/{price}")
    public String updatePhone(@PathVariable(value = "id") String id, @PathVariable(value = "price") String price) {
        String sql = "UPDATE iphone SET price=? WHERE id=?";
        Object[] objects = new Object[2];
        objects[0] = price;
        objects[1] = id;

        jdbcTemplate.update(sql, objects);
        return "forward:/phoneList";
    }
    /**
     * 删除 iphone 数据
     * update 方法可以做查询以外的 增加、修改、删除操作
     * http://localhost:8080/deletePhone/11
     *
     * @return
     */
    @GetMapping("deletePhone/{id}")
    public String deletePhone(@PathVariable Integer id) {
        String sql = "DELETE FROM iphone WHERE id=?";
        Object[] objects = new Object[1];
        objects[0] = id;

        jdbcTemplate.update(sql, objects);
        return "forward:/phoneList";
    }

src/main/java/com/wmx/jdbc_template_app/controller/PhoneController.java · 汪少棠/jdbc_template_app – Gitee.com

Spring Boot 默认数据源 HikariDataSource 与 JdbcTemplate 初遇

数据源自动配置原理

1、自动配置都在 org.springframework.boot.autoconfigure.jdbc 包下。

2、org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration 数据源配置类作用是根据逻辑判断之后,添加数据源

3、SpringBoot 默认支持如下数据源;

1、com.zaxxer.hikari.HikariDataSource (Spring Boot 2.0 以上,默认使用此数据源)
2、org.apache.tomcat.jdbc.pool.DataSource
3、org.apache.commons.dbcp2.BasicDataSource

4、可以使用 spring.datasource.type 指定自定义的数据源类型,值为 要使用的连接池实现的完全限定名。默认情况下,它是从类路径自动检测的。

    @ConditionalOnMissingBean({DataSource.class})
    @ConditionalOnProperty(
        name = {"spring.datasource.type"}
    )
    static class Generic {
        Generic() {
        }
        @Bean
        public DataSource dataSource(DataSourceProperties properties) {
            return properties.initializeDataSourceBuilder().build();
        }
    }

Spring Boot 自定义数据源 DruidDataSource

Spring JdbcTemplate 模板剖析 之 常用 增删改查

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/152343.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • mqttnet 详解_vs2017通过mqttnet创建mqtt服务端 客户端

    mqttnet 详解_vs2017通过mqttnet创建mqtt服务端 客户端服务端:usingMQTTnet;usingMQTTnet.Server;usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Diagnostics;usingSystem.IO;usingSystem.Linq;usingSyst…

  • 什么是纠删码_脑疝的常见类型

    什么是纠删码_脑疝的常见类型你能给纠删码一个好的定义吗? EthanMiller:纠删码是在丢失部分数据的情况下根据剩余数据将丢失的数据重建的一组算法。举个例子,如果我想保护六份数据,我会使用一种纠删码算法来产生两份额外的数据,这样总共就会有八份数据。这八份数据中的任意六份数据都能恢复另外两份数据。纠删码的要点是你可以选择对数据做任意数量的分片。我知道一些纠删码可以将数据至多分成200片或者奇数片,你也可以选择校验数

    2022年10月25日
  • 0x7ffffffff什么意思(y9000x)

    运行之后发现:0x7FFFFFFF对应int.MaxValue即21474836470xFFFFFFFF对应uint.MaxValue即42949672950x7FFF对应short.MaxValue即327670xFFFF对应ushort.MaxValue即655350x7F对应sbyte.MaxValue即1270xFF对应byt…

  • 有return的情况下try catch finally的执行顺序(最有说服力的总结)

    有return的情况下try catch finally的执行顺序(最有说服力的总结)结论:1、不管有木有出现异常,finally块中代码都会执行;2、当try和catch中有return时,finally仍然会执行;3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;4、finally

  • 3. CMake 系列 – 分模块编译&安装项目

    3. CMake 系列 – 分模块编译&安装项目

    2021年11月22日
  • oracle:修改表名

    oracle:修改表名修改语句:ALTERTABLE旧表名RENAMETO新表名;

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号