0x01 介绍

SpringBoot里面想要使用DataSource十分简单

0x02 环境搭配

如果还不会搭建环境的可以按照下面的文章跟着搭建

Mac版IDEA创建SpringBoot2.5.1项目-详细过程: https://www.yuque.com/pmiaowu/gpy1q8/art0tm

0x03 默认数据源

SpringBoot默认支持4种数据源类型分别是:

  • org.apache.tomcat.jdbc.pool.DataSource
  • com.zaxxer.hikari.HikariDataSource
  • org.apache.commons.dbcp.BasicDataSource
  • org.apache.commons.dbcp2.BasicDataSource

定义在org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

这四种数据源,当classpath下有相应的类存在时,SpringBoot会通过自动配置为其生成DataSource
Bean/DataSource Bean默认只会生成一个
四种数据源类型的生效先后顺序如下: Tomcat->Hikari->Dbcp->Dbcp2

注: SpringBoot1.0时数据源默认使用的是Tomcat, 2.0以后换成了Hikari
1.0时,只要导入jdbc、jpa或者mybatis三者依赖之一,默认就带上Tomcat数据源
2.0以后只要导入jdbc、jpa或者mybatis三者依赖之一,默认就带上Hikari数据源

0x03.1 添加依赖与配置

按照上面的搭建完环境以后,就找到pom.xml找到<dependencies>标签
然后如下使用maven自动添加包,我这里就连接MySQL数据库进行演示了

  1. <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
  2. <dependency>
  3. <groupId>mysql</groupId>
  4. <artifactId>mysql-connector-java</artifactId>
  5. <version>5.1.41</version>
  6. </dependency>

image.png
接着打开application.properties文件或是application.yml文件配置数据库连接属性即可
配置如下:

  1. # application.properties文件中添加如下配置:
  2. spring.datasource.url = jdbc:mysql://192.168.24.135:3306/mysql?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
  3. spring.datasource.driver-class-name = com.mysql.jdbc.Driver
  4. spring.datasource.username = root
  5. spring.datasource.password = 123456
  1. # application.yml文件中添加如下配置:
  2. spring:
  3. # 数据库配置
  4. datasource:
  5. # mysql连接地址
  6. url: jdbc:mysql://192.168.24.135:3306/mysql?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
  7. # 用户名
  8. username: root
  9. # 密码
  10. password: 123456
  11. # 数据库链接驱动
  12. driver-class-name: com.mysql.jdbc.Driver

注意-1:application.properties文件或是application.yml文件,需要在resources目录创建
注意-2: 两个文件存在时application.properties优先级更高

0x03.2 普通使用

./src/main/java/com/example/demo/controller目录创建DbTest1Controller.java

  1. // 文件名字: DbTest1Controller.java
  2. package com.example.demo.controller;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
  5. import org.springframework.context.ApplicationContext;
  6. import org.springframework.jdbc.core.JdbcTemplate;
  7. import org.springframework.stereotype.Controller;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9. import org.springframework.web.bind.annotation.ResponseBody;
  10. import javax.sql.DataSource;
  11. import java.util.List;
  12. import java.util.Map;
  13. @Controller
  14. public class DbTest1Controller {
  15. @Autowired
  16. DataSourceProperties dataSourceProperties;
  17. @Autowired
  18. ApplicationContext applicationContext;
  19. @ResponseBody
  20. @RequestMapping("/DbTest1/index")
  21. public String index() {
  22. // 获取配置的数据源
  23. DataSource dataSource = applicationContext.getBean(DataSource.class);
  24. //执行SQL,输出查到的数据
  25. JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
  26. List<?> resultList = jdbcTemplate.queryForList("select * from user");
  27. // 要显示的结果
  28. String s = "";
  29. // 查看配置数据源信息
  30. s += dataSource + "<br/>";
  31. s += dataSource.getClass().getName() + "<br/>";
  32. s += dataSourceProperties + "<br/>";
  33. s += "<br/>";
  34. // 数据展示
  35. for (Object result : resultList) {
  36. Map<String, Object> r = (Map<String, Object>) result;
  37. s += "用户名: " + r.get("User") + " ";
  38. s += "密 码: " + r.get("Password") + "<br/>";
  39. }
  40. return s;
  41. }
  42. }
  43. // 执行该文件
  44. // 例如: http://127.0.0.1:8081/DbTest1/index

image.png

0x03.3 通过注解配置数据源

通过注解配置DataSource会更灵活一些
而且可以根据项目需求配置多个不同的DataSource(用于项目中需要使用多个数据库)

这里的话,我延时配置两个DataSource来进行演示
创建一个datasource目录,新建DataSource1,DataSource2两个文件,通过注解来配置数据源

0x03.3.1 数据库配置

先打开application.yml文件中添加对应的配置
注意: SpringBoot 2.0中使用jdbc-url配置数据库URL, SpringBoot1.5中使用url,不然会导致一个错误,jdbcUrl is required with driverClassName

  1. # application.yml文件中添加如下配置:
  2. spring:
  3. # 数据库配置
  4. datasource:
  5. # 主数据库的配置
  6. # 默认数据库连接,都会使用它
  7. data1:
  8. jdbc-url: jdbc:mysql://192.168.24.135:3306/mysql?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
  9. username: root
  10. password: 123456
  11. driver-class-name: com.mysql.jdbc.Driver
  12. # 副数据库的配置
  13. data2:
  14. jdbc-url: jdbc:mysql://192.168.24.135:3306/mysql?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
  15. username: root
  16. password: 123456
  17. driver-class-name: com.mysql.jdbc.Driver

image.png

0x03.3.2 创建数据源

接着在./src/main/java/com/example/demo创建个datasource目录

首先创建个DataSource1.java文件,这个文件是拿来当主数据库的数据源

  1. // 文件名字: DataSource1.java
  2. package com.example.demo.datasource;
  3. import org.apache.ibatis.session.SqlSessionFactory;
  4. import org.mybatis.spring.SqlSessionFactoryBean;
  5. import org.mybatis.spring.SqlSessionTemplate;
  6. import org.mybatis.spring.annotation.MapperScan;
  7. import org.springframework.beans.factory.annotation.Qualifier;
  8. import org.springframework.boot.jdbc.DataSourceBuilder;
  9. import org.springframework.boot.context.properties.ConfigurationProperties;
  10. import org.springframework.context.annotation.Bean;
  11. import org.springframework.context.annotation.Configuration;
  12. import org.springframework.context.annotation.Primary;
  13. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
  14. import javax.sql.DataSource;
  15. @Configuration
  16. @MapperScan(sqlSessionFactoryRef = "data1SqlSessionFactory")
  17. public class DataSource1 {
  18. /**
  19. * 返回data1数据库的数据源
  20. *
  21. * @return
  22. */
  23. @Bean(name = "data1Source")
  24. @Primary
  25. @ConfigurationProperties(prefix = "spring.datasource.data1")
  26. public DataSource dataSource() {
  27. return DataSourceBuilder.create().build();
  28. }
  29. /**
  30. * 返回data1数据库的会话工厂
  31. *
  32. * @param ds
  33. * @return
  34. * @throws Exception
  35. */
  36. @Bean(name = "data1SqlSessionFactory")
  37. @Primary
  38. public SqlSessionFactory sqlSessionFactory(@Qualifier("data1Source") DataSource ds) throws Exception {
  39. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
  40. bean.setDataSource(ds);
  41. return bean.getObject();
  42. }
  43. /**
  44. * 返回data1数据库的会话模板
  45. *
  46. * @param sessionFactory
  47. * @return
  48. * @throws Exception
  49. */
  50. @Bean(name = "data1SqlSessionTemplate")
  51. @Primary
  52. public SqlSessionTemplate sqlSessionTemplate(@Qualifier("data1SqlSessionFactory") SqlSessionFactory sessionFactory) throws Exception {
  53. return new SqlSessionTemplate(sessionFactory);
  54. }
  55. /**
  56. * 返回data1数据库的事务
  57. *
  58. * @param ds
  59. * @return
  60. */
  61. @Bean(name = "data1TransactionManager")
  62. @Primary
  63. public DataSourceTransactionManager transactionManager(@Qualifier("data1Source") DataSource ds) {
  64. return new DataSourceTransactionManager(ds);
  65. }
  66. }

