最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot集成多數據源解析

 更新時間:2017年11月11日 09:01:32   作者:不清不慎  
這篇文章主要介紹了SpringBoot集成多數據源解析,具有一定參考價值,需要的朋友可以了解下。

一,前面我們介紹了springboot的快速啟動,大家肯定對springboot也有所了解,下面我們來介紹一下springboot怎么集成多數據源。

在有的項目開發(fā)中需要在一個項目中訪問多個數據源或者兩個項目之間通信(實質上是互相訪問對方的數據庫),在這里,我們介紹一下在一個項目中如何集成多個數據源(即訪問多個不同的數據庫),因為在項目中有時會有這種需求,比如在一個大型項目開發(fā)中,一個數據庫中保存數據的索引,各種使用頻繁的數據,另一個數據庫中保存其他的數據。

1.下面我們來討論一個問題,怎么集成多數據源,就是怎么讓一個項目訪問多個數據庫?

有的人會說使用注解,沒錯,這是一種辦法,因為springboot對的最大好處就是避免了繁瑣的xml配置文件,大量的使用注解來開發(fā),方便簡潔,但是在這里如果集成多數據源使用注解的話會很麻煩,有沒有其他的辦法呢?答案是肯定的,我們可以分模板來訪問多個數據庫,也就是分包。

2.如何分包來訪問多個數據源?

在這里,我們用一個簡單的案例來說明,我們訪問新建一個spingboot項目,訪問test1,test2這兩個數據庫,首先,我們先看代碼。

首先,我們需要導入相關依賴在pom文件中,這里,因為我的項目已經提前有了父pom,所以不再考慮依賴的版本問題,怎么建立父pom可參考上一篇文章。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <parent>
  <groupId>cn.shinelon.springboot</groupId>
  <artifactId>microboot</artifactId>
  <version>0.0.1-SNAPSHOT</version>
 </parent>
 <artifactId>springboot-MultiDatasources</artifactId>
 <packaging>war</packaging>


 <!-- maven項目packaging改為war類型時,必須要加這個插件 -->
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.3</version>
        <configuration>
          <failOnMissingWebXml>false</failOnMissingWebXml>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- 測試springboot的依賴 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>

  <!-- 測試時加入這兩個依賴,當修改代碼的時候就不用每次修改后重啟服務器了 -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>springloaded</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
  </dependency>
  <!-- springboot 集成jsp必須要借助這兩個依賴 -->
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
  </dependency>
  <dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
  </dependency>
  <!-- springboot集成mybatis -->
  <dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.0</version>
  </dependency>
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
  </dependency>
 </dependencies>
</project>

在上面配置的pom文件中,有點要說明,因為要訪問數據庫,所以我整合了mybatis,還有一個是整合jsp,不過在這個項目中無關,是我之前寫代碼留下來的,可不必關心。

下面,我們還要在scr/main/sources目錄下新建一個application.properties資源文件,注意,這個文件名必須是application,這個是固定的,springboot默認訪問該文件,不要自己亂改名稱。然后在這個資源文件中配置自定義數據源。

spring.datasource.test1.driverClassName=com.mysql.jdbc.Driver
spring.datasource.test1.url=jdbc:mysql://localhost:3306/test1
spring.datasource.test1.username=root
spring.datasource.test1.password=.....

spring.datasource.test2.driverClassName=com.mysql.jdbc.Driver
spring.datasource.test2.url=jdbc:mysql://localhost:3306/test2
spring.datasource.test2.username=root
spring.datasource.test2.password=.....

配置好數據源后我們就可以開進行分模塊來訪問這兩個數據源了。首先在src/mian/java目錄下創(chuàng)建好各個包,然后開始開發(fā),新建一個datasource包來放置需要訪問的兩個數據源的代碼,然后在新建兩個模塊包test1和test2,從包名我們就可以看出來這兩個包是用來操作這兩個數據庫,在這兩個包下可以分別建立DAO層和service層的包,然后建立一個controller控制層。下面是項目的目錄樹圖。

然后我們來寫DataSource中的代碼,其實就是像我們以前在xml文件中配置的SqlSessionFactory和數據源一個原理。

