springboot+ibatis 多数据源配置

废话少说吧,直接进入主题,首先新建一个maven项目,pom.xml引入基本的jar包



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


    org.springframework.boot
    spring-boot-starter-parent
    1.5.6.RELEASE
     
 
        org.springframework.boot
          spring-boot-starter-web
    
              
                   
                        org.springframework.boot
                        spring-boot-starter-tomcat
                   
                   
                    ch.qos.logback
                   logback-classic
                
              
    
 	
 
	
            org.springframework.boot
            spring-boot-starter-tomcat
            provided
        
 
		  org.apache.tomcat
		  tomcat-servlet-api
		  8.0.39
		  provided
    
  
	
	    org.springframework.boot
	    spring-boot-devtools
	    true
	    true
	
 下面是引入ibatis的jar包
  
		    org.apache.ibatis  
		    ibatis-sqlmap  
		    2.3.0  
		 

引入成功之后,我们首先了解一下ibatis的工作原理,ibatis的工程配置文件有两种,本宝以前都是用springmvc配置的,没用过boot,但是原理都是类似的,首先是总配置文件sqmapConfig.xml,第二个是具体的sql映射文件。

首先这个文件要建立在项目工程的那个位置,我想大部分新手都是想知道的,直接上图。就放在src/main/resources根目录下。springboot+ibatis 多数据源配置_第1张图片


可以看到图中有两个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。




	
	
	
	
	
	
		  
		
		
		 
		    
		    
		   
		   
	
	
	
	

这是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代码如下:



	
	
	
	
	
		  
		
		
		 
		    
		    
		   
		   
	
	
	

配置好这些文件之后就能使用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 getOrderList() throws SQLException {
		return getSqlMapInstance().queryForList("order.getOrderList");
	}
	public List 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 queryRoleFunctionIdByRoleId(String roleId){
		return getSqlMapTemplate().queryForList(
				"user.queryRoleFunctionIdByRoleId", roleId);
	}

}

至此就算是完整的springboot+ibatis+多数据源配置了,网上全是springboot+mybatis的教程,确实boot整合了mybatis配置起来很简单,但是很多时候开发习惯了ibatis,我找半天没找到springboot整合ibatis的教程,就自己摸索配置了,并且配置了多数据源,希望能帮到有缘人吧。要是有更简单的配置方法,欢迎讨论分享,互相学习,或者有疑问私信吧。springboot+spring security+ibatis,基本搭建完毕了,文章就不介绍spring security了,网上很多教程,按照教程来就行。

你可能感兴趣的:(工作笔记)