说起多数据源,一般都来解决那些问题呢,主从模式或者业务比较复杂需要连接不同的分库来支持业务。我们项目是后者的模式,网上找了很多,大都是根据jpa来做多数据源解决方案,要不就是老的spring多数据源解决方案,还有的是利用aop动态切换,感觉有点小复杂,其实我只是想找一个简单的多数据支持而已,折腾了两个小时整理出来,供大家参考。

废话不多说直接上代码吧

配置文件

pom包就不贴了比较简单该依赖的就依赖,主要是数据库这边的配置:

mybatis.config-locations=classpath:mybatis/mybatis-config.xml 
spring.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 = root 
spring.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")
    @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);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test1/*.xml")); 

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

}
}

最关键的地方就是这块了,一层一层注入,先创建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.test1

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 users
       WHERE 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 FROM
                users
       WHERE
                id =#{id}

</delete>
</mapper>

测试

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

@RestController
public
class
UserController
{
    @Autowired

private User1Mapper user1Mapper;
    @Autowired
    private 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-mybatis-mulidatasource

相关链接

  • Spring Boot系列(六):如何优雅的使用mybatis
  • Spring Boot系列(五):spring data jpa的使用
  • Spring Boot系列(四):thymeleaf使用详解
  • Spring Boot系列(三):Spring Boot中Redis的使用
  • Spring Boot系列(二):web综合开发
  • Spring Boot系列(一):Spring Boot 入门篇

    作者:纯洁的微笑 @张强 (转载已获得作者同意,如需转载请与原作者联系!) 
    出处:www.ityouknow.com

springboot+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. Spring boot(七):Spring boot+ mybatis 多数据源最简解决方案

    多数据源一般解决哪些问题?主从模式或者业务比较复杂需要连接不同的分库来支持业务. 直接上代码. 配置文件 pom包依赖,该依赖的依赖.主要是数据库这边的配置: mybatis.config-locat ...

  6. 探讨 | SpringBoot + MyBatis 多数据源事物问题

    这是小小本周的第二篇,本篇将会着重讲解关于SpringBoot + MyBatis 多数据源的事物的问题. 多数据源 此处模拟创建订单和扣减库存.先创建订单表和库存表 CREATE TABLE `t_ ...

  7. springboot+mybatis多数据源配置

    目录 1.前言 2.多数据源配置 2.1  AbstractRoutingDataSource 2.2.首先maven依赖 2.3 数据源配置 2.4 mybatis配置 2.5 设置数据源的路由ke ...

  8. SpringBoot mybatis多数据源配置,记录下我磕磕碰碰的三个月找工作经历

    */ public class DynamicDataSource extends AbstractRoutingDataSource { /** 取得当前使用哪个数据源 @return */ @Ov ...

  9. SpringBoot Mybatis多数据源配置

    参考资料: Spring Boot 2.x基础教程:MyBatis的多数据源配置 目录 一. 配置文件 二. 多数据源配置类 三. 多数据源Mybatis配置 3.1 primary数据源配置 3.2 ...

最新文章

  1. Windows 7使用wubi硬盘安装Ubuntu (文字版)
  2. Java 网关-Servlet Gateway
  3. Android中fragment之间和Activity的传值、切换
  4. c/c++编码规范(2)--作用域
  5. 写在2009年的开始
  6. oracle电梯案例,Oracle技术嘉年华的一个案例,redo的那些事,连载一
  7. 亚马逊与Visa就交易费达成协议 重新接受Visa支付
  8. 关于数据准备时,自动棌番的主键,这一字段数据的注意(IT总结之五)
  9. MongoDB数据库读书笔记
  10. 小众却非常好用的文件同步备份工具-FileYee
  11. Axure原型图教程
  12. Zynga和Unity:独家奖励广告
  13. 11.构建Ubuntu系统
  14. python re提取中文
  15. 【富集分析】GO KEGG
  16. 隐私计算之数据隐私保护
  17. 百度地图查询数据结果
  18. 教你轻松学会用PYTHON给对象画圣诞树
  19. 【青水评级】Ultrain超脑链项目分析
  20. NBA历史连胜记录和连胜记录及不可超越的记录

热门文章

  1. 机器学习大佬的进阶之路!一位北大硕士毕业梳理了完整的学习路线!
  2. 【揭秘】网易云视频点播加解密系统架构
  3. Android 网络编程系列(3)WebView 详解
  4. 四种方法使Map线程安全
  5. LYNC2013部署系列PART10:后端高可用部署
  6. 出租司机给我上的MBA课 -- [ 来自: ] [作者:cexo255]
  7. 检正email的格式
  8. 算法与数据结构 -- 二叉树(六)
  9. 【OS】课设记录总结+进程整理
  10. 前端趋势榜:上周最有意思、又实用的 10 大 Web 项目 - 210924