文章目录
- 背景
- 依赖
- application.yml 配置
- 单个 mysql 数据源(大多数业务项目中的场景)
- 多个 mysql 数据源
- 数据源 config 代码
- 单个 mysql 数据源
- 多个 mysql 数据源
- 基本使用
- 其他
背景
前置要求:
你使用 springboot 框架,希望配置 mysql 数据源,你可能使用 mybatis 或者 mybatis plus 框架
mysql 驱动:
mysql 官方驱动:MySQL Connector/J
第三方常用驱动:MariaDB JDBC 等,第三方驱动可能提供额外的功能或优化
mysql 官方没有提供专门的连接池实现:
但是推荐使用第三方连接池都可以于 MySQL Connector/J 配合使用,比如 HikariCP,Apache DBCP2,Tomcat JDBC Pool,C3P0
springboot 默认支持的 mysql 驱动:
springboot 默认使用的是 MySQL Connector/J,Spring Boot 会根据其版本自动选择合适的 MySQL Connector/J 版本,通常你无需手动指定,也就是说如果你有 spring-boot-starter-jdbc 依赖,那么就无需引入 Connector/J 的依赖了
springboot 默认支持连接池:
Spring Boot 默认使用 HikariCP 作为连接池
springboot 配置 mysql 数据源,本质就是指定用哪个 mysql 驱动,以及 mysql 的 host(连接,端口,用户,密码),以及要连那个库,配置好后,剩下的就是通过 mybatis 提供的 api 去操作你配置指向的数据源的数据了
依赖
如果有 spring-boot-starter-jdbc 依赖,它默认包含了对 MySQL Connector/J 的支持,所以再无需引入 mysql-connector-j 依赖了
application.yml 配置
单个 mysql 数据源(大多数业务项目中的场景)
如果你使用 Connector/J 这个 springboot 默认的 mysql 驱动,那么
spring:datasource:url: jdbc:mysql://localhost:3306/your_database_name?characterEncoding=utf-8&useSSL=false&serverTimezone=UTCusername: your_usernamepassword: your_passworddriver-class-name: com.mysql.cj.jdbc.Driver# 更复杂一点,配置连接池hikari:maximum-pool-size: 10 # 连接池最大连接数minimum-idle: 2 # 连接池最小空闲连接数idle-timeout: 30000 # 空闲连接超时时间(毫秒)max-lifetime: 1800000 # 连接最大存活时间(毫秒)connection-timeout: 30000 # 连接超时时间(毫秒)
多个 mysql 数据源
spring:datasource:primary: # 这个第一个数据源的名字,自己起url: jdbc:mysql://localhost:3306/userdbusername: rootpassword: passworddriver-class-name: com.mysql.cj.jdbc.Driversecondary: # 这个第二个数据源的名字,自己起url: jdbc:mysql://localhost:3306/orderdbusername: rootpassword: passworddriver-class-name: com.mysql.cj.jdbc.Driver
数据源 config 代码
单个 mysql 数据源
如果你配置单个 mysql 数据源,你完全不用去写 mysql 数据源的 configuration 的代码,无需指定数据源和 mapper 包的映射关系,即你只用配置 yml 就完事了,然后对应接口打上 @mapper 注解,就可以使用 mybatis 提供的 api 来进行数据库的操作,操作数据库 @mapper 标记的接口会自动使用 yml 中配置的唯一的数据源
多个 mysql 数据源
如果 application.yml 中有多个 mysql 数据源,那么你必须手写代码做 configuration,来指定哪个数据源和哪个 mapper 包建立绑定关系,这样指定的 mapper 包在做数据库操作时候才能知道要对哪个数据源做操作
@Configuration
@EnableTransactionManagement
@MapperScan(basePackages = "com.example.primary.mapper", sqlSessionFactoryRef = "primarySqlSessionFactory")
public class PrimaryDataSourceConfig { // 数据源@Primary @Bean(name = "primaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.primary") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } // SqlSessionFactory@Primary @Bean(name = "primarySqlSessionFactory") public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean(); sessionFactoryBean.setDataSource(dataSource); return sessionFactoryBean.getObject(); } // 事务管理@Primary @Bean(name = "primaryTransactionManager") // 事务管理器public DataSourceTransactionManager primaryTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); }
} @Configuration
@EnableTransactionManagement
@MapperScan(basePackages = "com.example.secondary.mapper", sqlSessionFactoryRef = "secondarySqlSessionFactory")
public class SecondaryDataSourceConfig { // 数据源@Bean(name = "secondaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.secondary") public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); } // SqlSessionFactory@Bean(name = "secondarySqlSessionFactory") public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean(); sessionFactoryBean.setDataSource(dataSource); return sessionFactoryBean.getObject(); } // 事务管理@Bean(name = "secondaryTransactionManager") // 事务管理器public DataSourceTransactionManager secondaryTransactionManager(@Qualifier("secondaryDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); }
}
多数据源,可以看到代码中会指定关联哪个 mapper 包
基本使用
当配置上 yml mysql 数据源后,并且 configuration 代码逻辑也写了(如果是多数据源),然后就可以正常使用 mybatis/mybatis plus 来进行常规的数据的 crud 了
其他
如果你仅仅使用了 mybatis,springboot 没有使用(即没有 yml),那怎么配置呢?
回答:你可以手动写 sqlSession 生成的代码,然后指定关联上哪个 mybatis-config.xml 文件,然后 mybatis-config.xml 中可以配置 mapper 包,以及配置 mysql 数据源和连接池,这样生成的 sqlSession 就可以操作数据库,后续可以利用 sqlsession 拿到 @mapper 标记的 mapper,然后再操作数据库
如果你的项目已经有一个 mysql 数据源了,你想加一个数据源,又不想变动 yml 该怎么做?
回答:你可以直接写第二个数据源的 configuration,然后其中含有 mysql 的连接信息
@Configuration
@MapperScan(basePackages = "com.example.secondary.mapper", sqlSessionFactoryRef = "secondarySqlSessionFactory")
public class SecondaryDataSourceConfig { // 这里你可以通过编程方式设置数据源属性,或者从环境变量、系统属性等获取 private static final String DB_URL = "jdbc:mysql://localhost:3306/secondary_db"; private static final String USER = "root"; private static final String PASSWORD = "password"; private static final String DRIVER_CLASS_NAME = "com.mysql.cj.jdbc.Driver"; @Bean(name = "secondaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.secondary") // 注意:这里实际上不会从application.yml加载,因为我们手动配置了 public DataSource secondaryDataSource() { return DataSourceBuilder.create() .url(DB_URL) .username(USER) .password(PASSWORD) .driverClassName(DRIVER_CLASS_NAME) .build(); } @Bean(name = "secondarySqlSessionFactory") public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mappers/secondary/*.xml")); return sessionFactory.getObject(); } // 你还可以配置一个SqlSessionTemplate,但这里为了简洁省略了
}