springboot数据源不正确_基于SpirngBoot2.0+ 的 SpringBoot+Mybatis 多数据源配置

本帖最后由 小江哥 于 2019-4-18 14:59 编辑

一 开发前的准备1.1 环境参数开发工具:IDEA

基础工具:Maven+JDK8

所用技术:SpringBoot+Mybatis

数据库:MySQL

SpringBoot版本:2.1.0. SpringBoot2.0之后会有一些小坑,这篇文章会给你介绍到。注意版本不一致导致的一些小问题。1.2 创建工程

创建一个基本的 SpringBoot 项目,我这里就不多说这方面问题了,具体可以参考下面这篇文章:

https://blog.csdn.net/qq_34337272/article/details/79563606

本项目结构:

b5b0b1954d7b1b86a4242bbd9d0c05eb.gif

1.png (192.49 KB, 下载次数: 6)

2019-4-18 14:58 上传

基于SpirngBoot2.0+ 的 SpringBoot+Mybatis 多数据源配置项目结构1.3 创建两个数据库和 user 用户表、money工资详情表

我们一共创建的两个数据库,然后分别在这两个数据库中创建了 user 用户表、money工资详情表。

我们的用户表很简单,只有 4 个字段:用户 id、姓名、年龄、余额。如下图所示:

b5b0b1954d7b1b86a4242bbd9d0c05eb.gif

2.png (65.02 KB, 下载次数: 5)

2019-4-18 14:58 上传

用户表信息

上篇文章也提到了,我这里添加了“余额money”字段是为了给大家简单的演示一下事务管理的方式。

我们的工资详情表也很简单,也只有 4 个字段: id、基本工资、奖金和惩罚金。如下图所示:

b5b0b1954d7b1b86a4242bbd9d0c05eb.gif

3.png (68 KB, 下载次数: 7)

2019-4-18 14:58 上传

工资详情表信息

建表语句:

用户表:CREATE TABLE `user` (

`id` int(13) NOT NULL AUTO_INCREMENT COMMENT '主键',

`name` varchar(33) DEFAULT NULL COMMENT '姓名',

`age` int(3) DEFAULT NULL COMMENT '年龄',

`money` double DEFAULT NULL COMMENT '账户余额',

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8

工资详情表:CREATE TABLE `money` (

`id` int(33) NOT NULL AUTO_INCREMENT COMMENT '主键',

`basic` int(33) DEFAULT NULL COMMENT '基本工资',

`reward` int(33) DEFAULT NULL COMMENT '奖金',

`punishment` int(33) DEFAULT NULL COMMENT '惩罚金',

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

1.4 配置 pom 文件中的相关依赖

由于要整合 springboot 和 mybatis 所以加入了artifactId 为 mybatis-spring-boot-starter 的依赖,由于使用了Mysql 数据库 所以加入了artifactId 为 mysql-connector-java 的依赖。   

org.springframework.boot

spring-boot-starter-web

org.mybatis.spring.boot

mybatis-spring-boot-starter

1.3.2

mysql

mysql-connector-java

runtime

org.springframework.boot

spring-boot-starter-test

test

1.5 配置 application.properties

配置两个数据源:数据库1和数据库2!

注意事项:

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

而在2.0升级之后需要变更成:spring.datasource.jdbc-url和spring.datasource.driver-class-name!不然在连接数据库时可能会报下面的错误:### Error querying database.  Cause: java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.

另外在在2.0.2+版本后需要在datasource后面加上hikari,如果你没有加的话,同样可能会报错。server.port=8335

# 配置第一个数据源

spring.datasource.hikari.db1.jdbc-url=jdbc:mysql://127.0.0.1:3306/erp?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8

spring.datasource.hikari.db1.username=root

spring.datasource.hikari.db1.password=153963

spring.datasource.hikari.db1.driver-class-name=com.mysql.cj.jdbc.Driver

# 配置第二个数据源

spring.datasource.hikari.db2.jdbc-url=jdbc:mysql://127.0.0.1:3306/erp2?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8

spring.datasource.hikari.db2.username=root

spring.datasource.hikari.db2.password=153963

spring.datasource.hikari.db2.driver-class-name=com.mysql.cj.jdbc.Driver

1.6 创建用户类 Bean和工资详情类 Bean

User.javapublic class User{

private int id;

private String name;

private int age;

private double money;

...

此处省略getter、setter以及 toString方法

}

Money.javapublic class Money{

private int basic;

private int reward;

private int punishment;

...

此处省略getter、setter以及 toString方法

}

二 数据源配置

通过 Java 类来实现对两个数据源的配置,这一部分是最关键的部分了。

DataSource1Config.java@Configuration

@MapperScan(basePackages = "top.snailclimb.db1.dao", sqlSessionTemplateRef = "db1SqlSessionTemplate")

public class DataSource1Config{

/**

* 生成数据源.  @Primary 注解声明为默认数据源

*/

@Bean(name = "db1DataSource")

@ConfigurationProperties(prefix = "spring.datasource.hikari.db1")

@Primary

public DataSource testDataSource(){

return DataSourceBuilder.create().build();

}

/**

* 创建 SqlSessionFactory

*/

@Bean(name = "db1SqlSessionFactory")

@Primary

public SqlSessionFactory testSqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception{

SqlSessionFactoryBean bean = new SqlSessionFactoryBean();

bean.setDataSource(dataSource);

//  bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/db1/*.xml"));

return bean.getObject();

}

/**

* 配置事务管理

*/

@Bean(name = "db1TransactionManager")

@Primary

public DataSourceTransactionManager testTransactionManager(@Qualifier("db1DataSource") DataSource dataSource){

return new DataSourceTransactionManager(dataSource);

}

@Bean(name = "db1SqlSessionTemplate")

@Primary

public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception{

return new SqlSessionTemplate(sqlSessionFactory);

}

}

DataSource2Config.java@Configuration

@MapperScan(basePackages = "top.snailclimb.db2.dao", sqlSessionTemplateRef = "db2SqlSessionTemplate")

public class DataSource2Config{

@Bean(name = "db2DataSource")

@ConfigurationProperties(prefix = "spring.datasource.hikari.db2")

public DataSource testDataSource(){

return DataSourceBuilder.create().build();

}

@Bean(name = "db2SqlSessionFactory")

public SqlSessionFactory testSqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception{

SqlSessionFactoryBean bean = new SqlSessionFactoryBean();

bean.setDataSource(dataSource);

//bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/db2/*.xml"));

return bean.getObject();

}

@Bean(name = "db2TransactionManager")

public DataSourceTransactionManager testTransactionManager(@Qualifier("db2DataSource") DataSource dataSource){

return new DataSourceTransactionManager(dataSource);

}

@Bean(name = "db2SqlSessionTemplate")

public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception{

return new SqlSessionTemplate(sqlSessionFactory);

}

}

关于上面的配置类这里主要提一下下面这几点:@MapperScan 注解中我们声明了使用数据库1的dao类所在的位置,还声明了 SqlSessionTemplate 。SqlSessionTemplate是MyBatis-Spring的核心。这个类负责管理MyBatis的SqlSession,调用MyBatis的SQL方法,翻译异常。SqlSessionTemplate是线程安全的,可以被多个DAO所共享使用。

由于我使用的是全注解的方式开发,所以下面这条找并且解析 mapper.xml 配置语句被我注释掉了

bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/db2/*.xml"));

比如我们要声明使用数据1,直接在 dao 层的类上加上这样一个注释即可:@Qualifier("db1SqlSessionTemplate")

我们在数据库1配置类的每个方法前加上了 @Primary 注解来声明这个数据库时默认数据库,不然可能会报错。三 Dao 层开发和 Service 层开发

新建两个不同的包存放两个不同数据库的 dao 和 service。

b5b0b1954d7b1b86a4242bbd9d0c05eb.gif

4.png (118.57 KB, 下载次数: 12)

2019-4-18 14:58 上传

3.1 Dao 层

对于两个数据库,我们只是简单的测试一个查询这个操作。在上一篇文章

UserDao.java@Qualifier("db1SqlSessionTemplate")

public interface UserDao{

/**

* 通过名字查询用户信息

*/

@Select("SELECT * FROM user WHERE name = #{name}")

User findUserByName(String name);

}

MoneyDao.java@Qualifier("db2SqlSessionTemplate")

public interface MoneyDao{

/**

* 通过id 查看工资详情

*/

@Select("SELECT * FROM money WHERE id = #{id}")

Money findMoneyById(@Param("id") int id);

}

3.2 Service 层

Service 层很简单,没有复杂的业务逻辑。

UserService.java@Service

public class UserService{

@Autowired

private UserDao userDao;

/**

* 根据名字查找用户

*/

public User selectUserByName(String name){

return userDao.findUserByName(name);

}

}

MoneyService.java@Service

public class MoneyService{

@Autowired

private MoneyDao moneyDao;

/**

* 根据名字查找用户

*/

public Money selectMoneyById(int id){

return moneyDao.findMoneyById(id);

}

}

四 Controller层

Controller 层也非常简单。

UserController.java@RestController

@RequestMapping("/user")

public class UserController{

@Autowired

private UserService userService;

@RequestMapping("/query")

public User testQuery(){

return userService.selectUserByName("Daisy");

}

}

MoneyController.java@RestController

@RequestMapping("/money")

public class MoneyController{

@Autowired

private MoneyService moneyService;

@RequestMapping("/query")

public Money testQuery(){

return moneyService.selectMoneyById(1);

}

}

五 启动类//此注解表示SpringBoot启动类

@SpringBootApplication

public class MainApplication{

public static void main(String[] args){

SpringApplication.run(MainApplication.class, args);

}

}

这样基于SpirngBoot2.0+ 的 SpringBoot+Mybatis 多数据源配置就已经完成了, 两个数据库都可以被访问了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值