然后创建个DataSource2.java文件,这个文件是拿来当副数据库的数据源

  1. // 文件名字: DataSource2.java
  2. package com.example.demo.datasource;
  3. import org.apache.ibatis.session.SqlSessionFactory;
  4. import org.mybatis.spring.SqlSessionFactoryBean;
  5. import org.mybatis.spring.SqlSessionTemplate;
  6. import org.mybatis.spring.annotation.MapperScan;
  7. import org.springframework.beans.factory.annotation.Qualifier;
  8. import org.springframework.boot.jdbc.DataSourceBuilder;
  9. import org.springframework.boot.context.properties.ConfigurationProperties;
  10. import org.springframework.context.annotation.Bean;
  11. import org.springframework.context.annotation.Configuration;
  12. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
  13. import javax.sql.DataSource;
  14. @Configuration
  15. @MapperScan(sqlSessionFactoryRef = "data2SqlSessionFactory")
  16. public class DataSource2 {
  17. /**
  18. * 返回data2数据库的数据源
  19. *
  20. * @return
  21. */
  22. @Bean(name = "data2Source")
  23. @ConfigurationProperties(prefix = "spring.datasource.data2")
  24. public DataSource dataSource() {
  25. return DataSourceBuilder.create().build();
  26. }
  27. /**
  28. * 返回data2数据库的会话工厂
  29. *
  30. * @param ds
  31. * @return
  32. * @throws Exception
  33. */
  34. @Bean(name = "data2SqlSessionFactory")
  35. public SqlSessionFactory sqlSessionFactory(@Qualifier("data2Source") DataSource ds) throws Exception {
  36. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
  37. bean.setDataSource(ds);
  38. return bean.getObject();
  39. }
  40. /**
  41. * 返回data2数据库的会话模板
  42. *
  43. * @param sessionFactory
  44. * @return
  45. * @throws Exception
  46. */
  47. @Bean(name = "data2SqlSessionTemplate")
  48. public SqlSessionTemplate sqlSessionTemplate(@Qualifier("data2SqlSessionFactory") SqlSessionFactory sessionFactory) throws Exception {
  49. return new SqlSessionTemplate(sessionFactory);
  50. }
  51. /**
  52. * 返回data2数据库的事务
  53. *
  54. * @param ds
  55. * @return
  56. */
  57. @Bean(name = "data2TransactionManager")
  58. public DataSourceTransactionManager transactionManager(@Qualifier("data2Source") DataSource ds) {
  59. return new DataSourceTransactionManager(ds);
  60. }
  61. }

DataSource1.java文件与DataSource2.java文件的核心不同就是在于
DataSource1.java文件,每个方法都带了个@Primary这表示它为主数据源
然后默认情况下的数据库连接操作就都会使用DataSource1.java文件进行数据库连接

0x03.3.3 创建测试控制器并测试

./src/main/java/com/example/demo/controller目录创建DbTest2Controller.java

  1. // 文件名字: DbTest2Controller.java
  2. // DbTest2Controller使用的是主数据源
  3. package com.example.demo.controller;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
  6. import org.springframework.context.ApplicationContext;
  7. import org.springframework.jdbc.core.JdbcTemplate;
  8. import org.springframework.stereotype.Controller;
  9. import org.springframework.web.bind.annotation.RequestMapping;
  10. import org.springframework.web.bind.annotation.ResponseBody;
  11. import javax.annotation.Resource;
  12. import javax.sql.DataSource;
  13. import java.util.List;
  14. import java.util.Map;
  15. @Controller
  16. public class DbTest2Controller {
  17. @Autowired
  18. DataSourceProperties dataSourceProperties;
  19. @Autowired
  20. ApplicationContext applicationContext;
  21. @Resource(name = "data1Source")
  22. private DataSource data1Source;
  23. @ResponseBody
  24. @RequestMapping("/DbTest2/index")
  25. public String index() {
  26. //执行SQL,输出查到的数据
  27. JdbcTemplate jdbcTemplate = new JdbcTemplate(data1Source);
  28. List<?> resultList = jdbcTemplate.queryForList("select * from user");
  29. // 要显示的结果
  30. String s = "";
  31. // 查看配置数据源信息
  32. s += data1Source + "<br/>";
  33. s += data1Source.getClass().getName() + "<br/>";
  34. s += dataSourceProperties + "<br/>";
  35. s += "<br/>";
  36. // 数据展示
  37. for (Object result : resultList) {
  38. Map<String, Object> r = (Map<String, Object>) result;
  39. s += "用户名: " + r.get("User") + " ";
  40. s += "密 码: " + r.get("Password") + "<br/>";
  41. }
  42. return s;
  43. }
  44. }
  45. // 执行该文件
  46. // 例如: http://127.0.0.1:8081/DbTest2/index
  1. // 文件名字: DbTest3Controller.java
  2. // DbTest3Controller使用的是副数据源
  3. package com.example.demo.controller;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
  6. import org.springframework.context.ApplicationContext;
  7. import org.springframework.jdbc.core.JdbcTemplate;
  8. import org.springframework.stereotype.Controller;
  9. import org.springframework.web.bind.annotation.RequestMapping;
  10. import org.springframework.web.bind.annotation.ResponseBody;
  11. import javax.annotation.Resource;
  12. import javax.sql.DataSource;
  13. import java.util.List;
  14. import java.util.Map;
  15. @Controller
  16. public class DbTest3Controller {
  17. @Autowired
  18. DataSourceProperties dataSourceProperties;
  19. @Autowired
  20. ApplicationContext applicationContext;
  21. @Resource(name = "data2Source")
  22. private DataSource data2Source;
  23. @ResponseBody
  24. @RequestMapping("/DbTest3/index")
  25. public String index() {
  26. //执行SQL,输出查到的数据
  27. JdbcTemplate jdbcTemplate = new JdbcTemplate(data2Source);
  28. List<?> resultList = jdbcTemplate.queryForList("select * from user");
  29. // 要显示的结果
  30. String s = "";
  31. // 查看配置数据源信息
  32. s += data2Source + "<br/>";
  33. s += data2Source.getClass().getName() + "<br/>";
  34. s += dataSourceProperties + "<br/>";
  35. s += "<br/>";
  36. // 数据展示
  37. for (Object result : resultList) {
  38. Map<String, Object> r = (Map<String, Object>) result;
  39. s += "用户名: " + r.get("User") + " ";
  40. s += "密 码: " + r.get("Password") + "<br/>";
  41. }
  42. return s;
  43. }
  44. }
  45. // 执行该文件
  46. // 例如: http://127.0.0.1:8081/DbTest3/index

