這個是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
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!