专栏首页架构师小跟班完整Demo:springboot实现多数据源配置

完整Demo:springboot实现多数据源配置

背景

公司有一套人脸识别动态布控系统,该系统有两个子系统组成,识别算法采用C++编写,后台管理系统采用Java编写,C程序提供HTTP接口供Java程序调用,两个程序都是本地化部署。现在有个问题,C程序是南理工学生写的,需求响应不及时,接口不能立马提供,所以考虑由Java程序配置多数据源直接读C程序的数据库。

整体代码结构

config:两个数据库的配置

entity:实体类

test1/test2:Dao层,操作数据库,要在config中分别配置dao层包路径:basePackages = "com.example.demo.test1"

web:测试用的,通过浏览器或postman调接口,分别往两个数据库中插数据

项目源码下载地址:点击跳转

第一步:创建项目

使用Spring官网提供的在线工具创建springboot项目,最简单的即可。

工具地址:https://start.spring.io/

第二步:引入依赖jar包

<dependencies>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-web</artifactId>

    </dependency>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-test</artifactId>

        <scope>test</scope>

    </dependency>

    <!--freemarker支持-->

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-freemarker</artifactId>

    </dependency>

    <!-- mysql驱动 -->

    <dependency>

        <groupId>mysql</groupId>

        <artifactId>mysql-connector-java</artifactId>

    </dependency>

    <!--整合mybatis-->

    <dependency>

        <groupId>org.mybatis.spring.boot</groupId>

        <artifactId>mybatis-spring-boot-starter</artifactId>

        <version>1.1.1</version>

    </dependency>

</dependencies>

第三步:添加系统配置文件application.properties

server.port=8080

server.servlet.context-path=/demo

## test1 数据源配置

spring.datasource.test1.driverClassName=com.mysql.jdbc.Driver

spring.datasource.test1.jdbc-url=jdbc:mysql://192.168.1.12:3306/test?useUnicode=true&characterEncoding=utf8

spring.datasource.test1.username=root

spring.datasource.test1.password=123456

## test2 数据源配置

spring.datasource.test2.driverClassName=com.mysql.jdbc.Driver

spring.datasource.test2.jdbc-url=jdbc:mysql://192.168.1.12:3306/test2?useUnicode=true&characterEncoding=utf8

spring.datasource.test2.username=root

spring.datasource.test2.password=123456

第四步:添加数据源配置

数据库test配置DB1Config

/**

 * @author :xy.hero@qq.com

 * @date :Created in 2019-07-26 15:44

 * @description:www.jiagou1216.com

 */

@Configuration

@MapperScan(basePackages = "com.example.demo.test1", sqlSessionFactoryRef = "test1SqlSessionFactory")

public class DB1Config {

    @Bean(name = "test1DataSource")

    @ConfigurationProperties(prefix = "spring.datasource.test1")

    @Primary

    public DataSource testDataSource() {

        return DataSourceBuilder.create().build();

    }

    @Bean(name = "test1SqlSessionFactory")

    @Primary

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

        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();

        bean.setDataSource(dataSource);

        return bean.getObject();

    }

    @Bean(name = "test1TransactionManager")

    @Primary

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

        return new DataSourceTransactionManager(dataSource);

    }

    @Bean(name = "test1SqlSessionTemplate")

    @Primary

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

        return new SqlSessionTemplate(sqlSessionFactory);

    }

}

数据库test2配置DB2Config

/**

 * @author :xy.hero@qq.com

 * @date :Created in 2019-07-26 15:50

 * @description:www.jiagou1216.com

 */

@Configuration

@MapperScan(basePackages = "com.example.demo.test2", sqlSessionFactoryRef = "test2SqlSessionFactory")

public class DB2Config {

    @Bean(name = "test2DataSource")

    @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);

        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) throws Exception {

        return new SqlSessionTemplate(sqlSessionFactory);

    }

}

第五步:其他类,数据库建表

CREATE TABLE `book` (

  `bookid` int(11) NOT NULL AUTO_INCREMENT,

  `bookname` varchar(255) DEFAULT NULL,

  `bookprice` decimal(10,2) DEFAULT NULL,

  PRIMARY KEY (`bookid`)

) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

Book

/**

 * @author :xy.hero@qq.com

 * @date :Created in 2019-07-26 15:50

 * @description:www.jiagou1216.com

 */

public class Book {

    private Integer bookid;

    private String bookname;

    private Integer bookprice;

    get/set略...

}

Book1Dao

@Service

