springboot2.0+mybatis 多数据源配置

添加依赖

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

application.propertis添加多数据库配置



spring.datasource.db1.username=root
spring.datasource.db1.password=root
spring.datasource.db1.jdbc-url=jdbc:mysql://localhost:3306/litchi?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
spring.datasource.db1.driver-class-name=com.mysql.jdbc.Driver


spring.datasource.db2.username=root
spring.datasource.db2.password=root
spring.datasource.db2.jdbc-url=jdbc:mysql://localhost:3306/qrcode_param?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
spring.datasource.db2.driver-class-name=com.mysql.jdbc.Driver

第一个数据库配置

需要注意的是

@MapperScan(basePackages = "com.litchi.springboot.datasources.db1.mapper", sqlSessionFactoryRef = "db1SqlSessionFactory")中

com.litchi.springboot.datasources.db1.mapper ,这个 是对应的mapper的路径

@ConfigurationProperties(prefix = "spring.datasource.db1") 数据库配置前缀

package com.litchi.springboot.datasources;


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.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.litchi.springboot.datasources.db1.mapper", sqlSessionFactoryRef = "db1SqlSessionFactory")
public class DataSource1Config {


    @Bean(name = "db1DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.db1")
    @Primary
    public DataSource db1DataSource() {
        return DataSourceBuilder.create ().build ();
    }

    @Bean(name = "db1SqlSessionFactory")
    @Primary
    public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean ();
        bean.setDataSource ( dataSource );
        return bean.getObject ();
    }

    @Bean(name = "db1TransactionManager")
    @Primary
    public DataSourceTransactionManager db1TransactionManager(@Qualifier("db1DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager ( dataSource );
    }

    @Bean(name = "db1SqlSessionTemplate")
    @Primary
    public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate ( sqlSessionFactory );
    }
}

第二个数据源配置

package com.litchi.springboot.datasources;


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.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.litchi.springboot.datasources.db2.mapper", sqlSessionFactoryRef = "db2SqlSessionFactory")
public class DataSource2Config {


    @Bean(name = "db2DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.db2")
    public DataSource db2DataSource() {
        return DataSourceBuilder.create ().build ();
    }

    @Bean(name = "db2SqlSessionFactory")
    public SqlSessionFactory db2SqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean ();
        bean.setDataSource ( dataSource );
        return bean.getObject ();
    }

    @Bean(name = "db2TransactionManager")
    public DataSourceTransactionManager db2TransactionManager(@Qualifier("db2DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager ( dataSource );
    }

    @Bean(name = "db2SqlSessionTemplate")
    public SqlSessionTemplate db2SqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate ( sqlSessionFactory );
    }
}

数据库1中mapper配置

package com.litchi.springboot.datasources.db1.mapper;


import com.litchi.springboot.datasources.model.TbUser;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface TbUserMapper {


    @Select ( "select * from tb_user" )
    List<TbUser> findAll();
}

数据库2中mapper配置

package com.litchi.springboot.datasources.db2.mapper;


import com.litchi.springboot.datasources.model.SysUser;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface SysUserMapper {

    @Select("select * from sys_user")
    List<SysUser> findAll();
}

下面是第1 个sevice配置

package com.litchi.springboot.datasources.db1.service.impl;

import com.litchi.springboot.datasources.db1.mapper.TbUserMapper;
import com.litchi.springboot.datasources.db1.service.TbUserService;
import com.litchi.springboot.datasources.model.TbUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class TbUserServiceImpl implements TbUserService {

    @Autowired
    private TbUserMapper tbUserMapper;

    @Override
    public List<TbUser> findAll() {
        return tbUserMapper.findAll();
    }
}

下面是第2 个sevice配置

package com.litchi.springboot.datasources.db2.service.impl;

import com.litchi.springboot.datasources.db2.mapper.SysUserMapper;
import com.litchi.springboot.datasources.db2.service.SysUserService;
import com.litchi.springboot.datasources.model.SysUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class SysUserServiceImpl implements SysUserService {


    @Autowired
    private SysUserMapper sysUserMapper;

    @Override
    public List<SysUser> findAll() {
        return sysUserMapper.findAll ();
    }
}

最后是controller测试类

package com.litchi.springboot.datasources.controller;


import com.litchi.springboot.datasources.db1.service.TbUserService;
import com.litchi.springboot.datasources.db2.service.SysUserService;
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.ResponseBody;

import java.util.HashMap;
import java.util.Map;

@Controller
public class TestController {

    @Autowired
    private SysUserService sysUserService;
    @Autowired
    private TbUserService tbUserService;


