zoukankan      html  css  js  c++  java
  • springboot+ibatis 多数据源配置

    这个是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
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    理解SSL、HTTPS原理中的对称加密与非对称加密
    lib下的Jar包在项目打包的时候提示不能找不到
    springboot2.0 最大上传文件大小遇到的错误Failed to bind properties under 'spring.servlet.multipart.max-file-size'
    Executors创建线程池的几种方式以及使用
    JAVA深入研究——Method的Invoke方法(转)
    git merge 与 git rebase的区别
    git rebase
    git fetch , git pull
    nginx搭建(centos7)
    idea过期激活
  • 原文地址:https://www.cnblogs.com/yuhuameng/p/10703944.html
Copyright © 2011-2022 走看看