public interface Book1Dao {

    @Select("select * from book where bookname=#{bookname}")

    public Book findByName(@Param("bookname") String bookname);

    @Insert("insert into book(bookname,bookprice) values (#{bookname},#{bookprice})")

    public int insertBook(@Param("bookname") String bookname, @Param("bookprice") Double bookprice);

    @Select("select * from book")

    public Book findBook(@Param("Book") Book book);

}

Book2Dao

@Service

public interface Book2Dao {

    @Select("select * from book where bookname=#{bookname}")

    public Book findByName(@Param("bookname") String bookname);

    @Insert("insert into book(bookname,bookprice) values (#{bookname},#{bookprice})")

    public int insertBook(@Param("bookname") String bookname, @Param("bookprice") Double bookprice);

}

BookController

/**

 * @author :xy.hero@qq.com

 * @date :Created in 2019-07-26 15:53

 * @description:www.jiagou1216.com

 */

@RestController

public class BookController {

    @Autowired

    private Book1Dao book1Dao;

    @Autowired

    private Book2Dao book2Dao;

@RequestMapping("insert1")

    public void insert1() {

        book1Dao.insertBook("金瓶梅", 99.9);

        System.out.println("success");

    }

    @RequestMapping("insert2")

    public void insert2() {

        book2Dao.insertBook("帝国时代", 22.2);

        System.out.println("success");

    }

}

第六步:启动项目测试

浏览器访问,查看库中是否已添加数据:

http://localhost:8080/demo/insert1

http://localhost:8080/demo/insert2

如果项目启动报如下错误,请在application.properties配置文件中给每个数据源url后加:&serverTimezone=GMT

即:spring.datasource.test1.jdbc-url=jdbc:mysql://192.168.1.12:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT

异常信息:

java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone.

You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

http://cdn.jiagou1216.com/20190727003228.png?imageView2/0/q/100|watermark/2/text/aHR0cHM6Ly93d3cuamlhZ291MTIxNi5jb20=/font/5a6L5L2T/fontsize/400/fill/IzAwMDAwMA==/dissolve/100/gravity/SouthEast/dx/10/dy/10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java开发环境系列:反向代理之负载均衡Nginx(未完)

    客户端首先与代理服务器创建连接,接着根据代理服务器所使用的代理协议,请求对目标服务器创建连接、或者获得目标服务器的指定资源。 Web代理(proxy)服务器是网...

    架构师小跟班
  • Java开发环境系列:全文搜索引擎elasticsearch(ik分词器)

    安装中文分词插件,在elasticsearch-6.2.2\bin目录下执行以下命令: 

    架构师小跟班
  • 灭霸脚本?我在 GitHub 上都见过哪些沙雕项目?

    发现一个有趣的现象,大家比较感兴趣的不是某个项目用的技术有多强,而是它的沙雕程度有多高 

    架构师小跟班
  • 什么是 RESTful Web服务

    总结就是: 上面的提到的特点,可以总结为“ 用明确的方法 操作 语义清晰的资源,来呈现不同的资源表现形式”。

    zhangyunfeiVir
  • SAP Spartacus CmsService.Components数据结构

    Jerry Wang
  • 一波精彩的社会工程学操作

    故事要从FireEye的报告开始:Poison Ivy – Assessing Damage and Extracting Intelligence

    安恒网络空间安全讲武堂
  • 使用Gemini构建自己的IDE

    你的项目中的领域特定语言是否需要自己的IDE?Visual Studio Shell是选择之一,但是过于庞大不易部署,而且很难使用。Tim Jones的Gemi...

    张善友
  • Jeopardize:一款针对钓鱼域名的低功耗威胁情报&响应工具

    Jeopardize工具的主要目标是以尽可能低的成本来提供针对网络钓鱼域名的基本威胁情报和响应能力,它可以检测到已注册的潜在钓鱼域名(根据排版和同音字等因素),...

    FB客服
  • 扫描器架构分析之redis+分布式+mongodb

    Redis的的是完全开源免费的,遵守BSD协议,是一个高性能的键值数据库。是当前最热门的的的NoSql数据库之一,也被人们称为数据结构服务器,,因为值(valu...

    字节脉搏实验室
  • PHP 用户请求数据获取与文件上传

    我们上篇教程提到,要获取 HTTP 请求数据,可以通过 $_GET、$_POST、$_REQUEST 等 PHP 内置的超全局变量,如果要获取 Cookie 和...

    学院君

扫码关注云+社区

领取腾讯云代金券