SpringBoot整合JDBC与默认数据源

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: SpringBoot整合JDBC与默认数据源

对于数据访问层,无论是SQL还是NOSQL,Spring Boot默认采用整合Spring Data的方式进行统一处理,添加大量自动配置,屏蔽了很多设置。引入各种xxxTemplate,xxxRepository来简化我们对数据访问层的操作。对我们来说只需要进行简单的设置即可。这里SpringBoot版本使用1.5.10。

【1】SpringBoot配置数据源

① 创建项目,引入需要的模块

pom文件

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

② 配置MySQL并测试

类似于以前项目的config.properties,这将mysql的属性配置在yml文件中。数据源的所有配置对应类如下:

@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties
    implements BeanClassLoaderAware, EnvironmentAware, InitializingBean {
  private ClassLoader classLoader;
  private Environment environment;
  /**
   * Name of the datasource.
   */
  private String name = "testdb";
  /**
   * Generate a random datasource name.
   */
  private boolean generateUniqueName;
  /**
   * Fully qualified name of the connection pool implementation to use. By default, it
   * is auto-detected from the classpath.
   */
  private Class<? extends DataSource> type;
  /**
   * Fully qualified name of the JDBC driver. Auto-detected based on the URL by default.
   */
  private String driverClassName;
  /**
   * JDBC url of the database.
   */
  private String url;
  /**
   * Login user of the database.
   */
  private String username;
  /**
   * Login password of the database.
   */
  private String password;
  /**
   * JNDI location of the datasource. Class, url, username & password are ignored when
   * set.
   */
  private String jndiName;
  /**
   * Populate the database using 'data.sql'.
   */
  private boolean initialize = true;
  /**
   * Platform to use in the DDL or DML scripts (e.g. schema-${platform}.sql or
   * data-${platform}.sql).
   */
  private String platform = "all";
  /**
   * Schema (DDL) script resource references.
   */
  private List<String> schema;
  /**
   * User of the database to execute DDL scripts (if different).
   */
  private String schemaUsername;
  /**
   * Password of the database to execute DDL scripts (if different).
   */
  private String schemaPassword;
  /**
   * Data (DML) script resource references.
   */
  private List<String> data;
  /**
   * User of the database to execute DML scripts.
   */
  private String dataUsername;
  /**
   * Password of the database to execute DML scripts.
   */
  private String dataPassword;
  /**
   * Do not stop if an error occurs while initializing the database.
   */
  private boolean continueOnError = false;
  /**
   * Statement separator in SQL initialization scripts.
   */
  private String separator = ";";
  /**
   * SQL scripts encoding.
   */
  private Charset sqlScriptEncoding;
  private EmbeddedDatabaseConnection embeddedDatabaseConnection = EmbeddedDatabaseConnection.NONE;
  private Xa xa = new Xa();
  private String uniqueName;
  //...
}

application.yml文件如下:

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

20180625140819552.jpg

在测试类中获取默认数据源,并拿到链接:

@RunWith(SpringRunner.class)
@SpringBootTest
public class DatasourceApplicationTests {
  @Autowired
  DataSource dataSource;
  @Test
  public void contextLoads() throws  Exception {
    System.out.println(dataSource.getClass()+"***********");
    Connection connection = dataSource.getConnection();
    System.out.println(connection);
  }
}

测试结果如下:

class org.apache.tomcat.jdbc.pool.DataSource***********
ProxyConnection[PooledConnection[com.mysql.jdbc.JDBC4Connection@2bfbffb2]]

即,数据源默认使用的是org.apache.tomcat.jdbc.pool.DataSource(这个与SpringBoot版本有关,这里是1.5.10)。

【2】使用JdbcTemplate访问数据库

① 默认注入

SpringBoot默认配置了JdbcTemplateNamedParameterJdbcTemplate,源码如下:

@Configuration
@ConditionalOnClass({ DataSource.class, JdbcTemplate.class })
@ConditionalOnSingleCandidate(DataSource.class)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class JdbcTemplateAutoConfiguration {
  private final DataSource dataSource;
  public JdbcTemplateAutoConfiguration(DataSource dataSource) {
    this.dataSource = dataSource;
  }
  @Bean
  @Primary
  @ConditionalOnMissingBean(JdbcOperations.class)
  public JdbcTemplate jdbcTemplate() {
    return new JdbcTemplate(this.dataSource);
  }
  @Bean
  @Primary
  @ConditionalOnMissingBean(NamedParameterJdbcOperations.class)
  public NamedParameterJdbcTemplate namedParameterJdbcTemplate() {
    return new NamedParameterJdbcTemplate(this.dataSource);
  }
}

可以看到在上面JdbcTemplateAutoConfiguration 中默认注入了namedParameterJdbcTemplatejdbcTemplate两个实例。

② 编写controller进行测试

@Controller
public class HelloController {
    @Autowired
    JdbcTemplate jdbcTemplate;
    @ResponseBody
    @GetMapping("/hello")
    private Map<String,Object> getBook(){
        String sql = "select * from book";
        List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
        return list.get(0);
    }
}

浏览器访问结果如下:


这里返回结果为Map,浏览器得到的为JSON。这是因为,首先方法上使用了注解@Responsebody,其次WebMVCAutoConfiguration默认注册了一系列的HttpMessageConverter,该类主要用来做请求响应的转换。

@Responsebody注解被RequestResponseBodyMethodProcessor 处理器进行解析。

【3】SpringBoot加载项目路径下的SQL

SpringBoot另一个特性是可以加载项目路径下的SQL脚本,比如建表语句,insert语句等等。

