这个是boot基本版本包,因为我用的打包方式是war所以去除掉了boot内置的tomcat,但是为了方便测试又引入了内置tomcat,只要添加<scope>provided</scope>在打包时就不会影响了。

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
<relativePath />
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 打包的时候以war包形式,这里要把springboot集成的tomcat去除 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</exclusion>
</exclusions>
</dependency>

<!--因配置外部TOMCAT 而配置 测试使用的tomcat-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet-api</artifactId>
<version>8.0.39</version>
<scope>provided</scope>
</dependency>
  <!-- 热部署 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
    <scope>true</scope>
</dependency>
 下面是引入ibatis的jar包
<dependency>
<groupId>org.apache.ibatis</groupId>
<artifactId>ibatis-sqlmap</artifactId>
<version>2.3.0</version>
</dependency>
引入成功之后,我们首先了解一下ibatis的工作原理,ibatis的工程配置文件有两种,本宝以前都是用springmvc配置的,没用过boot,但是原理都是类似的,首先是总配置文件sqmapConfig.xml,第二个是具体的sql映射文件。

首先这个文件要建立在项目工程的那个位置,我想大部分新手都是想知道的,直接上图。就放在src/main/resources根目录下。

可以看到图中有两个sqlmap-**.xml文件,其中代表两个不同数据库的ibatis的sqlmapConfig配置文件。

这个文件里面的内容给大家介绍一下,代码中的properties标签内application-dev.properties是boot提供的application.properties配置文件再进行的引用,可分为test测试环境,prod生产环境以及dev线上环境,根据自己情况切换。其中配置文件中的${spring.datasource.driver-class-name}引用的就是application-dev.properties中的spring.datasource.driver-class-name,其他属性值类推。下图是ibatis连接数据库1的sqlmapConfig配置文件。也就是上图中的sqlmap-web.xml。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<properties resource="application-dev.properties" />
<settings lazyLoadingEnabled="true" cacheModelsEnabled="true"
enhancementEnabled="false" useStatementNamespaces="true" />

<!-- 连接数据源 -->
<transactionManager type="JDBC">
<dataSource type ="SIMPLE" >
<property name ="JDBC.Driver" value ="${spring.datasource.driver-class-name}" />
<property name ="JDBC.ConnectionURL" value ="${spring.datasource.url}" />
<property name ="JDBC.Username" value ="${spring.datasource.username}" />
<property name ="JDBC.Password" value ="${spring.datasource.password}" />
<property name ="Pool.MaximumActiveConnections" value ="10" />
<property name ="Pool.MaximumIdleConnections" value ="5" /> <!-- 连接池允许挂起的最大连接 -->
<property name ="Pool.MaximumCheckoutTime" value ="120000" /> <!-- 连接被某个任务所允许占用的最大时间 -->
<property name ="TimeToWait" value ="500" /> <!-- 线程允许等待的最大时间 -->
</dataSource>
</transactionManager>
<sqlMap resource="com/*/web/order/dao/*.xml" /><!-- 自己的映射文件路径 -->

</sqlMapConfig>

这是application.properties和application-dev.properties的具体配置
#spring.profiles.active=test
spring.profiles.active=dev
server.port=8081
server.session.timeout=1800
server.tomcat.uri-encoding=UTF-8
server.context-path=/order_sht
spring.http.encoding.charset=UTF-8
spring.http.encoding.force=true
spring.http.encoding.enabled=true
#数据库1
spring.datasource.url=jdbc:mysql://localhost:3306/数据库实例名称?useUnicode=true&characterEncoding=utf-8 #主数据库的连接
spring.datasource.username=root
spring.datasource.password=toot
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

#数据库2
spring.center.url=jdbc:oracle:thin:@192.168.0.222:1521:orcl
spring.center.username=root
spring.center.password=root
spring.center.driver-class-name=oracle.jdbc.driver.OracleDrivers
数据库2 对应的sqlmap-center.xml代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<properties resource="application-dev.properties" />
<settings lazyLoadingEnabled="true" cacheModelsEnabled="true"
enhancementEnabled="false" useStatementNamespaces="true" />

