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>
(关于添加第三方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()); } } }
- springboot整合mybatis多数据源
- Spring Boot 整合 Mybatis 实现 Druid 多数据源详解
- spring-boot | 使员Druid 整合Mybatis 最简配置多数据源
- (十一)Spring Boot整合Mybatis使用druid实现多数据源自动切换
- Springboot整合Mybatis实现Druid多数据源
- spring Boot 整合mybatis 如何使用多数据源
- SpringBoot整合Mybatis多数据源
- Spring Boot 整合 Mybatis 实现 Druid 多数据源
- SpringBoot整合Mybatis多数据源 (AOP+注解)
- Spring Boot 整合 Mybatis 实现 Druid 多数据源详解
- spring boot整合mybatis使用c3p0数据源连接mysql
- spring boot整合mybatis使用c3p0数据源连接mysql
- Spring Boot 整合mybatis 使用多数据源的实现方法
- spring boot入门(三) springboot整合mybatis(c3p0数据源)。最完整、简单易懂、详细的spring boot教程。
- Spring Boot 整合 Mybatis 实现 Druid 多数据源详解
- springboot 2.0 整合mybatis 多数据源(完整版)
- Spring Boot 整合mybatis 如何使用多数据源
- Spring Boot 整合 Mybatis 实现 Druid 多数据源详解
- (1)、Spring Boot与Mybatis的整合(单数据源)
- (2)、Spring Boot与Mybatis的整合( 多数据源)