image.png
可以看的到http://127.0.0.1:8081/DbTest1/indexhttp://127.0.0.1:8081/DbTest2/index是一致的
表示现在默认情况下的数据库连接使用的都是datasource1.java作为,主数据源
http://127.0.0.1:8081/DbTest3/index设置的是`datasource2.java`所以不受影响

0x04 第三方数据源

如果不想使用SpringBoot默认支持的4种数据源,还可以选择使用其他第三方的数据源
例如:Druid、C3P0等,这里我使用Druid数据源为例

0x04.1 添加依赖

按照上面的搭建完环境以后,就找到pom.xml找到<dependencies>标签
然后如下使用maven自动添加包

  1. <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
  2. <dependency>
  3. <groupId>com.alibaba</groupId>
  4. <artifactId>druid</artifactId>
  5. <version>1.1.23</version>
  6. </dependency>

image.png

0x04.2 配置数据库

接着打开application.properties文件或是application.yml文件配置数据库连接属性即可
配置如下:

  1. # application.properties文件中添加如下配置:
  2. spring.datasource.data3.jdbc-url = jdbc:mysql://192.168.24.135:3306/mysql?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
  3. spring.datasource.data3.driver-class-name = com.mysql.jdbc.Driver
  4. spring.datasource.data3.username = root
  5. spring.datasource.data3.password = 123456
  1. # application.yml文件中添加如下配置:
  2. spring:
  3. # 数据库配置
  4. datasource:
  5. # 副数据库的配置
  6. data3:
  7. jdbc-url: jdbc:mysql://192.168.24.135:3306/mysql?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
  8. username: root
  9. password: 123456
  10. driver-class-name: com.mysql.jdbc.Driver

0x04.3 创建数据源

接着在./src/main/java/com/example/demo创建个datasource目录

