druid+mybatis架构下@MapperScan标签和手动创建SqlSessionFactory的bean功能是一样的么
时间: 2024-03-29 18:40:23 浏览: 73
在druid+mybatis架构下,@MapperScan标签和手动创建SqlSessionFactory的bean实现的功能不完全相同,但它们都是用来进行MyBatis的mapper接口扫描和注册的。
@MapperScan是MyBatis-Spring提供的注解,它可以自动扫描指定包下的mapper接口,并将其注册到Spring容器中。这样就可以通过@Autowired或@Resource等注解来注入mapper接口实例,从而方便地使用MyBatis进行数据库操作。
手动创建SqlSessionFactory的bean也能够注册mapper接口,但需要进行一些额外的配置。需要手动指定mapper接口的位置,并将其注入到SqlSessionFactory中,然后再将SqlSessionFactory注入到需要使用的类中。相比之下,@MapperScan注解更加方便快捷。
总之,@MapperScan标签和手动创建SqlSessionFactory的bean都是用来注册mapper接口的,但是@MapperScan注解更加方便,而手动创建SqlSessionFactory的bean则需要进行一些额外的配置。
相关问题
3分钟搞定SpringBoot+Mybatis+druid多数据源和分布式事务
### 回答1:
首先,为了使用多数据源和分布式事务,我们需要添加以下依赖:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.6</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>
```
接下来,我们需要在application.properties文件中配置数据源和事务管理器:
```properties
# 配置主数据源
spring.datasource.url=jdbc:mysql://localhost:3306/main_db?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 配置从数据源
spring.datasource.slave.url=jdbc:mysql://localhost:3306/slave_db?characterEncoding=utf8&useSSL=false
spring.datasource.slave.username=root
spring.datasource.slave.password=root
spring.datasource.slave.driver-class-name=com.mysql.jdbc.Driver
# 配置Mybatis
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.example.entity
# 配置Druid数据源
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.initial-size=1
spring.datasource.druid.max-active=10
spring.datasource.druid.min-idle=1
spring.datasource.druid.max-wait=60000
spring.datasource.druid.time-between-eviction-runs-millis=60000
spring.datasource.druid.min-evictable-idle-time-millis=300000
spring.datasource.druid.test-while-idle=true
spring.datasource.druid.test-on-borrow=false
spring.datasource.druid.test-on-return=false
spring.datasource.druid.filters=stat,wall,log4j
spring.datasource.druid.connection-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 配置事务管理器
spring.transaction.default-timeout=600
spring.transaction.rollback-on-commit-failure=true
spring.transaction.allow-bean-definition-overriding=true
spring.transaction.jta.registry-name=atomikos
spring.jta.enabled=true
spring.jta.atomikos.connectionfactory.min-pool-size=5
spring.jta.atomikos.connectionfactory.max-pool-size=10
spring.jta.atomikos.connectionfactory.borrow-connection-timeout=30
spring.jta.atomikos.connectionfactory.max-idle-time=60
spring.jta.atomikos.connectionfactory.concurrency-level=100
```
然后,我们需要创建两个数据源的配置类,分别为主数据源和从数据源:
```java
@Configuration
@MapperScan(basePackages = "com.example.mapper.main", sqlSessionTemplateRef = "mainSqlSessionTemplate")
public class MainDataSourceConfig {
@Bean(name = "mainDataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource mainDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "mainSqlSessionFactory")
public SqlSessionFactory mainSqlSessionFactory(@Qualifier("mainDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/main/*.xml"));
return bean.getObject();
}
@Bean(name = "mainTransactionManager")
public DataSourceTransactionManager mainTransactionManager(@Qualifier("mainDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "mainSqlSessionTemplate")
public SqlSessionTemplate mainSqlSessionTemplate(@Qualifier("mainSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
```
```java
@Configuration
@MapperScan(basePackages = "com.example.mapper.slave", sqlSessionTemplateRef = "slaveSqlSessionTemplate")
public class SlaveDataSourceConfig {
@Bean(name = "slaveDataSource")
@ConfigurationProperties(prefix = "spring.datasource.slave")
public DataSource slaveDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "slaveSqlSessionFactory")
public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/slave/*.xml"));
return bean.getObject();
}
@Bean(name = "slaveTransactionManager")
public DataSourceTransactionManager slaveTransactionManager(@Qualifier("slaveDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "slaveSqlSessionTemplate")
public SqlSessionTemplate slaveSqlSessionTemplate(@Qualifier("slaveSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
```
最后,我们需要在事务管理器上添加注解@EnableTransactionManagement,并在需要使用事务的方法上添加注解@Transactional:
```java
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Transactional(rollbackFor = Exception.class, transactionManager = "mainTransactionManager")
@Override
public void save(User user) {
userMapper.insert(user);
}
@Transactional(rollbackFor = Exception.class, transactionManager = "slaveTransactionManager")
@Override
public User findById(int id) {
return userMapper.selectByPrimaryKey(id);
}
}
```
以上就是使用SpringBoot+Mybatis+druid多数据源和分布式事务的基本步骤。
### 回答2:
Spring Boot是一个用于构建独立的、生产级的应用程序的框架。它简化了应用程序的开发过程,并通过自动配置来减少了繁琐的配置。MyBatis是一个ORM(对象关系映射)框架,它提供了将数据库操作映射到Java对象的功能。Druid是一种高性能的数据库连接池。
要在Spring Boot中使用MyBatis和Druid进行多数据源配置和分布式事务管理,可以按照以下步骤进行操作:
1. 添加依赖:在项目的pom.xml文件中,添加Spring Boot、MyBatis和Druid的依赖。
2. 配置数据源:在application.properties文件中,配置并命名多个数据源,设置数据库连接等信息。
3. 创建数据源配置类:创建一个配置类,使用@Configuration注解将其标记为配置类,并使用@ConfigurationProperties注解将数据源属性注入。
4. 创建数据源:根据配置类中的属性,创建多个数据源,并将其加入到数据源路由器中。
5. 配置MyBatis:创建一个配置类,使用@MapperScan注解设置MyBatis的mapper接口路径,并将数据源注入到SqlSessionFactory中。
6. 配置分布式事务:使用@EnableTransactionManagement注解启用事务管理,并配置事务管理器。
7. 编写数据库操作代码:在mapper接口中定义数据库操作方法,并在Service层中调用这些方法进行数据库操作。
通过以上步骤,你就可以在Spring Boot项目中完成MyBatis和Druid的多数据源配置和分布式事务管理。不过需要注意的是,使用多数据源和分布式事务会增加项目的复杂性和性能开销,所以在使用之前需要仔细考虑是否真正需要这些功能。
### 回答3:
Spring Boot是一种快速构建Java应用程序的框架,MyBatis是一种流行的Java持久化框架,Druid是一种高性能的数据库连接池。本文将介绍如何在Spring Boot中使用MyBatis和Druid来实现多数据源和分布式事务。
要使用多个数据源,我们首先需要配置多个数据源。在Spring Boot中,我们可以通过在application.properties或者application.yml文件中配置多个数据源的连接信息。我们需要为每个数据源指定不同的URL、用户名和密码。然后,我们可以使用@Primary和@Qualifier来指定主数据源和其他数据源。
在配置数据源后,我们需要配置MyBatis来使用这些数据源。我们可以通过创建多个SqlSessionFactory来实现多数据源,然后在每个SqlSessionFactory中设置相应的数据源。我们还可以使用@MapperScan注解来自动扫描和注册Mapper接口。
在使用MyBatis和多个数据源时,我们可能会遇到事务管理的问题。为了解决这个问题,我们可以使用Spring Boot提供的@Transactional注解来标记需要进行事务管理的方法,然后Spring Boot会自动为我们处理事务。对于需要跨多个数据源进行事务管理的情况,我们可以使用JTA(Java Transaction API)实现分布式事务。在Spring Boot中,我们可以使用Atomikos或Bitronix等JTA提供商来实现分布式事务。
总结起来,使用Spring Boot、MyBatis和Druid,我们可以很容易地实现多数据源和分布式事务。通过正确配置数据源和使用相关注解,我们可以在几分钟内完成这些任务。
mysql + mybatis + druid,多数据源配置
对于使用 MySQL、MyBatis 和 Druid 实现多数据源配置,你可以按照以下步骤进行操作:
1. 添加相关依赖:在你的项目中,首先需要添加 MySQL、MyBatis 和 Druid 的相关依赖。你可以在项目的 `pom.xml` 文件中添加以下依赖:
```xml
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>版本号</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>版本号</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>版本号</version>
</dependency>
```
请确保将 `版本号` 替换为你所需的实际版本。
2. 配置数据源:在 `application.properties` 或 `application.yml` 文件中配置数据源的相关信息。以下是一个示例配置:
```yaml
spring:
datasource:
master:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/master_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
username: root
password: password
slave:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/slave_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
username: root
password: password
```
这里使用了两个数据源,一个是 `master`,另一个是 `slave`。你可以根据实际情况进行配置。
3. 配置 Druid 连接池:在 `application.properties` 或 `application.yml` 文件中配置 Druid 连接池的相关信息。以下是一个示例配置:
```yaml
spring:
datasource:
druid:
initial-size: 5
min-idle: 5
max-active: 20
test-on-borrow: true
validation-query: SELECT 1
```
这里配置了 Druid 连接池的一些常用参数,你可以根据实际需求进行调整。
4. 配置 MyBatis:创建 MyBatis 的配置文件,例如 `MyBatisConfig.java`,并在其中配置数据源和相关的 MyBatis 设置。以下是一个示例配置:
```java
@Configuration
@MapperScan(basePackages = "com.example.mapper", sqlSessionTemplateRef = "sqlSessionTemplate")
public class MyBatisConfig {
@Primary
@Bean(name = "masterDataSource")
@ConfigurationProperties(prefix = "spring.datasource.master")
public DataSource masterDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "slaveDataSource")
@ConfigurationProperties(prefix = "spring.datasource.slave")
public DataSource slaveDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Primary
@Bean(name = "sqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource,
@Qualifier("slaveDataSource") DataSource slaveDataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dynamicDataSource(masterDataSource, slaveDataSource));
return sessionFactory.getObject();
}
@Bean(name = "sqlSessionTemplate")
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean(name = "dynamicDataSource")
public DataSource dynamicDataSource(@Qualifier("masterDataSource") DataSource masterDataSource,
@Qualifier("slaveDataSource") DataSource slaveDataSource) {
DynamicRoutingDataSource dynamicRoutingDataSource = new DynamicRoutingDataSource();
Map<Object, Object> dataSourceMap = new HashMap<>();
dataSourceMap.put("master", masterDataSource);
dataSourceMap.put("slave", slaveDataSource);
dynamicRoutingDataSource.setDefaultTargetDataSource(masterDataSource);
dynamicRoutingDataSource.setTargetDataSources(dataSourceMap);
return dynamicRoutingDataSource;
}
}
```
在这个配置类中,我们创建了两个数据源 `masterDataSource` 和 `slaveDataSource`,并将它们注入到 `dynamicDataSource` 中。通过 `DynamicRoutingDataSource` 来实现动态切换数据源。
5. 创建 Mapper 接口和 XML 文件:按照正常的 MyBatis 开发流程,创建 Mapper 接口和对应的 XML 文件,并在其中编写 SQL 语句。
完成上述步骤后,你就成功地配置了 MySQL、MyBatis 和 Druid 的多数据源。你可以根据需要在不同的业务中使用不同的数据源。
阅读全文
相关推荐
