默认Schema脚本名字:

classpath*:schema.sql;
classpath*:schema-all.sql;

默认Data脚本名字:

classpath*:data.sql;
classpath*:data-all.sql;

如果想使用自定义脚本名字,在yml文件中配置:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
    schema:
      - classpath:department.sql

如下图所示:

【4】默认数据源配置实例

这里默认数据源指的是org.apache.tomcat.jdbc.pool.DataSource

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
     #最大连接数
    tomcat.max-active: 20
    #最大空闲数
    tomcat.max-idle: 8
    #最小空闲数
    tomcat.min-idle: 8
    #初始化连接数
    tomcat.initial-size: 10

无需使用额外配置或者pom文件,即可正常使用默认org.apache.tomcat.jdbc.pool.DataSource

【5】SpringBoot2.X中使用HikariDataSource

在SpringBoot2.X版本中,默认使用数据源是HikariDataSource(可以称之为"光"),如下所示在DataSourceBuilder配置。

private static final String[] DATA_SOURCE_TYPE_NAMES = new String[] {
  "com.zaxxer.hikari.HikariDataSource",
  "org.apache.tomcat.jdbc.pool.DataSource",
  "org.apache.commons.dbcp2.BasicDataSource" };

这里同样贴一份配置实例

# 驱动,根据需要更改 如com.mysql.cj.jdbc.Driver
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# url
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
# Hikari 数据源配置
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
#最小空闲 
spring.datasource.hikari.minimum-idle=5
#连接池最大连接数,默认是10
spring.datasource.hikari.maximum-pool-size=15
# 此属性控制从池返回的连接的默认自动提交行为,默认值:true
spring.datasource.hikari.auto-commit=true
# 空闲连接存活最大时间,默认600000(10分钟)
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=DatebookHikariCP
# 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
spring.datasource.hikari.max-lifetime=1800000
# 数据库连接超时时间,默认30秒,即30000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.connection-test-query=SELECT 1

image.png


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
11月前
|
Java 数据库连接
【YashanDB知识库】Springboot启动找不到崖山jdbc驱动的问题处理
本文来自YashanDB官网,主要解决SpringBoot应用启动时出现“找不到崖山JDBC驱动”的问题,尽管lib目录下已有yashandb-jdbc-1.6.9.jar文件。错误信息显示`java.lang.ClassNotFoundException: com.yashandb.jdbc.Driver`。解决方案为:通过`which java`等命令定位Java安装路径,将驱动jar包复制到JRE的`lib/ext`目录下,最后重启应用即可。
|
Java 数据库连接 数据库
springboot java.lang.ClassNotFoundException: dm.jdbc.driver.DmDriver应该如何解决
通过上述步骤,可以有效解决Spring Boot项目中遇到的 `java.lang.ClassNotFoundException: dm.jdbc.driver.DmDriver`问题。确保在项目中正确添加达梦数据库的JDBC驱动依赖,并在配置文件中正确配置数据源信息,是解决此问题的关键。通过这些方法,可以确保Spring Boot项目能够正确连接达梦数据库并正常运行。
2406 31
|
Java 数据库连接 数据库
SpringBoot 整合jdbc和mybatis
本文详细介绍了如何在SpringBoot项目中整合JDBC与MyBatis,并提供了具体的配置步骤和示例代码。首先,通过创建用户实体类和数据库表来准备基础环境;接着,配置Maven依赖、数据库连接及属性;最后,分别展示了JDBC与MyBatis的集成方法及其基本操作,包括增删查改等功能的实现。适合初学者快速入门。
615 3
SpringBoot 整合jdbc和mybatis
|
SQL 分布式计算 Java
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
313 0
sharding-jdbc 兼容 MybatisPlus的动态数据源
【8月更文挑战第2天】要使 `Sharding-JDBC` 与 `MyBatisPlus` 的动态数据源兼容,需引入相关依赖,配置数据源及分库分表策略,并在 `MyBatisPlus` 中设置参数以协同工作。可能还需自定义代码处理数据源切换。示例代码框架展示整合方式,实际应用中需按具体业务场景详细配置并处理异常情况,如数据一致性问题。
901 1
|
Java 数据库连接 网络安全
springboot使用Pivotal Greenplum JDBC如何进行配置
【5月更文挑战第23天】springboot使用Pivotal Greenplum JDBC如何进行配置
475 6
|
SQL druid Java
JDBC、C3P0、DBCP、Druid 数据源连接池使用的对比总结.md2
JDBC、C3P0、DBCP、Druid 数据源连接池使用的对比总结.md
162 0
|
SQL druid Java
JDBC、C3P0、DBCP、Druid 数据源连接池使用的对比总结.md1
JDBC、C3P0、DBCP、Druid 数据源连接池使用的对比总结.md
439 0
|
SQL Java 数据库连接
Springboot框架整合Spring JDBC操作数据
JDBC是Java数据库连接API,用于执行SQL并访问多种关系数据库。它包括一系列Java类和接口,用于建立数据库连接、创建数据库操作对象、定义SQL语句、执行操作并处理结果集。直接使用JDBC涉及七个步骤,包括加载驱动、建立连接、创建对象、定义SQL、执行操作、处理结果和关闭资源。Spring Boot的`spring-boot-starter-jdbc`简化了这些步骤,提供了一个在Spring生态中更便捷使用JDBC的封装。集成Spring JDBC需要添加相关依赖,配置数据库连接信息,并通过JdbcTemplate进行数据库操作,如插入、更新、删除和查询。
534 0

热门文章

最新文章