【前言】

最近接到一个新需求,经过分析后做了相应的设计;其中需要在一个项目中操做不同的数据源;于是进行了相关验证;在此记录一下验证过程。

【实战多数据源】

一、Pom中引入相应的Jar包

mysql       mysql-connector-java       5.1.39org.mybatis.spring.boot       mybatis-spring-boot-starter       1.3.2

二、主要代码展示

1、application.properties增加数据库连接的相关配置

#****************************用户数据库***************************user.datasource.url=jdbc:mysql://127.0.0.1:3306/zh_user?useUnicode=true&zeroDateTimeBehavior=convertToNull&characterEncoding=UTF-8user.datasource.username=rootuser.datasource.password=rootuser.datasource.connectionTimeout=30000user.datasource.idleTimeout=600000user.datasource.maxLifetime=1800000user.datasource.maximumPoolSize=10user.datasource.minimumIdle=5#****************************订单数据库***************************order.datasource.url=jdbc:mysql://127.0.0.1:3306/zh_order?useUnicode=true&zeroDateTimeBehavior=convertToNull&characterEncoding=UTF-8order.datasource.username=rootorder.datasource.password=rootorder.datasource.connectionTimeout=30000order.datasource.idleTimeout=600000order.datasource.maxLifetime=1800000order.datasource.maximumPoolSize=10order.datasource.minimumIdle=5

2、启动类中排除DataSourceAutoConfiguration和MybatisAutoConfiguration

package com.zhanghan.zhboot;import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;@SpringBootApplication(exclude = {        DataSourceAutoConfiguration.class,        MybatisAutoConfiguration.class})public class ZhBootApplication {    public static void main(String[] args) {        SpringApplication.run(ZhBootApplication.class, args);    }}

3、数据库属性读取类(以UserDataSourceProperties为例)

package com.zhanghan.zhboot.properties;import lombok.Data;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component;@Component@Data@ConfigurationProperties(prefix = "user.datasource")public class UserDataSourceProperties {    private String url;    private String username;    private String password;    private Integer connectionTimeout;    private Integer idleTimeout;    private Integer maxLifetime;    private Integer maximumPoolSize;    private Integer minimumIdle;}

4、数据源配置器(以UserDataSourceConfig为例)---注:数据库连接池用的是springboot2.0后默认的hikariCP(性能高)

package com.zhanghan.zhboot.config;import com.zaxxer.hikari.HikariConfig;import com.zaxxer.hikari.HikariDataSource;import com.zhanghan.zhboot.properties.UserDataSourceProperties;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionFactoryBean;import org.mybatis.spring.annotation.MapperScan;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.jdbc.datasource.DataSourceTransactionManager;import javax.sql.DataSource;@Configuration// 扫描 Mapper 接口并容器管理@MapperScan(basePackages = UserDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "userSqlSessionFactory")public class UserDataSourceConfig {    static final String PACKAGE = "com.zhanghan.zhboot.mybatis.mapper.user";    @Autowired    private UserDataSourceProperties userDataSourceProperties;    @Bean(name = "userDataSource")    public DataSource userDataSource() {        HikariConfig config = new HikariConfig();        config.setJdbcUrl(userDataSourceProperties.getUrl());        config.setUsername(userDataSourceProperties.getUsername());        config.setPassword(userDataSourceProperties.getPassword());        config.setConnectionTestQuery("select 1");        config.setConnectionTimeout(userDataSourceProperties.getConnectionTimeout());        config.setIdleTimeout(userDataSourceProperties.getIdleTimeout());        config.setMaxLifetime(userDataSourceProperties.getMaxLifetime());        config.setMaximumPoolSize(userDataSourceProperties.getMaximumPoolSize());        config.setMinimumIdle(userDataSourceProperties.getMinimumIdle());        return new HikariDataSource(config);    }    @Bean(name = "userTransactionManager")    public DataSourceTransactionManager userTransactionManager() {        return new DataSourceTransactionManager(userDataSource());    }    @Bean(name = "userSqlSessionFactory")    public SqlSessionFactory userSqlSessionFactory(            @Qualifier("userDataSource") DataSource userDataSource)            throws Exception {        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();        sessionFactory.setDataSource(userDataSource);        return sessionFactory.getObject();    }}

