Spring数据源配置相关

最近在看Spring(主要是Spring Boot)配置数据源相关的东西,这篇文章主要记录下所了解到的知识,怕以后有些东西又忘记😅,方便以后查阅,多数据源配置有待补充…

主角

Spring boot 中涉及到数据库这一块的几个重要的类/接口:

  • 数据源相关:
    • DataSource(DataSourceAutoConfiguration)
  • 事务相关:
    • DataSourceTransactionManager(DataSourceTransactionManagerAutoConfiguration)
  • 操作相关:
    • JdbcTemplate(JdbcTemplateAutoConfiguration)

常用的配置

1
2
3
4
5
6
7
8
9
#简单的配置:
spring.datasource.url=jdbc:mysql://ip/db
#项目中用到的:
#spring.datasource.url=jdbc:mysql://ip:port/db?characterEncoding=utf8&useSSL=true&serverTimezone=Asia/Shanghai
spring.datasource.username=dbuser
spring.datasource.password=dbpassword
#这个是可选的,spring 会根据url是使用哪种数据库从而使用默认的数据库驱动。之前一直以为这个是必须配置的
#另外com.mysql.jdbc.Driver 是 mysql-connector-java 5中的,com.mysql.cj.jdbc.Driver 是 mysql-connector-java 6中的
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

简单的数据库配置上面的其实已经够了,但是我们在实际应用中还会有这样的场景:

需要初始化数据库(建表和添加初始数据)

这里我们不采用ORM(hibernate)方式,而是通过在resource文件夹下添加schema.sqldata.sql这两个文件(参见:Initialize a Database),使用非内嵌/内存数据库需要添加配置:spring.datasource.initialization-mode=always ,才会自动初始化

⚠️ 注意:配置了这个将会在每次项目启动的时候初始化数据一遍

自动初始化数据库实现的原理

简单描述:在DataSourceAutoConfiguration 中使用Import注解,将DataSourceInitializationConfiguration“导入”,DataSourceInitializationConfiguration又将DataSourceInitializerInvoker“导入”,而DataSourceInitializerInvoker中会调用DataSourceInitializercreateSchemacreateSchema方法,分别去建表和初始化数据。

image-20190316175431149