前景
吐血教训,打死我都不用 JPA 了,写一些复杂查询非常不友好,也就是因为这样,导致自己开发项目的临近结尾卡了好几天写不出来,怎么办呢?换框架来写不可能,时间不允许,于是只能把 mybatis 当作第二个数据源持久层放到我的框架中
创建一个全局配置数据源的类文件
package com.center.config.admin; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import javax.sql.DataSource; /** * 数据源的配置 * @author javashishijieshangzuihaodeyuyan */ @Configuration public class DataSourceConfig { //第一数据源 -- jpa @Bean(name = "primaryDataSource") @Qualifier("primaryDataSource") @ConfigurationProperties(prefix = "spring.primary.datasource") @Primary public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } //第二数据源 -- mybatis @Bean(name = "secondaryDataSource") @Qualifier("secondaryDataSource") @ConfigurationProperties(prefix = "spring.secondary.datasource") public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); } }
新建第一数据源的配置文件(JPA)
这个类的目的就是去读取 JPA 的那些持久层文件,
也就是我们要配置好 model
,dao
我会代码标注!
package com.center.config.admin; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties; import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings; import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.persistence.EntityManager; import javax.sql.DataSource; import java.util.Map; /** * jpa数据源一 */ @Configuration @EnableTransactionManagement @EnableJpaRepositories( entityManagerFactoryRef = "entityManagerFactoryPrimary", transactionManagerRef = "transactionManagerPrimary", basePackages = { "com.center.dao.admin" }) //设置Repository所在位置 public class PrimaryConfig { @Autowired @Qualifier("primaryDataSource") private DataSource primaryDataSource; @Primary @Bean(name = "entityManagerPrimary") public EntityManager entityManager(EntityManagerFactoryBuilder builder) { return entityManagerFactoryPrimary(builder).getObject().createEntityManager(); } @Primary @Bean(name = "entityManagerFactoryPrimary") public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(EntityManagerFactoryBuilder builder) { return builder .dataSource(primaryDataSource) .properties(getVendorProperties()) .packages( "com.center.entity.admin" ) //设置实体类所在位置 .persistenceUnit("primaryPersistenceUnit") .build(); } @Autowired private JpaProperties jpaProperties; @Autowired private HibernateProperties hibernateProperties; private Map<String, Object> getVendorProperties() { return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings()); } @Primary @Bean(name = "transactionManagerPrimary") public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject()); } }
新建第二数据源的配置文件(Mybatis)
package com.center.config.admin; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import javax.sql.DataSource; /** * mybatis */ @Configuration @MapperScan(basePackages = "com.center.mapper", sqlSessionFactoryRef = "secondarySqlSessionFactory") public class SecondaryDataConfig { @Bean(name = "secondarySqlSessionFactory") public SqlSessionFactory SecondarySqlSessionFactory(@Qualifier("secondaryDataSource") DataSource datasource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(datasource); bean.setMapperLocations( new PathMatchingResourcePatternResolver() .getResources("classpath*:/mapper/*.xml")); bean.setTypeAliasesPackage("com.center.entity.admin.mountain"); return bean.getObject(); } @Primary @Bean("SecondarySqlSessionTemplate") public SqlSessionTemplate SecondarySqlsessiontemplate( @Qualifier("secondarySqlSessionFactory") SqlSessionFactory sessionfactory) { return new SqlSessionTemplate(sessionfactory); } //用来作为数据库事务回滚的限定词 //@Transactional(rollbackFor = OAPMException.class, value = "transactionManagerSecondary") // 创建事务管理器 @Bean("secondTransactionMangerMybatis") public DataSourceTransactionManager secondTransactionManger(@Qualifier("secondaryDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } }
通过这样的配置,接下来只需要在对应路径下写不一样的持久层框架的代码即可解决,复杂查询交给 mybatis!,简单查询 JPA 来搞定!
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于