多数据源一般解决哪些问题?主从模式或者业务比较复杂需要连接不同的分库来支持业务。

直接上代码。

配置文件

pom包依赖,该依赖的依赖。主要是数据库这边的配置:

mybatis.config-locations=classpath:mybatis/mybatis-config.xmlspring.datasource.test1.driverClassName = com.mysql.jdbc.Driver
spring.datasource.test1.url = jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8
spring.datasource.test1.username = root
spring.datasource.test1.password = rootspring.datasource.test2.driverClassName = com.mysql.jdbc.Driver
spring.datasource.test2.url = jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8
spring.datasource.test2.username = root
spring.datasource.test2.password = root

一个test1和一个test2库,其中test1为主库,必须指定主库,不然会报错。

数据源配置

@Configuration
@MapperScan(basePackages = "com.neo.mapper.test1", sqlSessionTemplateRef  = "test1SqlSessionTemplate")
public class DataSource1Config {@Bean(name = "test1DataSource")@ConfigurationProperties(prefix = "spring.datasource.test1")@Primarypublic DataSource testDataSource() {return DataSourceBuilder.create().build();}@Bean(name = "test1SqlSessionFactory")@Primarypublic SqlSessionFactory testSqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test1/*.xml"));return bean.getObject();}@Bean(name = "test1TransactionManager")@Primarypublic DataSourceTransactionManager testTransactionManager(@Qualifier("test1DataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}@Bean(name = "test1SqlSessionTemplate")@Primarypublic SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {return new SqlSessionTemplate(sqlSessionFactory);}}

最关键的地方就是这一块了,一层一层注入,首先创建DataSource,然后创建SqlSessionFactory再创建事务,最后包装到SQLSessionTemplate中。其中需要指定分库的mapper文件地址。

@MapperScan(basePackages = "com.neo.mapper.test1", sqlSessionTemplateRef  = "test1SqlSessionTemplate")

这块的注解就是指明了扫描的dao层,并且给dao层注入指定的SQLSessionTemplate,所有@Bean 都需要按照命名指定正确。

dao层和xml层

dao层和xml需要按照库来区分在不同的目录,比如:test1库dao层在com.neo.mapper.test1包下,test2库在com.neo.mapper.test2下

public interface User1Mapper {List<UserEntity> getAll();UserEntity getOne(Long id);void insert(UserEntity user);void update(UserEntity user);void delete(Long id);}

xml层

<?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.neo.mapper.test1.User1Mapper" >         <!--命名空间--><resultMap id="BaseResultMap" type="com.neo.entity.UserEntity" >       <!--结果集-->        <id column="id" property="id" jdbcType="BIGINT" /><result column="userName" property="userName" jdbcType="VARCHAR" /><result column="passWord" property="passWord" jdbcType="VARCHAR" /><result column="user_sex" property="userSex" javaType="com.neo.enums.UserSexEnum"/><result column="nick_name" property="nickName" jdbcType="VARCHAR" /></resultMap><sql id="Base_Column_List" >id, userName, passWord, user_sex, nick_name</sql><select id="getAll" resultMap="BaseResultMap"  >SELECT <include refid="Base_Column_List" />FROM users</select><select id="getOne" parameterType="java.lang.Long" resultMap="BaseResultMap" >SELECT <include refid="Base_Column_List" />FROM usersWHERE id = #{id}</select><insert id="insert" parameterType="com.neo.entity.UserEntity" >INSERT INTO users(userName,passWord,user_sex) VALUES(#{userName}, #{passWord}, #{userSex})</insert><update id="update" parameterType="com.neo.entity.UserEntity" >UPDATE users SET <if test="userName != null">userName = #{userName},</if><if test="passWord != null">passWord = #{passWord},</if>nick_name = #{nickName}WHERE id = #{id}</update><delete id="delete" parameterType="java.lang.Long" >DELETE FROMusers WHERE id =#{id}</delete></mapper>

测试

测试可以使用SpringBootTest,也可以放到Controller中,这里只贴Controller层的使用。

@RestController
public class UserController {@Autowiredprivate User1Mapper user1Mapper;@Autowiredprivate User2Mapper user2Mapper;@RequestMapping("/getUsers")public List<UserEntity> getUsers() {List<UserEntity> users=user1Mapper.getAll();return users;}@RequestMapping("/getUser")public UserEntity getUser(Long id) {UserEntity user=user2Mapper.getOne(id);return user;}@RequestMapping("/add")public void save(UserEntity user) {user2Mapper.insert(user);}@RequestMapping(value="update")public void update(UserEntity user) {user2Mapper.update(user);}@RequestMapping(value="/delete/{id}")public void delete(@PathVariable("id") Long id) {user1Mapper.delete(id);}
}

项目地址(码云)

Spring boot(七):Spring boot+ mybatis 多数据源最简解决方案相关推荐

  1. springboot(七):springboot+mybatis多数据源最简解决方案

    为什么80%的码农都做不了架构师?>>>    说起多数据源,一般都来解决那些问题呢,主从模式或者业务比较复杂需要连接不同的分库来支持业务.我们项目是后者的模式,网上找了很多,大都是 ...

  2. Spring Boot(七):Mybatis 多数据源最简解决方案

    Spring Boot(七):Mybatis 多数据源最简解决方案 参考文章: (1)Spring Boot(七):Mybatis 多数据源最简解决方案 (2)https://www.cnblogs. ...

  3. 关于纯洁的微笑《Spring Boot(七):Mybatis 多数据源最简解决方案》文章补充说明多数据源事务的配置

    关于Spring boot中使用Mybatis多数据源的配置,我推荐纯洁的微笑博主的<Spring Boot(七):Mybatis 多数据源最简解决方案>这篇文章,简单清晰易懂 疑问 但是 ...

  4. (转)Spring Boot(七):Mybatis 多数据源最简解决方案

    http://www.ityouknow.com/springboot/2016/11/25/spring-boot-multi-mybatis.html 说起多数据源,一般都来解决那些问题呢,主从模 ...

  5. springboot+mybatis多数据源最简解决方案

    说起多数据源,一般都来解决那些问题呢,主从模式或者业务比较复杂需要连接不同的分库来支持业务.我们项目是后者的模式,网上找了很多,大都是根据jpa来做多数据源解决方案,要不就是老的spring多数据源解 ...

  6. spring boot微服务架构mybatis多数据源切换

    1,先看个目录结构图 可以看到,我把要设置的配置文件都放在了config文件夹下面 2,Application.java是程序启动项,里面必须设置 3,application.properties是多 ...

  7. spring boot 入门_SpringBoot入门建站全系列(三十)Mybatis多数据源进行数据库操作

    SpringBoot入门建站全系列(三十)Mybatis多数据源进行数据库操作 一.概述 多数据源,就是有多个数据库的配置. 多数据源配置并不麻烦,使用起来和单数据源基本相同,但是,重要的是事务的控制 ...

  8. Spring Boot 应用系列 1 -- Spring Boot 2 整合Spring Data JPA和Druid,双数据源

    最近Team开始尝试使用Spring Boot + Spring Data JPA作为数据层的解决方案,在网上逛了几圈之后发现大家并不待见JPA,理由是(1)MyBatis简单直观够用,(2)以Hib ...

  9. 电子商务商城源码 Spring Cloud、Spring Boot、Mybatis、Redis

    1. 涉及平台 Spring Cloud.Spring Boot.Mybatis.Redis 2. 核心架构 Spring Cloud.Spring Boot.Mybatis.Redis 3. 前端框 ...

最新文章

  1. Qt Designer 编辑Tab顺序
  2. liunx 详细常用操作
  3. 台式计算机序列号在哪,台式机如何查看序列号
  4. 为什么机器学习算法要与人类水平比较
  5. 一步一步搭建客服系统 (7) 多人共享的电子白板、画板
  6. 【图像配准】基于灰度的模板匹配算法(一):MAD、SAD、SSD、MSD、NCC、SSDA、SATD算法
  7. Linux学习笔记---使用BusyBox创建根文件系统(三)
  8. 前端 - base64原理浅析
  9. 解决360N4S骁龙版在国外使用碰到的问题,附详细root教程
  10. u8服务器配置维护,u8客户端连接服务器配置
  11. 分享Word如何转PDF的方法,还不快来看看
  12. c# midi播放器_C#中的MIDI文件切片器和MIDI库
  13. 腾讯笔试题:纸牌游戏
  14. windows10 快速切换网络适配器
  15. 边缘检测论文简读、开源代码和数据集合集
  16. 下列python语句的输出结果是_下列Python语句的输出结果是 __________ 。
  17. python 添加图片_python 图片读取、添加等
  18. Leetcode学习之贪心算法
  19. Three.js 实现点击模型改变颜色
  20. AES DES比较分析

热门文章

  1. Codeforces Round #516 (Div. 2Div.1)
  2. [SDOI2019] 热闹的聚会与尴尬的聚会
  3. 洛谷P6302:回家路线(斜率优化)
  4. P4427-[BJOI2018]求和【LCA】
  5. jzoj4485-[GDOI 2016 Day1]第一题 中学生数学题【数学】
  6. 2020 ICPC亚洲区域赛(沈阳)H-The Boomsday Project(双指针+dp)
  7. Educational Codeforces Round 94 (Rated for Div. 2)
  8. [CSA35G][XSY3318]Counting Quests (DP)
  9. K8S Learning(8)—— Service
  10. SpringCloud Zuul(六)之PRE Filter