精通SpringBoot —— 第十四篇:整合mybatis和jpa的多数据源
刚更新了一篇SpringBoot整合mybatis。突然想mybatis虽然功能强大,但是对sql的要求还是算高的。Spring Data Jpa对于某些用户来说 ,还是个比较简单的选择。毕竟不用写较复杂的sql语句,于是就想,来一个SpringBoot+mybatis + jpa的大杂烩。
说到底,多数据源整合其实就是要保证项目中有且仅有一个primaryDataSource,即主数据源,它是无可替代的。
先看application.yml 有多少个数据源就的配置多少个数据库链接
spring:
## multipart datasource configuration ##
datasource:
primary:
jdbc-url: jdbc:mysql://localhost:3306/javashop
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
secondary:
jdbc-url: jdbc:mysql://localhost:3306/test
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
master:
jdbc-url: jdbc:mysql://localhost:3306/javashop
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
cluster:
jdbc-url: jdbc:mysql://localhost:3306/test
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
jpa:
hibernate:
ddl-auto: update
naming:
physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
show-sql: true
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
项目结构图
└─src
├─main
│ ├─java
│ │ └─com
│ │ └─developlee
│ │ └─multipartdatasource
│ │ │ MultipartDatasourceApplication.java
│ │ │
│ │ ├─config
│ │ │ ├─jpa
│ │ │ │ DataSourceConfig.java
│ │ │ │ PrimaryDataSourceConfig.java
│ │ │ │ SecondaryDataSourceConfig.java
│ │ │ │
│ │ │ └─mybatis
│ │ │ ClusterDataSourceConfig.java
│ │ │ MasterDataSourceConfig.java
│ │ │
│ │ ├─dao
│ │ │ ├─jpa
│ │ │ │ ├─primary
│ │ │ │ │ UserRepository.java
│ │ │ │ │
│ │ │ │ └─secondary
│ │ │ │ CityRepository.java
│ │ │ │
│ │ │ └─mybatis
│ │ │ ├─cluster
│ │ │ │ CityDao.java
│ │ │ │
│ │ │ └─master
│ │ │ UserDao.java
│ │ │
│ │ ├─entity
│ │ │ ├─jpa
│ │ │ │ ├─primary
│ │ │ │ │ UserEntity.java
│ │ │ │ │
│ │ │ │ └─secondary
│ │ │ │ CityEntity.java
│ │ │ │
│ │ │ └─mybatis
│ │ │ ├─cluster
│ │ │ │ MybatisCityEntity.java
│ │ │ │
│ │ │ └─master
│ │ │ MybatisUserEntity.java
│ │ │
│ │ └─service
│ │ │ CityService.java
│ │ │ UserService.java
│ │ │
│ │ └─impl
│ │ CityServiceImpl.java
│ │ UserServiceImpl.java
│ │
│ └─resources
│ │ application.yml
│ │
│ ├─mapper
│ │ ├─cluster
│ │ │ city.xml
│ │ │
│ │ └─master
│ │ user.xml
│ │
│ ├─static
│ └─templates
└─test
└─java
└─com
└─developlee
└─multipartdatasource
MultipartDatasourceApplicationTests.java
从文件树可以看到,对每个数据源要操作的实体类和数据接口都进行隔离。
jpa数据源配置
@Configuration
public class DataSourceConfig {
@Bean(name = "primaryDataSource")
@Qualifier("primaryDataSource")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondaryDataSource")
@Qualifier("secondaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
}
JPA-primary主数据源配置
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "primaryEntityManagerFactory",
transactionManagerRef = "primaryTransactionManager",
basePackages = { PrimaryDataSourceConfig.REPO_PACKAGE } // 设置 Repository 所在位置
)
public class PrimaryDataSourceConfig {
static final String REPO_PACKAGE = "com.developlee.multipartdatasource.dao.jpa.primary";
static final String ENTITY_PACKAGE = "com.developlee.multipartdatasource.entity.jpa.primary";
@Resource
@Qualifier("primaryDataSource")
private DataSource primaryDataSource;
@Resource
private JpaProperties jpaProperties;
@Primary
@Bean(name = "primaryEntityManager")
public EntityManager primaryEntityManager(EntityManagerFactoryBuilder builder) {
return primaryEntityManagerFactory(builder).getObject().createEntityManager();
}
@Primary
@Bean(name = "primaryEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(EntityManagerFactoryBuilder builder) {
return builder.dataSource(primaryDataSource)
.properties(jpaProperties.getHibernateProperties(new HibernateSettings()))
.persistenceUnit("primaryPersistenceUnit")
.packages(ENTITY_PACKAGE)
.build();
}
@Primary
@Bean(name = "primaryTransactionManager")
public PlatformTransactionManager primaryTransactionManager(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(primaryEntityManagerFactory(builder).getObject());
}
}
jpa-secondary的从数据源与此类似。
mybatis-master数据源配置
@Configuration
@MapperScan(basePackages = MasterDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterDataSourceConfig {
// 精确到master目录和其他数据源隔离
static final String PACKAGE = "com.developlee.multipartdatasource.dao.mybatis.master";
static final String MAPPER_LOCATION = "classpath:mapper/master/*.xml";
@Value("${spring.datasource.master.jdbc-url}")
private String url;
@Value("${spring.datasource.master.username}")
private String user;
@Value("${spring.datasource.master.password}")
private String password;
@Value("${spring.datasource.master.driver-class-name}")
private String driverClass;
@Bean(name = "masterDataSource")
public DataSource masterDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClass);
dataSource.setUrl(url);
dataSource.setUsername(user);
dataSource.setPassword(password);
return dataSource;
}
@Bean(name = "masterTransactionManager")
@Primary
public DataSourceTransactionManager masterTransactionManager() {
return new DataSourceTransactionManager(masterDataSource());
}
@Bean(name = "masterSqlSessionFactory")
@Primary
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(masterDataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(MasterDataSourceConfig.MAPPER_LOCATION));
return sessionFactory.getObject();
}
}
mybatis-cluster数据源配置与此类似。
测试
说明下,业务逻辑代码就不贴了,可在我的github中找到。
@RunWith(SpringRunner.class)
@SpringBootTest
public class MultipartDatasourceApplicationTests {
@Autowired
UserServiceImpl userService;
@Autowired
CityServiceImpl cityService;
@Test
public void contextLoads() {
UserEntity userEntity = new UserEntity();
userEntity.setUsername("JPA-Lensen");
userEntity.setPwd("123456");
userEntity.setMobile("137****8661");
CityEntity cityEntity = new CityEntity();
cityEntity.setUserId(1024L);
cityEntity.setDescription("JPA-Lensen-Desc");
MybatisUserEntity mybatisUserEntity = new MybatisUserEntity();
mybatisUserEntity.setUsername("Mybatis-Lensen");
mybatisUserEntity.setPwd("654321");
mybatisUserEntity.setMobile("137****1024");
MybatisCityEntity mybatisCityEntity = new MybatisCityEntity();
mybatisCityEntity.setDesc("MyBatis-Lensen-Desc");
mybatisCityEntity.setUserId(2048L);
mybatisCityEntity.setId(10L);
userService.saveUserByJpa(userEntity);
cityService.saveCityByJpa(cityEntity);
userService.saveUserByMybatis(mybatisUserEntity);
cityService.saveCityByMybatis(mybatisCityEntity);
}
}
截图看看效果
看看数据库的数据
tb_user表
tb_city表
最后: 此项目代码可在我的github.com中找到。
我的个人公众号:developlee的潇洒人生。
关注了也不一定更新,更新就不得了了。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
SSM+maven实现答题管理系统(二)
好的,现在我们来实现删除模板(model表删除记录)的功能,删除功能不难做,主要我们这次实现的是批量删除功能。 一.思路整理 首先我们删除模板是根据模板的id来删除的,不管是单项删除还是批量删除,我们这里使用layui获取当前行的功能就能获取模板的id 其次不管单项删除还是批量删除,只要将id放入数组中,后端对数组进行遍历,就能达到单项删除/批量删除 二.代码实现 思路实现以后,我们上代码。 View层: var id_array = []; //获取选中行 // 获取选中行 这里我们可以选择删除 这里的id_array是一个隐藏的值 device对应device_id user对应code survry对应model_id table.on('checkbox(test)', function(obj) { //监听复选框 if (obj.type == 'all') { if (obj.checked == true) { var data = table.cache.dataCheck; //批量操作的表格复选框 id_array = []; for (var l = 0; l ...
-
下一篇
Kaggle 机器学习
Kaggle 入门 2016 年 7 月 21 日, 数据科学家 Abhishek Thakur 在 Linkedin 发表了一篇文章 Approaching (Almost) Any Machine Learning Problem. 该篇文章介绍他建立的一个自动的机器学习框架, 几乎可以解决任何机器学习问题, 项目很快也会发布出来. 这篇文章迅速火遍 Kaggle,他参加过 100 多个数据科学相关的竞赛, 积累了很多宝贵的经验. 以下是对其文章的简要翻译, 并且加入了一些个人理解。 ------------------- 在应用机器学习模型之前,必须将数据转换为表格形式。整个过程是最耗时且最困难的过程,如下图所示。 然后将机器学习模型应用于表格数据。表格数据是在机器学习或数据挖掘中表示数据的最常用方式。我们有一个数据表,包含不同数据样本的行或 $X$ 和标签 $y$。标签可以是单列或多列,具体取决于问题的类型。我们将用 $X$ 表示数据,用 $y$ 表示标签。 标签类型 标签定义问题,可以是不同类型,例如: 单列,binary values(分类问题,一个样本只属于一个类,只有两...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8编译安装MySQL8.0.19
- Docker容器配置,解决镜像无法拉取问题
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境