5、相应的mapper文件

package com.zhanghan.zhboot.mybatis.mapper.user;import com.zhanghan.zhboot.mybatis.entity.UserInfoEntity;import org.apache.ibatis.annotations.Mapper;import org.apache.ibatis.annotations.Result;import org.apache.ibatis.annotations.Results;import org.apache.ibatis.annotations.Select;import org.apache.ibatis.type.JdbcType;@Mapperpublic interface UserInfoMapper {    @Select({            "select",            "id, no, mobile, name, sex, create_time, update_time, param1, param2, param3, ",            "param4, param5, param6",            "from user_info",            "where mobile = #{mobile,jdbcType=VARCHAR}",            "limit 1"    })    @Results({            @Result(column="id", property="id", jdbcType= JdbcType.BIGINT, id=true),            @Result(column="no", property="no", jdbcType=JdbcType.VARCHAR),            @Result(column="mobile", property="mobile", jdbcType=JdbcType.VARCHAR),            @Result(column="name", property="name", jdbcType=JdbcType.VARCHAR),            @Result(column="sex", property="sex", jdbcType=JdbcType.INTEGER),            @Result(column="create_time", property="createTime", jdbcType=JdbcType.TIMESTAMP),            @Result(column="update_time", property="updateTime", jdbcType=JdbcType.TIMESTAMP),            @Result(column="param1", property="param1", jdbcType=JdbcType.INTEGER),            @Result(column="param2", property="param2", jdbcType=JdbcType.INTEGER),            @Result(column="param3", property="param3", jdbcType=JdbcType.INTEGER),            @Result(column="param4", property="param4", jdbcType=JdbcType.VARCHAR),            @Result(column="param5", property="param5", jdbcType=JdbcType.VARCHAR),            @Result(column="param6", property="param6", jdbcType=JdbcType.VARCHAR)    })    UserInfoEntity findByMobile(String mobile);}

6、相应的Service

package com.zhanghan.zhboot.service.impl;import com.zhanghan.zhboot.controller.request.OrderRequest;import com.zhanghan.zhboot.mybatis.entity.OrderInfoEntity;import com.zhanghan.zhboot.mybatis.entity.UserInfoEntity;import com.zhanghan.zhboot.mybatis.mapper.order.OrderInfoMapper;import com.zhanghan.zhboot.mybatis.mapper.user.UserInfoMapper;import com.zhanghan.zhboot.service.OrderService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.util.ObjectUtils;@Servicepublic class OrderServiceImpl implements OrderService {    @Autowired    private UserInfoMapper userInfoMapper;    @Autowired    private OrderInfoMapper orderInfoMapper;    @Override    public Object findOrder(OrderRequest orderRequest) {        UserInfoEntity userInfoEntity = userInfoMapper.findByMobile(orderRequest.getMobile());        if (ObjectUtils.isEmpty(userInfoEntity)) {            return null;        }        OrderInfoEntity orderInfoEntity = orderInfoMapper.findByUserNo(userInfoEntity.getNo());        return orderInfoEntity;    }}

7、相应的Controller

package com.zhanghan.zhboot.controller;import com.zhanghan.zhboot.controller.request.OrderRequest;import com.zhanghan.zhboot.service.OrderService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class OrderController {    @Autowired    private OrderService orderService;    @RequestMapping(value = "/get/order/borrow", method = RequestMethod.POST)    public Object getOrderBorrow(@RequestBody OrderRequest orderRequest) {        return orderService.findOrder(orderRequest);    }}

三、效果图

ad3e834fd407436ce4526f7d21103b17.png

五、项目地址及代码版本

1、地址:https://github.com/dangnianchuntian/springboot

2、代码版本:1.0.0-Release

【总结】

1、实践出真知;

2、技术是为业务服务;

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