• SpringBoot实现多数据源(实战源码)


      通过一个数据库的表数据去查询同步另一个数据库,之前的方式是通过写个小工具,然后jdbc方式进行处理,这个方式也挺好用的.学习了springboot后发现可以实现多数据源操作,然后就具体实现以下.

    以下代码主要实现的功能有mysql数据的增删改查,oracle数据库的查,还有将mysql数据同步到oracle中.

    代码目录结构

    java/com.fxust
    +config
      -FirstDBConfig.java
      -SecondConfig.java
    +controller
      -NoteController.java
      -UserController.java
    +dao
      +first
        -UserMapper.java
      +second
        -NoteMapper.java
    +model
      +first
        -User.java
      +second
        -Note.java
    +service
      +impl
        -NoteServiceImpl.java
        -UserServiceImpl.java
      -NoteService.java
      -UserService.java
    -BootApplication
    resources
      -application.yml

    pom.xml文件的配置情况

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.fxust</groupId>
        <artifactId>boot</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <name>boot</name>
        <description>Demo project for Spring Boot</description>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.9.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.3.1</version>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.38</version>
            </dependency>
            <dependency>
                <groupId>com.oracle</groupId>
                <artifactId>ojdbc6</artifactId>
                <version>11.2.0.3</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper</artifactId>
                <version>4.1.0</version>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>
    View Code

    application.yml配置,springboot支持原生的yml配置

    server:
      port: 8088 //配置启动的端口
    //配置mysql数据源
    firstDataSource:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://localhost:3306/test?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&useSSL=true
      username: root
      password: root
    //配置oracle数据源
    secondDataSource:
      driver-class-name: oracle.jdbc.driver.OracleDriver
      url: jdbc:oracle:thin:@127.0.0.1:1521:orcl
      username: test
      password: test

    通过代码获取配置数据源

    package com.fxust.config;
    
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import javax.sql.DataSource;
    
    /**
     * Created by fgq on 2017/12/28.
     */
    @Configuration
    @MapperScan(basePackages = "com.fxust.dao.first",sqlSessionFactoryRef = "firstSqlSessionFactory")
    public class FirstDBConfig {
    
        @Bean(name = "firstDataSource")
        @ConfigurationProperties(prefix = "firstDataSource")
        public DataSource firstDataSource(){
            return DataSourceBuilder.create().build();
        }
    
        @Bean(name = "firstSqlSessionFactory")
        public SqlSessionFactory firstSqlSessionFactory(@Qualifier("firstDataSource") DataSource dataSource) throws Exception{
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            return bean.getObject();
        }
    }
    package com.fxust.config;
    
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Primary;
    
    import javax.sql.DataSource;
    
    /**
     * Created by fgq on 2017/12/28.
     */
    @Configuration
    @MapperScan(basePackages = "com.fxust.dao.second",sqlSessionFactoryRef = "secondSqlSessionFactory")
    public class SecondDBConfig {
    
    
        @Bean(name = "secondDataSource")
        @ConfigurationProperties(prefix = "secondDataSource")
        @Primary
        public DataSource secondDataSource(){
            return DataSourceBuilder.create().build();
        }
    
        @Bean(name = "secondSqlSessionFactory")
        @Primary
        public SqlSessionFactory secondSessionFactory(@Qualifier("secondDataSource") DataSource dataSource) throws Exception{
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            return bean.getObject();
        }
    }

    基于注解实现dao层的增删改查

    package com.fxust.dao.first;
    
    import com.fxust.model.first.User;
    import org.apache.ibatis.annotations.*;
    
    import java.util.List;
    
    /**
     * Created by fgq on 2017/12/28.
     */
    
    @Mapper
    public interface UserMapper {
    
        @Select("select * from user where id = #{id}")
        User queryById(@Param("id") int id);
    
        @Select("select * from user")
        List<User> queryAll();
    
        @Insert({"insert into user(id,name,age,hobby)values(#{id},#{name},#{age},#{hobby})"})
        int add(User user);
    
        @Update("update user set name=#{name},age=#{age},hobby=#{hobby} where id=#{id}")
        int update(User user);
    
        @Delete("delete from user where id=#{id}")
        int delete(int id);
    }
    package com.fxust.dao.second;
    
    import com.fxust.model.second.Note;
    import org.apache.ibatis.annotations.Insert;
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Select;
    
    import java.util.List;
    
    /**
     * Created by fgq on 2017/12/28.
     */
    @Mapper
    public interface NoteMapper {
    
        @Select("select human_id humanId,human_name humanName,human_age humanAge,human_hobby humanHobby,insert_time insertTime from NOTE order by insert_time desc")
        List<Note> queryAll();
    
        @Insert("insert into note(human_id,human_name,human_age,human_hobby)values(#{humanId},#{humanName},#{humanAge},#{humanHobby})")
        void insert(Note note);
    }

    model层代码

    public class User {
        private String id;
    
        private String name;
    
        private String age;
    
        private String hobby;
      //省略setter,getter方法  
    }
    public class Note {
    
        private int humanId;
    
        private String humanName;
    
        private int humanAge;
    
        private String humanHobby;
    
        private String insertTime;
     //省略setter,getter方法  
    }

    service层实现业务逻辑

    package com.fxust.service.impl;
    
    import com.fxust.dao.first.UserMapper;
    import com.fxust.dao.second.NoteMapper;
    import com.fxust.model.first.User;
    import com.fxust.model.second.Note;
    import com.fxust.service.UserSerivce;
    import com.github.pagehelper.PageHelper;
    import com.github.pagehelper.PageInfo;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    /**
     * Created by fgq on 2018/1/12.
     */
    @Service
    public class UserServiceImpl implements UserSerivce {
    
        @Autowired
        UserMapper userDao;
    
        @Autowired
        NoteMapper noteDao;
    
        public User queryById(int id){
            return userDao.queryById(id);
        }
    
        public PageInfo<User> queryAllUser(int pageNum, int pageSize){
            PageHelper.startPage(pageNum, pageSize);
            List<User> userList = userDao.queryAll();
            return new PageInfo<>(userList);
        }
    
        public String addUser(User user){
            return userDao.add(user) == 1 ? "success" : "fail";
        }
    
        public String updateUser(User user){
            return userDao.update(user) == 1 ? "success" : "fail";
        }
    
        public String deleteUser(int id){
            return userDao.delete(id) == 1 ? "success" : "fail";
        }
    
        public void synMysqlToOracle() {
            List<User> userList = userDao.queryAll();
            for (User user : userList) {
                Note note = new Note();
                String userId = user.getId();
                String userName = user.getName();
                String userAge = user.getAge();
                String userHobby = user.getHobby();
                note.setHumanId(Integer.valueOf(userId));
                note.setHumanName(userName);
                note.setHumanAge(Integer.valueOf(userAge));
                note.setHumanHobby(userHobby);
                noteDao.insert(note);
            }
        }
    }
    View Code
    package com.fxust.service.impl;
    
    import com.fxust.dao.second.NoteMapper;
    import com.fxust.model.second.Note;
    import com.fxust.service.NoteService;
    import com.github.pagehelper.PageHelper;
    import com.github.pagehelper.PageInfo;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    /**
     * Created by fgq on 2018/1/12.
     */
    @Service
    public class NoteServiceImpl implements NoteService {
    
        @Autowired
        NoteMapper noteDao;
    
        public PageInfo<Note> queryAllNote(int pageNum,int pageSize){
            PageHelper.startPage(pageNum, pageSize);
            List<Note> noteList =  noteDao.queryAll();
            return new PageInfo<>(noteList);
        }
    }
    View Code

    controller层实现接口访问控制

    package com.fxust.controller;
    
    import com.fxust.model.second.Note;
    import com.fxust.service.NoteService;
    import com.github.pagehelper.PageInfo;
    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;
    
    /**
     * Created by fgq on 2017/12/28.
     */
    @Controller
    @RequestMapping("/note")
    public class NoteController {
    
        @Autowired
        NoteService noteService;
    
        //@RequestParam(value = "pageNum",defaultValue = "1") int pageNum, @RequestParam(value = "pageSize",defaultValue = "10") int pageSize
        @RequestMapping("queryAll")
        @ResponseBody
        PageInfo<Note> queryAll(@RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
                          @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
            return noteService.queryAllNote(pageNum, pageSize);
        }
    }
    View Code
    package com.fxust.controller;
    
    import com.fxust.model.first.User;
    import com.fxust.service.UserSerivce;
    import com.github.pagehelper.PageInfo;
    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;
    
    /**
     * Created by fengguoqiang on 2017/12/28.
     *
     */
    @Controller
    @RequestMapping(value = "/user")
    public class UserController {
    
        @Autowired
        UserSerivce userSerivce;
    
        @RequestMapping(value = "/queryById")
        @ResponseBody
        User queryById(int id){
            return userSerivce.queryById(id);
        }
    
        @RequestMapping(value = "/queryAll")
        @ResponseBody
        PageInfo<User> queryAll(@RequestParam(value = "pageNum",defaultValue = "1")int pageNum,
                                @RequestParam(value = "pageSize",defaultValue = "10")int pageSize){
            return userSerivce.queryAllUser(pageNum, pageSize);
        }
    
        @RequestMapping(value = "/add")
        @ResponseBody
        String addUser(User user){
           return userSerivce.addUser(user);
        }
    
        @RequestMapping(value = "/update")
        @ResponseBody
        String updateUser(User user){
            return userSerivce.updateUser(user);
        }
    
        @RequestMapping(value = "/delete")
        @ResponseBody
        String delete(int id){
            return userSerivce.deleteUser(id);
        }
    
        @RequestMapping(value = "/syn")
        @ResponseBody
        void synData(){
            userSerivce.synMysqlToOracle();//应该在系统启动后异步执行
        }
    
    }
    View Code

    调用接口如下

    /user/add?name=biadu&age=12&hobby=web

    /user/update?name=yahu&age=33&hobby=web&id=2

    /user/queryById?id=2

    /user/delete?id=1

    /user/queryAll

    /note/queryAll

  • 相关阅读:
    element多选下拉框的坑
    滚动条样式全局修改
    element表格自带排序的坑
    c++学习
    HTTP与TCP的区别和联系
    JSP整理
    学习目标
    mysql操作
    JAVA Date、String、Calendar类型之间的转化
    后台数据类型接收问题总结
  • 原文地址:https://www.cnblogs.com/fxust/p/8277529.html
Copyright © 2020-2023  润新知