    @RequestMapping("/list")
    @ResponseBody
    public Object list() {

        Map<String, Object> map = new HashMap<> ();
        map.put ( "sysUserList", sysUserService.findAll () );
        map.put ( "tbUserList", tbUserService.findAll () );
        return map;
    }
}

实体类1

package com.litchi.springboot.datasources.model;

import java.util.Date;

public class TbUser {
    private Long id;

    private String username;

    private String password;

    private String phone;

    private String email;

    private Date created;

    private Date updated;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username == null ? null : username.trim();
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password == null ? null : password.trim();
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone == null ? null : phone.trim();
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email == null ? null : email.trim();
    }

    public Date getCreated() {
        return created;
    }

    public void setCreated(Date created) {
        this.created = created;
    }

    public Date getUpdated() {
        return updated;
    }

    public void setUpdated(Date updated) {
        this.updated = updated;
    }
}

实体类2

package com.litchi.springboot.datasources.model;

public class SysUser {
    private String userId;

    private String username;

    private String password;

    private String name;

    private String rights;

    private String roleId;

    private String lastLogin;

    private String ip;

    private String status;

    private String bz;

    private String skin;

    private String email;

    private String number;

    private String phone;

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId == null ? null : userId.trim();
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username == null ? null : username.trim();
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password == null ? null : password.trim();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name == null ? null : name.trim();
    }

    public String getRights() {
        return rights;
    }

    public void setRights(String rights) {
        this.rights = rights == null ? null : rights.trim();
    }

    public String getRoleId() {
        return roleId;
    }

    public void setRoleId(String roleId) {
        this.roleId = roleId == null ? null : roleId.trim();
    }

    public String getLastLogin() {
        return lastLogin;
    }

    public void setLastLogin(String lastLogin) {
        this.lastLogin = lastLogin == null ? null : lastLogin.trim();
    }

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip == null ? null : ip.trim();
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status == null ? null : status.trim();
    }

    public String getBz() {
        return bz;
    }

    public void setBz(String bz) {
        this.bz = bz == null ? null : bz.trim();
    }

    public String getSkin() {
        return skin;
    }

    public void setSkin(String skin) {
        this.skin = skin == null ? null : skin.trim();
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email == null ? null : email.trim();
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number == null ? null : number.trim();
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone == null ? null : phone.trim();
    }
}

浏览器测试

http://localhost:8080/list结果如下 

// 20181127231748
// http://localhost:8080/list

{
  "sysUserList": [
    {
      "userId": "5ddef1042caff1e386f7c749f9e9abae",
      "username": "admin",
      "password": "5dde57a670aaf1042caff1e386f7c749f9e9abae",
      "name": "系统管理员",
      "rights": "1133671055321055258374707980945218933803269864762743594642571294",
      "roleId": null,
      "lastLogin": null,
      "ip": "153.99.123.18",
      "status": "0",
      "bz": "最高统治者",
      "skin": "skin-3",
      "email": "[email protected]",
      "number": "001",
      "phone": "15620981495"
    },
    {
      "userId": "33453dfgdert90e8rtetj39458",
      "username": "hai_tong",
      "password": "cda739d91c4ec1da55dee772e617496878763fa9",
      "name": "海通公交",
      "rights": "",
      "roleId": null,
      "lastLogin": null,
      "ip": "58.241.229.50",
      "status": "0",
      "bz": null,
      "skin": "default",
      "email": null,
      "number": "8",
      "phone": null
    }
  ],
  "tbUserList": [
    {
      "id": 7,
      "username": "zhangsan",
      "password": "e10adc3949ba59abbe56e057f20f883e",
      "phone": "13488888888",
      "email": "aa@a",
      "created": "2015-04-06T17:03:55.000+0000",
      "updated": "2015-04-06T17:03:55.000+0000"
    },
    {
      "id": 9,
      "username": "zhangsan1",
      "password": "e10adc3949ba59abbe56e057f20f883e",
      "phone": "13333333333",
      "email": null,
      "created": "2015-04-07T10:32:08.000+0000",
      "updated": "2015-04-07T10:32:08.000+0000"
    }
  ]
}

大家可能会踩的坑

springboot 升级到2.0之后发现配置多数据源的时候报错:

“jdbcUrl is required with driverClassName.”或者Cause: java.lang.IllegalArgumentException: dataSource or dataSourceClassName or jdbcUrl is required.] with root cause

主要原因是在1.0 配置数据源的过程中主要是写成:spring.datasource.url 和spring.datasource.driverClassName。

而在2.0升级之后需要变更成:spring.datasource.jdbc-urlspring.datasource.driver-class-name即可解决!

猜你喜欢

转载自blog.csdn.net/liu_yulong/article/details/84575584