您的位置:首页 > 数据库 > Oracle

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

2019-04-16 16:14 399 查看
版权声明:转载记得备注下出处哦^^ https://blog.csdn.net/weixin_37769855/article/details/89335792

这边文章的多数据源写法参照了
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>

(关于添加第三方jar包打包具体见:9、springboot测试打包部署)
问题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());
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: