下面是“Spring Boot连接不同数据库的写法详解”的完整攻略。
1. 引入对应的数据库依赖
在使用Spring Boot连接不同的数据库时,需要根据使用的数据库引入对应的依赖。
-
MySQL
xml
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency> -
PostgreSQL
xml
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
2. 配置数据源
在Spring Boot中,可以使用application.properties或application.yml文件来配置数据源。
-
application.properties配置MySQL数据源
properties
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver -
application.yml配置PostgreSQL数据源
yaml
spring:
datasource:
url: jdbc:postgresql://localhost:5432/test
username: postgres
password: postgres
driver-class-name: org.postgresql.Driver
3. 多数据源的配置
Spring Boot支持多数据源的配置,下面分别介绍两种不同的多数据源方式。
3.1 注解方式
使用注解方式可以在启动类上加上@MapperScan
和@EnableTransactionManagement
注解,其中@MapperScan
注解的basePackages
属性指定Mapper文件所在的包,@EnableTransactionManagement
注解开启事务。
@SpringBootApplication
@MapperScan(basePackages = "com.example.demo.dao.mysql", sqlSessionFactoryRef = "mysqlSqlSessionFactory")
@EnableTransactionManagement
public class MultiDataSourcesApplication {
//...
}
在MySQL和PostgreSQL的数据源配置类上加上@Configuration
和@MapperScan
注解,并指定不同的@Bean
名称和Mapper文件所在的包,同时使用@Qualifier
注解指定对应的数据源名称。
@Configuration
@MapperScan(basePackages = "com.example.demo.dao.postgresql", sqlSessionTemplateRef = "postgresqlSqlSessionTemplate")
public class PostgreSQLDataSourceConfig {
@Bean(name = "postgresqlDataSource")
@ConfigurationProperties(prefix = "spring.datasource.postgresql")
public DataSource postgresqlDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "postgresqlSqlSessionFactory")
public SqlSessionFactory postgresqlSqlSessionFactory(@Qualifier("postgresqlDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
return sessionFactoryBean.getObject();
}
@Bean(name = "postgresqlTransactionManager")
public DataSourceTransactionManager postgresqlTransactionManager(@Qualifier("postgresqlDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "postgresqlSqlSessionTemplate")
public SqlSessionTemplate postgresqlSqlSessionTemplate(@Qualifier("postgresqlSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
@Configuration
@MapperScan(basePackages = "com.example.demo.dao.mysql", sqlSessionTemplateRef = "mysqlSqlSessionTemplate")
public class MySQLDataSourceConfig {
@Bean(name = "mysqlDataSource")
@ConfigurationProperties(prefix = "spring.datasource.mysql")
public DataSource mysqlDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "mysqlSqlSessionFactory")
public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqlDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
return sessionFactoryBean.getObject();
}
@Bean(name = "mysqlTransactionManager")
public DataSourceTransactionManager mysqlTransactionManager(@Qualifier("mysqlDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "mysqlSqlSessionTemplate")
public SqlSessionTemplate mysqlSqlSessionTemplate(@Qualifier("mysqlSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
3.2 配置多个数据源
使用配置多个数据源的方式可以在application.properties或application.yml中配置多个数据源。
spring:
datasource:
mysql:
url: jdbc:mysql://localhost:3306/test
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
postgresql:
url: jdbc:postgresql://localhost:5432/test
username: postgres
password: postgres
driver-class-name: org.postgresql.Driver
需要在每个数据源相关的类上加上@ConfigurationProperties
注解,并指定前缀为对应的数据源名称。
@Configuration
@ConfigurationProperties(prefix = "spring.datasource.mysql")
public class MySQLDataSourceConfig {
private String url;
private String username;
private String password;
private String driverClassName;
@Bean(name = "mysqlDataSource")
public DataSource mysqlDataSource() {
return DataSourceBuilder.create().url(url).username(username).password(password).driverClassName(driverClassName).build();
}
//...
}
4. 示例
下面提供两个示例,一个是使用注解方式,一个是使用配置方式。
4.1 使用注解方式
-
MySQL
java
@Repository
public interface UserDao {
@Insert("insert into user(name, age) values(#{name}, #{age})")
void addUser(@Param("name") String name, @Param("age") Integer age);
} -
PostgreSQL
java
@Repository
public interface UserLogDao {
@Insert("insert into user_log(user_id, content) values(#{userId}, #{content})")
void addUserLog(@Param("userId") Integer userId, @Param("content") String content);
}
在ServiceImpl类中注入对应的Mapper即可。
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Autowired
private UserLogDao userLogDao;
@Transactional(rollbackFor = Exception.class)
@Override
public void addUserAndLog(String userName, Integer age, String content) {
userDao.addUser(userName, age);
userLogDao.addUserLog(1, content);
throw new RuntimeException(); //模拟异常
}
}
4.2 使用配置方式
-
MySQL
java
@Repository
public interface UserDao {
@Insert("insert into user(name, age) values(#{name}, #{age})")
void addUser(@Param("name") String name, @Param("age") Integer age);
} -
PostgreSQL
java
@Repository
public interface UserLogDao {
@Insert("insert into user_log(user_id, content) values(#{userId}, #{content})")
void addUserLog(@Param("userId") Integer userId, @Param("content") String content);
}
使用@Qualifier注解指定对应的Mapper。
@Service
public class UserServiceImpl implements UserService {
@Qualifier("mysqlSqlSessionTemplate")
@Autowired
private SqlSessionTemplate mysqlSqlSessionTemplate;
@Qualifier("postgresqlSqlSessionTemplate")
@Autowired
private SqlSessionTemplate postgresqlSqlSessionTemplate;
@Transactional(rollbackFor = Exception.class)
@Override
public void addUserAndLog(String userName, Integer age, String content) {
UserDao userDao = mysqlSqlSessionTemplate.getMapper(UserDao.class);
UserLogDao userLogDao = postgresqlSqlSessionTemplate.getMapper(UserLogDao.class);
userDao.addUser(userName, age);
userLogDao.addUserLog(1, content);
throw new RuntimeException(); //模拟异常
}
}
以上就是“Spring Boot连接不同数据库的写法详解”的攻略,希望能对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot连接不同数据库的写法详解 - Python技术站