import javax.sql.DataSource;
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;
@Configuration
@MapperScan(basePackages="cn.shinelon.test1",sqlSessionFactoryRef="test1SqlSessionFactory")
public class Datasource1 {
  /**
   * 配置test1數據庫
   * @return
   */
  @Bean(name="test1Datasource")
  @ConfigurationProperties(prefix="spring.datasource.test1")
  public DataSource testDatasource() {
    return DataSourceBuilder.create().build();
  }
  /**
   * 創(chuàng)建SqlSessionFactory
   * @param dataSource
   * @return
   * @throws Exception
   */
  @Bean(name="test1SqlSessionFactory")
  public SqlSessionFactory testSqlSessionFactory(@Qualifier("test1Datasource")DataSource dataSource) 
      throws Exception {
    SqlSessionFactoryBean bean=new SqlSessionFactoryBean();
    bean.setDataSource(dataSource);
    //如果還有分頁等其他事務
//   bean.setMapperLocations(new PathMatchingResourcePatternResolver().
//       getResources("classpath:mybatis/test1/*.xml"));
    return bean.getObject();
  }
  /**
   * 配置事務管理
   * @param dataSource
   * @return
   */
  @Bean(name="test1TransactionManager")
  public DataSourceTransactionManager testTransactionManager(
      @Qualifier("test1Datasource")DataSource dataSource) {
    return new DataSourceTransactionManager(dataSource);
  }
  @Bean(name="test1SqlSessionTemplate")
  public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test1SqlSessionFactory")
  SqlSessionFactory sqlSessionFactory) {
    return new SqlSessionTemplate(sqlSessionFactory);
  }
}

上面的是訪問的test1數據庫的配置,需要注意的是@ConfigurationProperties(prefix=”spring.datasource.test1”)這個配置中的屬性prefix的值必須和資源文件中的前綴是一樣的,否則是訪問不到的,還有@Primary ,如果不加這個注解,啟動將會報錯,因為服務器先要有一個默認不知道默認要先訪問的數據源是哪個,必須指明,下面是test2數據庫的配置,和上面一樣的。

import javax.sql.DataSource;

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;

@Configuration
@MapperScan(basePackages="cn.shinelon.test2",sqlSessionFactoryRef="test2SqlSessionFactory")
@Primary    //指定 默認的訪問的數據源
public class Datasource2 {
  /**
   * 配置test2數據庫
   * @return
   */
  @Bean(name="test2Datasource")
  @ConfigurationProperties(prefix="spring.datasource.test2")
  @Primary    //指定 默認的訪問的數據源
  public DataSource testDatasource() {
    return DataSourceBuilder.create().build();
  }
  /**
   * 創(chuàng)建SqlSessionFactory
   * @param dataSource
   * @return
   * @throws Exception
   */
  @Bean(name="test2SqlSessionFactory")
  @Primary    //指定 默認的訪問的數據源
  public SqlSessionFactory testSqlSessionFactory(@Qualifier("test2Datasource")DataSource dataSource) 
      throws Exception {
    SqlSessionFactoryBean bean=new SqlSessionFactoryBean();
    bean.setDataSource(dataSource);
    //如果還有分頁等其他事務
//   bean.setMapperLocations(new PathMatchingResourcePatternResolver().
//       getResources("classpath:mybatis/test2/*.xml"));
    return bean.getObject();
  }
  /**
   * 配置事務管理
   * @param dataSource
   * @return
   */
  @Bean(name="test2TransactionManager")
  @Primary    //指定 默認的訪問的數據源
  public DataSourceTransactionManager testTransactionManager(
      @Qualifier("test2Datasource")DataSource dataSource) {
    return new DataSourceTransactionManager(dataSource);
  }

  @Bean(name="test2SqlSessionTemplate")
  public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test2SqlSessionFactory")
  SqlSessionFactory sqlSessionFactory) {
    return new SqlSessionTemplate(sqlSessionFactory);
  }
}

然后我們在每一個模塊中寫DAO層和service代碼來進行操作。
DAO層代碼如下

public interface User1Dao {
  @Insert("insert into user values(null,#{username},#{age})")
  public void insert(@Param("username")String username,@Param("age")int age);
}

在這里,我們向數據庫插入一條數據。
service層代碼如下

@Service
public class User1Service {
  @Autowired
  public User1Dao user1Dao;

  public void insert(String username,int age) {
    user1Dao.insert(username, age);
  }
}

test2包下DAO層和service層的代碼都是同樣的,這里就省略了。
然后我們來開始寫controller層的代碼。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import cn.shinelon.test1.services.User1Service;
import cn.shinelon.test2.services.User2Service;