<transactionManager type="JDBC">
<dataSource type ="SIMPLE" >
<property name ="JDBC.Driver" value ="${spring.center.driver-class-name}" />
<property name ="JDBC.ConnectionURL" value ="${spring.center.url}" />
<property name ="JDBC.Username" value ="${spring.center.username}" />
<property name ="JDBC.Password" value ="${spring.center.password}" />
<property name ="Pool.MaximumActiveConnections" value ="10" />
<property name ="Pool.MaximumIdleConnections" value ="5" /> <!-- 连接池允许挂起的最大连接 -->
<property name ="Pool.MaximumCheckoutTime" value ="120000" /> <!-- 连接被某个任务所允许占用的最大时间 -->
<property name ="TimeToWait" value ="500" /> <!-- 线程允许等待的最大时间 -->
</dataSource>
</transactionManager>
<sqlMap resource="com/web/order/dao/*.xml" /></sqlMapConfig><!-- 自己的映射文件路径 -->
配置好这些文件之后就能使用ibatis连接上不同数据库了,可是boot怎么获取到sqlmapclient呢?重点来了,敲黑板!

要是在springmvc里面要有一个配置文件,springboot推荐使用@Configuration注解,代码如下:使用Resources获取到xml,并解析。然后使用SqlMapClientBuilder的buildSqlMapClient方法就能得到对应的SqlMapClient。

import java.io.Reader;

import org.springframework.context.annotation.Configuration;

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
/**
* ibatis多数据源配置 获取sqlmapclient
* @author crq
*
*/
@Configuration
public class BaseDao extends SqlMapClientBuilder{

private static final SqlMapClient sqlMap;
private static final SqlMapClient sqlMapCenter;
//在静态区块中初试化返回

static {

try {

//声明配置文件的名称(映射文件被定义在其中)

String resource = "sqlmap-web.xml";
String resource_center = "sqlmap-center.xml";
int a = 0 ;
//利用工具类Resources来读取到配置文件

Reader reader = Resources.getResourceAsReader(resource);
Reader reader_center = Resources.getResourceAsReader(resource_center);
/** // 第3步、进行读操作
char c[] = new char[1024] ; // 所有的内容都读到此数组之中
int temp = 0 ; // 接收每一个内容
int len = 0 ; // 读取内容
while((temp=reader.read())!=-1){
// 如果不是-1就表示还有内容,可以继续读取
c[len] = (char)temp ;
len++ ;
}
// 第4步、关闭输出流
reader.close() ; // 关闭输出流
// 把字符数组变为字符串输出
System.out.println("内容为:" + new String(c,0,len)) ; */
//创建SqlMapClient接口的变量实例

sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
sqlMapCenter = SqlMapClientBuilder.buildSqlMapClient(reader_center);

} catch (Exception e) {

e.printStackTrace();

throw new RuntimeException(

"加载sqlmap-*文件出错(load sqlmap-* file wrong). Cause: " + e);

}

}

public static SqlMapClient getSqlMapInstance() {

//提供静态方法返回静态区块中得到的SqlMapClient

return sqlMap;
// return null;

}
public static SqlMapClient getSqlMapCenterInstance() {

//提供静态方法返回静态区块中得到的SqlMapClient
return sqlMapCenter;
// return null;

}
}

接下来就要用这个sqlmapclient了,怎么用?老鸟们肯定知道getSqlMapInstance()这个方法不就是获取数据库1的sqlmapClient嘛!对了就是这个方法,只要在dao层继承这个baseDao,就能使用了。代码如下:

import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Repository;

import com.web.comm.dao.BaseDao;

@Repository
public class OrderDao extends BaseDao{

public List<Map> getOrderList() throws SQLException {
return getSqlMapInstance().queryForList("order.getOrderList");
}
public List<Map> getOrderListFromCenter() throws SQLException {
return getSqlMapCenterInstance().queryForList("order.getOrderListFromCenter");
}

}

