1. 程式人生 > >springboot+mybatis配置多資料來源(MySQL+SQLServer)

springboot+mybatis配置多資料來源(MySQL+SQLServer)

1.應用場景

       什麼時候才用的到配置多資料來源??當我們用不同資料庫存放不同資料的時候。這個時候我們整個工程並不是只用一個數據庫,所以,要配置多個,在具體的場景應用具體的資料來源。

2.檔案結構

3.主要思路

假設現在有兩類人,需要登入,在不同的登入頁面下,檢測不同的資料庫。一種人的資訊存放在mysql,另一種存放在sqlserver,我們現在設定兩個對映檔案,分別存放不同的SQL語句,這很好理解吧,然後在application.properties裡存放兩個資料庫的配置資訊,準備實體類entity,準備一個controller,準備兩個mapper介面,以及他們的service實現檔案。現在重點來了,我們需要什麼把他們串起來。你現在在login頁面輸入了資訊,經過ajax傳送到後臺,後臺呼叫service裡的函式,這些函式,分別呼叫介面的函式來實現登入校驗,將校驗結果返回頁面ajax,根據結果,跳轉或者怎樣。這就是我們的主要思路。但是我們想一下,誰來決定你在不同的login頁面輸入不同類人的資訊所呼叫的不同資料庫分別是哪個呢??我們將在DataConfig裡配置他。

4.pom依賴

除了預設的,再加下面幾個:

<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>sqljdbc4</artifactId>
    <version>4.0</version>
</dependency>
<dependency>
    <groupId>net.sf.json-lib</groupId>
    <artifactId>json-lib</artifactId>
    <version>2.4</version>
    <classifier>jdk15</classifier>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.22</version>
</dependency>

這裡注意,由於個人的mysql版本問題,驅動版本的選擇要十分謹慎,不然會出現很多錯誤,經過嘗試,對於我的mysql而言,5.1.22的驅動可以較好的相容。

5.application.properties

spring.datasource.test1.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.datasource.test1.jdbc-url=jdbc:sqlserver://localhost:1433;DatabaseName=ajax
spring.datasource.test1.username=sherry
spring.datasource.test1.password=xiaoai
spring.mvc.view.prefix=/views/
spring.mvc.view.suffix=.jsp
spring.datasource.test2.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.test2.jdbc-url=jdbc:mysql://127.0.0.1:3306/test
spring.datasource.test2.username=root
spring.datasource.test2.password=123456

由於兩個資料來源很多地方寫法都是一樣的,比如mapper,service,等,所以我這裡只寫一個數據源的。

6.mapper:

7.Service

8.Controller

package com.example.ajaxloginand.Controller1;


import com.example.ajaxloginand.Service.ServiceImpl.UserServiceImpl;
import com.example.ajaxloginand.Service2.ServiceImpl2.UserServiceImpl2;
import com.example.ajaxloginand.entity.user;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class loginController {
    @Autowired
    private UserServiceImpl userService;
    @RequestMapping("/login")
    @ResponseBody
    public Object login(@RequestParam String ObjectUser){
        //user 轉換成 json 物件,再轉成 java 物件
        JSONObject userObject = JSONObject.fromObject(ObjectUser);
        user userObj= (user)userObject.toBean(userObject, user.class);
        if(userService.ifhaveuser(userObj.getUsername(),userObj.getPassword()))
            return "success";
        else return "fail";
    }
    @RequestMapping("/test")
    public String test(){
        return "login";
    }
    //配置第二個資料來源
    @Autowired
    private UserServiceImpl2 userService2;
    @RequestMapping("/login2")
    @ResponseBody
    public Object login2(@RequestParam String ObjectUser){
        //user 轉換成 json 物件,再轉成 java 物件
        JSONObject userObject = JSONObject.fromObject(ObjectUser);
        user userObj= (user)userObject.toBean(userObject, user.class);
        if(userService2.ifhaveuser(userObj.getUsername(),userObj.getPassword()))
            return "success";
        else return "fail";
    }
    @RequestMapping("/test2")
    public String test2(){
        return "login2";
    }
}

9.Xml對映檔案:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.ajaxloginand.Service.Mapper1.UserMapper1">
    <select id="check" resultType="com.example.ajaxloginand.entity.user">
        select * from Users where username=#{UserName} and password=#{PassWord}
    </select>
</mapper>

10重點!!DataConfig:

package com.example.ajaxloginand.DataConfig;

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.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = {"com.example.ajaxloginand.Service2"},sqlSessionFactoryRef = "test2SqlSessionFactory")
//這裡一定要注意,這個basePackages是你的mapper介面及service所在的包名,而下面的紅線所標註的classpath是mapper.xml所在的位置,這個xml是配置檔案,處在resources裡,他的路徑也要格外區分開。
public class DataByMySQL {
    @Bean(name="test2DataSource")
    //下面的註解作用就是從application.properties中讀取以這個字串開頭的那些配置,設定為資料來源的配置
    @ConfigurationProperties(prefix ="spring.datasource.test2")
    public DataSource testDataSource(){
        return DataSourceBuilder.create().build();
    }
    @Bean(name="test2SqlSessionFactory")
    public SqlSessionFactory testSqlSessionFactory(@Qualifier("test2DataSource") DataSource dataSource)throws Exception{
        SqlSessionFactoryBean bean=new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper2/test2/*.xml"));
        return bean.getObject();
    }
    @Bean(name = "test2TransactionManager")
    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);
    }
}

到這裡就完成了,配置這個東西其實網上有很多但是,有很多細節都一筆帶過,對於初學者來說可能有些難度,在這裡我總結一下,配置這個比較坑的地方可能就是mysql驅動的版本的選擇以及mapper檔案和xml檔案存放的位置上,祝大家好運吧。