@SpringBootApplication
@ComponentScan(basePackages={"cn.shinelon.datasource","cn.shinelon.test1","cn.shinelon.test2"})
@RestController
public class UserController {
  @Autowired
  public User1Service user1Service;
  @Autowired
  public User2Service user2Service;
  @RequestMapping("/add")
  public String insert(String username,int age) {
    user1Service.insert(username, age);
    user2Service.insert(username, age);
    return "insert success";
  }

  public static void main(String[] args) {
    SpringApplication.run(UserController.class, args);
  }
}

上面代碼中 ,需要注意的是@ComponentScan(basePackages={“cn.shinelon.datasource”,”cn.shinelon.test1”,”cn.shinelon.test2”})這個注解,必須添加,這樣服務器才會掃描到這幾個包中的配置。

下面我們補全代碼,還要建立一個實體類

public class User {
  private int id;
  private String username;
  private int age;
  //省略get,set方法
  }

最后的整個項目圖如下

總結

以上就是本文關于SpringBoot集成多數據源解析的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:Maven管理SpringBoot Profile詳解springboot掃描自定義的servlet和filter代碼詳解、淺談Springboot之于Spring的優(yōu)勢等,有什么問題可以隨時留言,小編會及時回復大家的。感謝朋友們對本站的支持!

相關文章

  • 使用SpringBoot內置web服務器

    使用SpringBoot內置web服務器

    這篇文章主要介紹了使用SpringBoot內置web服務器操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 詳解servlet的url-pattern匹配規(guī)則

    詳解servlet的url-pattern匹配規(guī)則

    本篇文章主要介紹了=servlet的url-pattern匹配規(guī)則,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • SpringBoot如何優(yōu)雅的處理校驗參數的方法

    SpringBoot如何優(yōu)雅的處理校驗參數的方法

    這篇文章主要介紹了SpringBoot如何優(yōu)雅的處理校驗參數的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • Java Map.Entry的使用方法解析

    Java Map.Entry的使用方法解析

    這篇文章主要介紹了Java Map.Entry的使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • 使用sharding-jdbc實現水平分表的示例代碼

    使用sharding-jdbc實現水平分表的示例代碼

    本文主要介紹了sharding-jdbc實現水平分表,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Java訪問者模式實現優(yōu)雅的對象結構處理

    Java訪問者模式實現優(yōu)雅的對象結構處理

    Java訪問者模式是一種行為型設計模式,它通過將數據結構和數據操作分離,實現對復雜對象結構的處理。它將數據結構中的每個元素都轉換為訪問者能夠識別的形式,從而使得數據操作可以在不影響數據結構的前提下進行擴展和變化
    2023-04-04
  • java數據結構之java實現棧

    java數據結構之java實現棧

    這篇文章主要介紹了java數據結構實現棧,需要的朋友可以參考下
    2014-03-03
  • java制作仿微信視頻播放控件

    java制作仿微信視頻播放控件

    這篇文章主要介紹了java制作仿微信視頻播放控件的方法和代碼分享,控件繼承自SurfaceView,十分的實用,小伙伴們可以自由擴展。
    2015-04-04
  • Java使用ANTLR4對Lua腳本語法校驗詳解

    Java使用ANTLR4對Lua腳本語法校驗詳解

    ANTLR是一個強大的解析器生成器,用于讀取、處理、執(zhí)行或翻譯結構化文本或二進制文件,下面就跟隨小編一起看看Java如何使用ANTLR4對Lua腳本語法校驗吧
    2025-04-04
  • 詳談java編碼互轉(application/x-www-form-urlencoded)

    詳談java編碼互轉(application/x-www-form-urlencoded)

    下面小編就為大家?guī)硪黄斦刯ava編碼互轉(application/x-www-form-urlencoded)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07

最新評論

四会市| 隆安县| 商南县| 霍邱县| 商城县| 桐乡市| 开原市| 五河县| 抚州市| 德江县| 察隅县| 霍州市| 轮台县| 永登县| 鲁山县| 南和县| 西乌| 新疆| 土默特左旗| 正安县| 江陵县| 宁海县| 合作市| 陆川县| 南陵县| 若羌县| 如皋市| 奎屯市| 宜章县| 区。| 博白县| 黎川县| 抚宁县| 于田县| 凤台县| 南川市| 通海县| 大丰市| 永胜县| 芜湖县| 顺昌县|