可是在开发过程中,我发现每一个方法都throws一个SQLException,这代码看起来太丑了,我记得以前都是使用sqlMapTemplate这个对象来进行操作的,我翻阅文档发现这个SqlMapTemplate是对sqlmapClient的包装,反正更高级,也不用抛异常,我就用呗,咋用啊,我先看需要引入什么jar包,源码中地址是这个org.springframework.orm.ibatis.SqlMapClientTemplate,那肯定是org.springframework.orm-3.1.2.RELEASE.jar包了,版本最好用兼容你自己代码的,只要把这个jar包放到maven就行,本地jar加入maven仓库了解一下,网上很多,我就不赘述了。加入之后发现项目开始报错,翻源码发现这个类还引用的jdbc的类,还得加jar包,jar包名字是org.springframework.jdbc-3.1.2.RELEASE.jar,加上之后就不会报错了。
import org.springframework.jdbc.CannotGetJdbcConnectionException;
import org.springframework.jdbc.JdbcUpdateAffectedIncorrectNumberOfRowsException;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;
import org.springframework.jdbc.support.JdbcAccessor;
import org.springframework.jdbc.support.SQLExceptionTranslator;
import org.springframework.util.Assert;
我又编写了一个类,BaseDaoImp 继承 BaseDao,然后注入Bean获取两个数据源对应的SqlMapClientTemplate对象。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.ibatis.SqlMapClientTemplate;
/**
* ibatis 没有封装的sqlmapclient类,本类是获取sqlmapclient的封装对象SqlMapClientTemplate
* @author gong
*
*/
@Configuration
public class BaseDaoImp extends BaseDao{

/**
* 获取数据源的sqlmapTemplate
* @return
*/
@Bean
public SqlMapClientTemplate getSqlMapTemplate(){
SqlMapClientTemplate sqlMapTemplate = new SqlMapClientTemplate();
//提供静态方法返回静态区块中得到的SqlMapClient
sqlMapTemplate.setSqlMapClient(getSqlMapInstance());

return sqlMapTemplate;
// return null;

}
/**
* 获取中心 数据源的sqlmapTemplate
* @return
*/
@Bean
public SqlMapClientTemplate getSqlMapCenterTemplate(){
SqlMapClientTemplate sqlMapTemplate = new SqlMapClientTemplate();
//提供静态方法返回静态区块中得到的SqlMapClient
sqlMapTemplate.setSqlMapClient(getSqlMapCenterInstance());

return sqlMapTemplate;
// return null;

}

}

只要业务层的dao.java继承BaseDaoImp ,即可使用getSqlMapTemplate()来操作数据库1了。
import java.sql.SQLException;
import java.util.List;

import org.springframework.stereotype.Repository;

import com.web.comm.model.UserBean;

@Repository
public class UserDao extends BaseDaoImp{

public UserBean queryUserByUsername(String username) {
return ((UserBean) getSqlMapTemplate().queryForObject(
"user.queryUserByUserName", username));
}
        //之前要抛异常的写法,代码看起来真难受
/**public UserBean queryUserById(String userId) {
UserBean u = null;
try {
u = ((UserBean) getSqlMapInstance().queryForObject(
"user.queryUserById", userId));
} catch (SQLException e) {
e.printStackTrace();
}
return u;
}*/

public List<String> queryRoleFunctionIdByRoleId(String roleId){
return getSqlMapTemplate().queryForList(
"user.queryRoleFunctionIdByRoleId", roleId);
}

}

至此就算是完整的springboot+ibatis+多数据源配置了,网上全是springboot+mybatis的教程,确实boot整合了mybatis配置起来很简单,但是很多时候开发习惯了ibatis,我找半天没找到springboot整合ibatis的教程,就自己摸索配置了,并且配置了多数据源,希望能帮到有缘人吧。要是有更简单的配置方法,欢迎讨论分享,互相学习,或者有疑问私信吧。springboot+spring security+ibatis,基本搭建完毕了,文章就不介绍spring security了,网上很多教程,按照教程来就行。
---------------------
作者:贰玖玖0zero
来源:CSDN
原文:https://blog.csdn.net/crqnyf/article/details/80691640
版权声明:本文为博主原创文章,转载请附上博文链接!

