精通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整合Redis,开启缓存,提高访问速度
- CentOS关闭SELinux安全模块
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- 设置Eclipse缩进为4个空格,增强代码规范
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7安装Docker,走上虚拟化容器引擎之路