springboot整合mybatis(多数据源、mysql/Oracle数据库版)

这边文章的多数据源写法参照了
http://www.ityouknow.com/springboot/2016/11/25/spring-boot-multi-mybatis.html

1、pom.xml配置

<!-- mybatis -->
<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>1.3.3</version>
</dependency>
<!-- mysql -->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<scope>runtime</scope>
</dependency>

问题1:
由于maven仓库目前并不支持Oracle驱动的下载,所以需要手动下载对应jar包
(存在问题:外部引入的jar包在将工程导出成jar或war时不能将对应jar正确输出,导致程序运行时提示缺少对应依赖)
有两类解决方案:一个是在pom.xml里面配置对应maven配置,再将jar包放置到对应路径;另一种解决方案是配置spring-boot-maven-plugin或者设置maven-war-plugins插件,由于我这边是将springboot工程输出成war包,所以采用设置maven-war-plugins插件
Oracle的Jar放置目录:
在这里插入图片描述
pom.xml添加的配置如下:

<plugins>
 <!-- 引入外部jar包-->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
            <webResources>
                <resource>
                	<!-- 工程外部jar存放目录,根据实际目录 -->
                    <directory>lib</directory>
                    <!-- 输出到war包的jar目录 -->
                    <targetPath>WEB-INF/lib/</targetPath>
                    <includes>
                        <include>**/*.jar</include>
                    </includes>
                </resource>
            </webResources>
        </configuration>
    </plugin>
</plugins>

问题2:
启动项目后报错Method oracle/jdbc/driver/T4CPreparedStatement.isClosed()Z is abstract,这个异常的原因是ojdbc驱动版本不对,需要下载对应版本的Oracle驱动springboot1.5.19对应ojdbc6-11.2.0.2.0.jar

2、application.properties配置

######  mybatis config start ######
mybatis.config-locations=classpath:mybatis/mybatis-config.xml
######  mybatis config end ######

######  db config start ######
spring.datasource.my.driverClassName = com.mysql.jdbc.Driver
spring.datasource.my.url = jdbc:mysql://localhost:3306/test3?useUnicode=true&characterEncoding=utf-8
spring.datasource.my.username = root
spring.datasource.my.password = root
spring.datasource.my.initialSize = 1
spring.datasource.my.minIdle = 1
spring.datasource.my.maxActive = 50

#spring.datasource.crm.driverClassName=oracle.jdbc.OracleDriver
#spring.datasource.crm.url=jdbc:oracle:thin:@192.168.0.93:1521:ZGCRM
#spring.datasource.crm.username=CRM
#spring.datasource.crm.password=CRM_ABS
#spring.datasource.crm.initialSize = 1
#spring.datasource.crm.minIdle = 1
#spring.datasource.crm.maxActive = 50

spring.datasource.crm.driverClassName=oracle.jdbc.OracleDriver
spring.datasource.crm.url=jdbc:oracle:thin:@10.224.201.236:1521:orcl
spring.datasource.crm.username=CRM
spring.datasource.crm.password=CRM_ABS
spring.datasource.crm.initialSize = 1
spring.datasource.crm.minIdle = 1
spring.datasource.crm.maxActive = 50
######  db config end ######

mybatis-config.xml
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- alias为别名,type为具体实体类 -->
	<typeAliases>
		<typeAlias alias="Integer" type="java.lang.Integer" />
		<typeAlias alias="Long" type="java.lang.Long" />
		<typeAlias alias="HashMap" type="java.util.HashMap" />
		<typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap" />
		<typeAlias alias="ArrayList" type="java.util.ArrayList" />
		<typeAlias alias="LinkedList" type="java.util.LinkedList" />
	</typeAliases>
</configuration>

3、数据源配置

在这里插入图片描述
数据源1:

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.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
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;

/**
 * Created by xlj on 2019/03/12.
 */
@Configuration
/*basePackages:dao所在包-固定格式修改crm名称即可,sqlSessionTemplateRef:表示dao使用的SqlSessionTemplate-固定格式修改crm名称即可*/
@MapperScan(basePackages = "com.apexsoft.timer.dao.mapper.crm", sqlSessionTemplateRef  = "crmSqlSessionTemplate")
public class CrmDataSourceConfig {