springboot+ibatis 多数据源配置的更多相关文章

  1. 基于springboot的多数据源配置

    发布时间:2018-12-11   技术:springboot1.5.1 + maven3.0.1+ mybatis-plus-boot-starter2.3.1 + dynamic-datasour ...

  2. springboot mybatis 多数据源配置

    首先导入mybatis等包,这里就不多说. 下面是配置多数据源和mybatis,每个数据源对应一套mybatis模板 数据源1: package com.aaaaaaa.config.datasour ...

  3. springboot之多数据源配置JdbcTemplate

    springboot多数据源配置,代码如下 DataSourceConfig package com.rookie.bigdata.config; import org.springframework ...

  4. SpringBoot 的多数据源配置

    最近在项目开发中,需要为一个使用 MySQL 数据库的 SpringBoot 项目,新添加一个 PLSQL 数据库数据源,那么就需要进行 SpringBoot 的多数据源开发.代码很简单,下面是实现的 ...

  5. Springboot+Druid 动态数据源配置监控

    一.引入maven依赖,使用 starter 与原生 druid 依赖配置有所不同 <dependency> <groupId>com.alibaba</groupId& ...

  6. springboot mybatis 多数据源配置支持切换以及一些坑

    一 添加每个数据源的config配置,单个直接默认,多个需要显示写出来 @Configuration @MapperScan(basePackages ="com.zhuzher.*.map ...

  7. SpringBoot:阿里数据源配置、JPA显示sql语句、格式化JPA查询的sql语句

    1 数据源和JPA配置 1.1 显示sql配置和格式化sql配置 者两个配置都是属于hibernate的配置,但是springdatajpa给我们简化了:所有hibernate的配置都在jpa下面的p ...

  8. SpringBoot项目多数据源配置

    博主总结的不错,事务也考虑到了,存一下: https://blog.csdn.net/xqnode/article/details/86498507

  9. springboot添加多数据源连接池并配置Mybatis

    springboot添加多数据源连接池并配置Mybatis 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9190226.html May 12, 2018  ...

随机推荐

  1. Intel收购半导体设计公司eASIC

    来源:本文由公众号 半导体行业观察(ID:icbank)翻译自「anandtech」,谢谢. 北京时间今天凌晨,Intel宣布收购了半导体设计公司eASIC. eASIC的商业模式介于传统Fables ...

  2. 弹筐里同一个按钮判断是从哪里点击过来的form

    点击弹框按钮 <form action="javascript:;" method="post">         <button type= ...

  3. pip使用国内源

    对于Python开发用户来讲,PIP安装软件包是家常便饭.但国外的源下载速度实在太慢,浪费时间.而且经常出现下载后安装出错问题.所以把PIP安装源替换成国内镜像,可以大幅提升下载速度,还可以提高安装成 ...

  4. activiti-用户与用户组

    https://my.oschina.net/acitiviti/blog/283892 activiti学习笔记3-用户与用户组 收藏 安世博 发表于 3年前 阅读 5507 收藏 10 点赞 0 ...

  5. Underscore源码阅读极简版入门

    看了网上的一些资料,发现大家都写得太复杂,让新手难以入门.于是写了这个极简版的Underscore源码阅读. 源码: https://github.com/hanzichi/underscore-an ...

  6. 推荐一个好用的E2E前端测试框架cypress

    Cypress 是一个E2E的前端自动化测试框架,同样是基于BDD的思想设计的,话不多说,上demo https://github.com/Spillage/cypress-demo PS, 还有一个 ...

  7. 网络爬虫&起点中文网完本榜500部小说

    # 网络爬虫爬取起点中文网完本榜小说500部# 四步,分步操作,不易出错# 所需要获取的数据:书名 .作者.网址.类型.主要介绍.作品信息 from urllib.request import * # ...

  8. win10下安装vs2013无法安装解决方案

    win10下安装vs2013无法安装解决方案 win+r,输入cmd进入命令行 进入界面后选择修复 进入vs_ultimate文件所在目录,输入: vs_ultimate /Uninstall    ...

  9. Saiku数据库迁移后的刷新脚本-Shell脚本读取数据库中的数据(二十三)

    Saiku数据库迁移后的刷新脚本 之前有谈过对saiku中的数据进行刷新,因为saiku默认会从缓存中查询数据,但是配置不使用缓存又会效率低下... 所以这里就需要做一个数据刷新,每次ETL之后都需要 ...

  10. vs code编写的时候自动回车的原因

    今天在书写一个空白的scss文件的时候,刚打2个字就自动回车换行了: 测试了几次,发现了规律就是输入停下来0.5秒左右就会自动换行,比如,打了2个中文,再连续打一个句子,键盘虽然在动,但是vs cod ...