首先创建个DataSource3.java文件,这个文件是使用拿来当副数据库的Druid数据源

  1. // 文件名字: DataSource3.java
  2. package com.example.demo.datasource;
  3. import com.alibaba.druid.pool.DruidDataSource;
  4. import org.apache.ibatis.session.SqlSessionFactory;
  5. import org.mybatis.spring.SqlSessionFactoryBean;
  6. import org.mybatis.spring.SqlSessionTemplate;
  7. import org.mybatis.spring.annotation.MapperScan;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.beans.factory.annotation.Qualifier;
  10. import org.springframework.context.annotation.Bean;
  11. import org.springframework.context.annotation.Configuration;
  12. import org.springframework.core.env.Environment;
  13. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
  14. import javax.sql.DataSource;
  15. @Configuration
  16. @MapperScan(sqlSessionFactoryRef = "data3SqlSessionFactory")
  17. public class DataSource3 {
  18. @Autowired
  19. private Environment env;
  20. /**
  21. * 返回data3数据库的数据源
  22. *
  23. * @return
  24. */
  25. @Bean(name = "data3Source")
  26. public DataSource dataSource() {
  27. DruidDataSource dataSource = new DruidDataSource();
  28. dataSource.setUrl(env.getProperty("spring.datasource.data3.jdbc-url"));
  29. dataSource.setUsername(env.getProperty("spring.datasource.data3.username"));
  30. dataSource.setPassword(env.getProperty("spring.datasource.data3.password"));
  31. dataSource.setDriverClassName(env.getProperty("spring.datasource.data3.driver-class-name"));
  32. return dataSource;
  33. }
  34. /**
  35. * 返回data3数据库的会话工厂
  36. *
  37. * @param ds
  38. * @return
  39. * @throws Exception
  40. */
  41. @Bean(name = "data3SqlSessionFactory")
  42. public SqlSessionFactory sqlSessionFactory(@Qualifier("data3Source") DataSource ds) throws Exception {
  43. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
  44. bean.setDataSource(ds);
  45. return bean.getObject();
  46. }
  47. /**
  48. * 返回data3数据库的会话模板
  49. *
  50. * @param sessionFactory
  51. * @return
  52. * @throws Exception
  53. */
  54. @Bean(name = "data3SqlSessionTemplate")
  55. public SqlSessionTemplate sqlSessionTemplate(@Qualifier("data3SqlSessionFactory") SqlSessionFactory sessionFactory) throws Exception {
  56. return new SqlSessionTemplate(sessionFactory);
  57. }
  58. /**
  59. * 返回data3数据库的事务
  60. *
  61. * @param ds
  62. * @return
  63. */
  64. @Bean(name = "data3TransactionManager")
  65. public DataSourceTransactionManager transactionManager(@Qualifier("data3Source") DataSource ds) {
  66. return new DataSourceTransactionManager(ds);
  67. }
  68. }

0x04.4 创建测试控制器并测试

./src/main/java/com/example/demo/controller目录创建DbTest4Controller.java

  1. // 文件名字: DbTest4Controller.java
  2. // DbTest4Controller使用的是Druid作为数据源
  3. package com.example.demo.controller;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
  6. import org.springframework.context.ApplicationContext;
  7. import org.springframework.jdbc.core.JdbcTemplate;
  8. import org.springframework.stereotype.Controller;
  9. import org.springframework.web.bind.annotation.RequestMapping;
  10. import org.springframework.web.bind.annotation.ResponseBody;
  11. import javax.annotation.Resource;
  12. import javax.sql.DataSource;
  13. import java.util.List;
  14. import java.util.Map;
  15. @Controller
  16. public class DbTest4Controller {
  17. @Autowired
  18. DataSourceProperties dataSourceProperties;
  19. @Autowired
  20. ApplicationContext applicationContext;
  21. @Resource(name = "data3Source")
  22. private DataSource data3Source;
  23. @ResponseBody
  24. @RequestMapping("/DbTest4/index")
  25. public String index() {
  26. //执行SQL,输出查到的数据
  27. JdbcTemplate jdbcTemplate = new JdbcTemplate(data3Source);
  28. List<?> resultList = jdbcTemplate.queryForList("select * from user");
  29. // 要显示的结果
  30. String s = "";
  31. // 查看配置数据源信息
  32. s += data3Source + "<br/>";
  33. s += data3Source.getClass().getName() + "<br/>";
  34. s += dataSourceProperties + "<br/>";
  35. s += "<br/>";
  36. // 数据展示
  37. for (Object result : resultList) {
  38. Map<String, Object> r = (Map<String, Object>) result;
  39. s += "用户名: " + r.get("User") + " ";
  40. s += "密 码: " + r.get("Password") + "<br/>";
  41. }
  42. return s;
  43. }
  44. }
  45. // 执行该文件
  46. // 例如: http://127.0.0.1:8081/DbTest4/index

image.png

0x05 小结

了解一些基础SpringBoot数据库操作,也是不错的
在实战中遇到SpringBoot项目的话,想找数据库配置
一般找项目的./src/main/resources/目录下即可查找到

0x06 参考文章

https://blog.csdn.net/tanga842428/article/details/79484753
https://blog.csdn.net/pengjunlee/article/details/80081231
https://blog.csdn.net/nizhengjia888/article/details/85063033
https://blog.csdn.net/qq_35760213/article/details/73863252
https://blog.csdn.net/qq_39016934/article/details/89892172
https://www.cnblogs.com/lijianda/p/11022892.html