SpringBoot多数据源使用与配置

使用SpringBoot+mybatis-plus
数据库使用:mysql  sqlServer


首先在Pom.xml  添加 mybatis-plus 的jar 包:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.10</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.0.6</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>2.4.2</version>
</dependency>

再加入对sqServer数据库支持的jar包:

<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>sqljdbc4</artifactId>
    <version>4.0</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
    <version>6.2.0.jre8</version>
    <scope>runtime</scope>
</dependency>

再加入对mySql数据库支持的jar包:

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

多数据源 application-dev.properties的配置

我的主数据库是mySql 从数据库是sqlServer

spring.datasource.dynamic.primary=mysql
spring.datasource.dynamic.datasource.mysql.username=数据库名称
spring.datasource.dynamic.datasource.mysql.password=数据库密码
spring.datasource.dynamic.datasource.mysql.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.mysql.url=jdbc:mysql://127.0.0.1:3306/数据库名称
#比如oracle就需要重新设置这个 select 1 FROM DUAL
spring.datasource.dynamic.datasource.mysql.druid.validation-query=select 'x'

spring.datasource.dynamic.datasource.sqlserver.username=数据库名称
spring.datasource.dynamic.datasource.sqlserver.password=数据库密码
spring.datasource.dynamic.datasource.sqlserver.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
#10.98.247.141
spring.datasource.dynamic.datasource.sqlserver.url=jdbc:sqlserver://数据库链接:端口号;DatabaseName=数据库名称
#比如oracle就需要重新设置这个 select 1 FROM DUAL
spring.datasource.dynamic.datasource.sqlserver.druid.validation-query=select 'x'
#mybatis-plus 要启动必须配置这个(路径根据项目实际情况更改)
mybatis-plus.mapper-locations=classpath*:**/mapper/xml/*Mapper.xml

多数据源:
实体类 两个数据库 用同一个实体类(数据库名可以不同,表名类名相同)
如果在实体类中添加数据库没有的字段  字段上面要 加@TableField(exist = false) 这个注解
 

package com.cn.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;


import java.io.Serializable;
import java.util.Date;



@ApiModel(value = "叫号表")
@TableName("lcd_show")
public class LcdShow extends Model<LcdShow> implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 小屏地址
     */
    @ApiModelProperty(value = "小屏地址")
    private String xpdz;
    /**
     * 医生姓名
     */
    @ApiModelProperty(value = "医生姓名")
    private String ysxm;
    /**
     * 医生工号
     */
    @ApiModelProperty(value = "医生工号")
    private String ysgh;
    /**
     * 房间名称
     */
    @ApiModelProperty(value = "房间名称")
    private String fjmc;
    /**
     * 医生格言
     */
    @ApiModelProperty(value = "医生格言")
    private String ysgy;
    /**
     * 排队号码
     */
    @ApiModelProperty(value = "排队号码")
    private String pdhm;
    /**
     * 病人姓名
     */
    @ApiModelProperty(value = "病人姓名")
    private String brxm;

    @ApiModelProperty(value = "创建时间")
    @TableField("create_time")
    private Date createTime;

    @ApiModelProperty(value = "修改时间")
    @TableField("update_time")
    private Date updateTime;

    @ApiModelProperty(value = "状态")
    private Integer status;

    @ApiModelProperty(value = "医生状态")
    @TableField(exist = false)
    private String yszt;

    @ApiModelProperty(value = "医生职称")
    @TableField(exist = false)
    private String yszc;

    @ApiModelProperty(value = "医生头像")
    @TableField(exist = false)
    private String ystx;

    @ApiModelProperty(value = "医生简介")
    @TableField(exist = false)
    private String ysjj;

   
//省略了getset方法  构造方法.....
   

}

mapper: 两个实体类Mapper 接口在同一个Mapper中
从数据库Mapper接口 上面注解@DS("里面放的是 从数据库配置中的名字 字母大小要相同")

package com.cn.upms.mapper;

import com.cn.upms.entity.LcdShow;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @author wh
 * 
 */
public interface LcdShowMapper extends BaseMapper<LcdShow> {

    /**
     * @Description: 根据IP查询最新叫号数据
     * @param
     * @Author: wh
     * @return
     */
    LcdShow selectByXpdz(@Param("xpdz") String xpdz);

    /**
     * @Description: 查询当天叫号数据
     * @param
     * @Author: wh
     * @Date: 2019/3/28
     * @return
     */
    List<LcdShow> selectLcdShowByMysql();


    /**
     * @Description: 获取外部叫号数据
     * @param 注意这个DS
     * @Author: wh
     * @Date: 2019/3/28
     * @return
     */
    @DS("sqlserver")
    List<LcdShow> selectLcdShowBySqlServer();

    /**
     * 根据xpdz更新数据
     * @param lcdShow
     */
    void updateByXpdz(LcdShow lcdShow);
}

mapper.xml :查询 resultMap 、 更新parameterType  (resultMap 与parameterType  区别:https://blog.csdn.net/a791123503/article/details/79936433)
mysql语句 中没有top 1 只能用limit 1

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.cn.mapper.LcdShowMapper">

	<!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.cn.entity.LcdShow" >
        <result column="xpdz" property="xpdz" />
        <result column="ysxm" property="ysxm" />
        <result column="ysgh" property="ysgh" />
        <result column="fjmc" property="fjmc" />
        <result column="ysgy" property="ysgy" />
        <result column="pdhm" property="pdhm" />
        <result column="brxm" property="brxm" />
        <result column="create_time" property="createTime" />
        <result column="update_time" property="updateTime" />
        <result column="status" property="status" />
    </resultMap>

    <!--通过小屏地址查询mysql数据库-->
    <select id="selectByXpdz" resultMap="BaseResultMap">
        select xpdz,ysxm,ysgh,fjmc,ysgy,pdhm,brxm,create_time,update_time,status
        from lcd_show where xpdz=#{xpdz} LIMIT 1
    </select>

    <!--查询mysql数据库-->
    <select id="selectLcdShowByMysql" resultMap="BaseResultMap">
        SELECT xpdz,ysxm,ysgh,fjmc,ysgy,pdhm,brxm,create_time,update_time,status
         FROM lcd_show
    </select>

    <!--查询 sqlserver 数据库-->
    <select id="selectLcdShowBySqlServer" resultMap="BaseResultMap">
        SELECT xpdz,ysxm,ysgh,fjmc,ysgy, pdhm,brxm
        FROM lcd_show
    </select>

    <!--根据xpdz更新数据-->
    <select id="updateByXpdz" parameterType="com.cn.entity.LcdShow">
        UPDATE lcd_show SET
            xpdz = #{xpdz} ,ysxm = #{ysxm} , ysgh = #{ysgh} , fjmc = #{fjmc} ,
            ysgy = #{ysgy} ,pdhm = #{pdhm} , brxm = #{brxm}, 
            create_time = #{createTime},update_time = #{updateTime},status = #{status}
        WHERE
            xpdz = #{xpdz}
    </select>

</mapper>

在同一个Service 接口写 两个表的 接口

package com.cn.service;

import com.cn.entity.LcdShow;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;

/**
 *
 * @author wh
 * @date 2019-03-29 11:33:31
 */
public interface ILcdShowService extends IService<LcdShow> {

    /**
     * 查询主表
     */
    List<LcdShow> getLcdShowListByMysql();

    /**
     * 查询从表
     */
    List<LcdShow> getLcdShowListBySqlServer();

    /**
     *根据IP查询 更新叫号数据
     */
    void updateByXpdz(LcdShow lcdShow);

    /**
     * 根据IP查询 叫号数据
     */
    LcdShow getByXpdz(String xpdz);

    /**
     * 清空数据库所有数据
     */
    void clearEmpty();

   

}


在同一个ServiceImpl 实现类中 写逻辑 还有mapper接口 的调用 类上面 注解@Service

package com.cn.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.cn.common.util.DateUtil;
import com.cn.entity.LcdShow;

import com.cn.mapper.LcdShowMapper;
import com.cn.service.ILcdShowService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author wh
 * @date 2019-03-29 11:33:31
 */
@Service
public class LcdShowServiceImpl extends ServiceImpl<LcdShowMapper, LcdShow> implements ILcdShowService {

    @Override
    public List<LcdShow> getLcdShowListByMysql() {
        return this.baseMapper.selectLcdShowByMysql();
    }

    @Override
    public List<LcdShow> getLcdShowListBySqlServer() {
        return this.baseMapper.selectLcdShowBySqlServer();
    }

    @Override
    public void updateByXpdz(LcdShow lcdShow) {
        if(StringUtils.isBlank(lcdShow.getXpdz())){
            return;
        }
        this.baseMapper.updateByXpdz(lcdShow);
    }

    @Override
    public LcdShow getByXpdz(String xpdz) {
        if (StringUtils.isBlank(xpdz)) {
            return null;
        }
        return this.baseMapper.selectByXpdz(xpdz);
    }

    @Override
    public void clearEmpty() {
        this.baseMapper.delete(null);
    }

   

   
}

在同一个Controller写控制  类上注解@RestController 表明是个controller类  调用Service  其上 注解@Reference

@RestController
@RequestMapping("/lcdBigConfig")
public class LcdBigConfigController extends BaseController {
    @Reference
    private ILcdBigConfigService lcdBigConfigService;


//里面controller 正常流程写..

}


Aplication 启动类 :@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) 关闭 springboot 自动配置的数据源

package com.cn.upms;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;


/**
 * @author wh
 * @description Application
 * 
 */
@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
@EnableAspectJAutoProxy
@EnableAsync
@EnableScheduling
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)
@ComponentScan("com.cn")
public class UpmsWebApplication extends SpringBootServletInitializer {
    protected final static Logger logger = LoggerFactory.getLogger(UpmsWebApplication.class);

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        logger.info("----UpmsWebApplication 启动----");
        return application.sources(UpmsWebApplication.class);

    }

    public static void main(String[] args) {
        SpringApplication.run(UpmsWebApplication.class, args);
        logger.info("----UpmsWebApplication 启动----");
    }

}

主要就是jar包 然后就是那个Mapper 中的@DS 注解  还有就是配置文件里面的 数据源配置

中间有些东西是不必要的 我没删干净...

如果报错:驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。

解决办法为:

第一个办法:换个jDK(我一开始用的jre1.8.0_201 他报错,后来换了jdk1.8.0_121 就不报错了)

第二个办法:
jdk8 运行SQL server 数据库 需要打开 C:\Program Files\Java\jdk1.8.0_201\jre\lib\security ----->java.security文件

把 3DES_EDE_CBC 删除(复制 直接ctrl+F定位到 可以参考下面图的样子修改)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值