添加依赖
<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": "pu_jx@tj-citycard.com",
"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-url和spring.datasource.driver-class-name即可解决!