	//数据源格式spring.datasource.数据源
	//注意sqlmap.xml文件要放置在com/apexsoft/timer/dao/数据源/*_sqlmap.xml的路径下
	//private final String DataSource = "crm";
	
    @Bean(name = "crmDataSource")//定义bean名称
    @ConfigurationProperties(prefix = "spring.datasource.crm")//绑定application属性-与数据源名称对应
    @Primary//自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
    public DataSource DataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "crmSqlSessionFactory")
    @Primary
    public SqlSessionFactory SqlSessionFactory(@Qualifier("crmDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        //bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/sqlmap/crm/*/*_sqlmap.xml"));
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/apexsoft/timer/dao/mapper/crm/*/*_sqlmap.xml"));
        return bean.getObject();
    }

    //创建事务
    @Bean(name = "crmTransactionManager")
    @Primary
    public DataSourceTransactionManager TransactionManager(@Qualifier("crmDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    //用于注入dao
    @Bean(name = "crmSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate SqlSessionTemplate(@Qualifier("crmSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

数据源2:
写法与数据源1相同,但是不要加@Primary,主库只能有一个,不然会报异常

关键点:
1、
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(“classpath:com/apexsoft/timer/dao/mapper/”+DataSource+"//_sqlmap.xml"));
指定xml扫描的位置,但是由于springboot的classpath默认只读取resource目录,为了让代码结构更为清晰让其直接放置于dao同级目录,添加如下pom.xml配置(让classparh也能获取到java目录文件):

<build>
  	<!--resources配置解决mybatis 的mapperXml配置在java路径不被扫描的问题 -->
  	<resources>
     	<resource>
        	<directory>src/main/java</directory>
     	</resource>
     	<resource>
        	<directory>src/main/resources</directory>
     	</resource>
  	</resources>
	<plugins>
		……
	</plugins>
</build>

2、
@MapperScan(basePackages = “com.apexsoft.timer.dao.mapper.crm”, sqlSessionTemplateRef = “crmSqlSessionTemplate”)
指明了扫描的dao 映射,并且给 dao 层注入指定的 SqlSessionTemplate

4、dao层的mapper和xml文件

mapper文件

    public interface UserMapper {
    	List<Map<?, ?>> getAll();
}

xml 映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.apexsoft.timer.dao.mapper.my.test.UserMapper" ><!-- 指定包名映射名 -->
    <select id="getAll" resultType="hashmap" >
	SELECT T.SXBM,T.SXMC,T.QZLY FROM TJX_JBSX T
    </select>
</mapper>

5、测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class TimerApplicationTests1 {
	@Autowired
	private UserMapper userMapper;
	
	@Test
	public void contextLoads() {
	}
	
	@Test
	public void testQuery() throws Exception {
		List<Map<?, ?>> users = userMapper.getAll();
		if(users==null || users.size()==0){
			System.out.println("is null");
		}else{
			System.out.println(users.size());
		}
	}

}
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: Spring Boot是一种快速开发框架,可以快速、高效地开发和部署应用程序。而Mybatis Plus是一种基于Mybatis的扩展插件,可以简化Mybatis的开发流程,并提供更多的功能。 Spring Boot和Mybatis Plus整合起来,可以实现对两个不同的数据源(MySQLOracle)进行动态支持。具体来说,需要在Spring Boot配置文件中配置对应的数据源,并在Mybatis的配置中设置不同的数据源。 首先,需要在配置文件中定义两个数据源,如下所示: ``` spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false spring.datasource.username=root spring.datasource.password=123456 spring.datasource.secondary.url=jdbc:oracle:thin:@localhost:1521:ORCL spring.datasource.secondary.username=system spring.datasource.secondary.password=123456 ``` 这里定义了两个数据源,一个是MySQL,一个是Oracle。其中,MySQL的数据源配置了url、username和password,而Oracle的数据源配置了url、username和password。 然后,在Mybatis的配置中,需要使用动态数据源来支持两个数据源。具体来说,可以通过继承AbstractRoutingDataSource类,并重写determineCurrentLookupKey()方法,来动态切换数据源。如下所示: ``` public class DynamicDataSource extends AbstractRoutingDataSource { private static final ThreadLocal<String> dataSource = new ThreadLocal<String>(); public static void setDataSource(String dataSourceType) { dataSource.set(dataSourceType); } @Override protected Object determineCurrentLookupKey() { return dataSource.get(); } } ``` 这里定义了一个DynamicDataSource类,继承了AbstractRoutingDataSource类。通过设置ThreadLocal变量来指定要使用的数据源。当需要切换数据源时,只需调用setDataSource()方法即可。 最后,在Spring Boot启动类中,需要配置Mapper扫描器,并设置数据源路由规则。如下所示: ``` @SpringBootApplication @MapperScan(basePackages = "com.example.mapper") public class DemoApplication { @Bean public DynamicDataSource dataSource() { DynamicDataSource dynamicDataSource = new DynamicDataSource(); Map<Object,Object> targetDataSources = new HashMap<>(); targetDataSources.put("mysql", DataSourceBuilder.create().url(mysqlUrl).username(mysqlUsername).password(mysqlPassword).build()); targetDataSources.put("oracle", DataSourceBuilder.create().url(oracleUrl).username(oracleUsername).password(oraclePassword).build()); dynamicDataSource.setTargetDataSources(targetDataSources); dynamicDataSource.setDefaultTargetDataSource(targetDataSources.get("mysql")); return dynamicDataSource; } @Bean public SqlSessionFactory sqlSessionFactory(DynamicDataSource dynamicDataSource) throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dynamicDataSource); sqlSessionFactoryBean.setTypeAliasesPackage("com.example.entity"); ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:mapper/*.xml")); return sqlSessionFactoryBean.getObject(); } public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` 这里定义了一个DynamicDataSource类,并设置了mysqloracle两个数据源。在SqlSessionFactory中,使用DynamicDataSource来替换默认的数据源。同时,设置Mapper扫描器,以便自动装配Mapper接口。这样就可以在Mybatis中动态切换数据源了。 综上所述,Spring Boot和Mybatis Plus整合起来,可以实现对两个不同的数据源(MySQLOracle)进行动态支持,可以满足大多数项目的需求。 ### 回答2: Spring Boot和MyBatis Plus是两个非常常用的Java框架。它们的结合为开发者提供了强大的开发工具和框架,可以帮助他们快速地完成应用程序的开发。同时,使用Spring Boot和MyBatis Plus进行动态支持MySQLOracle数据源整合也非常容易。 首先,我们需要在pom.xml文件中引入MySQLOracle数据库驱动程序的依赖。接着,我们需要在application.properties或者application.yml文件中配置数据源的相关信息。在Spring Boot和MyBatis Plus整合中,我们可以使用一个配置类来装配相关的Bean,如数据源,MyBatis的SqlSessionFactory等。需要注意的是,我们要为每一个数据源创建一个SqlSessionFactory对象,以便MyBatis Plus区分不同的数据源。 当我们完成以上步骤后,我们就可以基于mybatis-plus的动态数据源自动切换使用MySQLOracle数据库了。具体地,我们可以使用mybatis-plus提供的AbstractRoutingDataSource和DetermineDataSourceInterceptor类来实现动态数据源的切换。AbstractRoutingDataSource是一个抽象的数据源实现类,它可以根据key值自动切换对应的数据源。而DetermineDataSourceInterceptor则是一个实现MyBatis拦截器接口的类,它可以拦截MyBatis执行SQL语句的操作,根据业务逻辑动态切换数据源。通过以上两个类的配合,我们可以实现在同一应用中动态切换MySQLOracle数据源。 总之,Spring Boot和MyBatis Plus整合可以为开发者提供了非常方便的开发工具和框架,同时也可以轻松地实现动态支持MySQLOracle数据源整合。这对我们实现业务灵活性和数据资源共享都非常重要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值