spring boot mybatis 配置多数据源

教程分享 > Java教程 > Spring (9735) 2024-08-07 11:05:25

引言

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

配置文件

pom.xml
参考之前写的一篇spring boot mybatis 整合_spring boot与mybaties的使用

主要是数据库这边的配置:

#mybatis其他配置可选
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层的使用

@RestControllerpublic 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);
    }

}
https://www.leftso.com/article/369.html

相关文章
引言    通过之前spring boot mybatis 整合的讲解: spring boot mybaties整合  (spring boot mybaties 整合 基于Java注解方式写...
spring boot mybatis 整合使用讲解介绍,spring boot与MyBatis的使用讲解介绍。spring boot mybatis xml mapper方式的入门和通过一个简...
spring boot框架整合MyBatis数据库暂时选用MySQL
本文旨在介绍如何使用Spring Boot和Mybatis来构建应用程序。Spring Boot是一个基于Spring框架的轻量级框架,可以帮助开发者快速构建应用程序,减少编码和维护时间。Myb...
本文主要讲解spring boot框架整合MyBatis后,如何打印出MyBatis的sql语句以及参数列表
mybatis plus 逻辑删除使用说明全局逻辑值配置,application.properties# 逻辑已删除值(默认为 1) mybatis-plus.global-config.db...
本文章主要简单讲解目前流行的springMVC4+Spring4+MyBatis3(即SSM)框架整合
Spring Boot 2.0 支持的Apache Camel 版本发布了_Apache Camel 2.22发布支持Spring Boot 2.0
Spring Boot 2.0,Spring框架的Spring Boot 中的Spring Boot Actuator变化讲解。并且了解如何在Spring Boot 2.0中使用Actuator...
Spring Boot 2.0 绑定properties属性资源文件 Spring Boot 2.0 读取properties配置文件值 Spring Boot 2.0获取properties配...
spring boot入门,spring boot是一个崭新的spring框架分支项目,本文讲解其属性配置相关
spring boot 1.5整合redis实现spring的缓存框架,spring boot,redis
spring boot是一个崭新的spring框架分支项目,本文讲解基本的数据库配置
Spring Boot validation整合hibernate validator实现数据验证,Spring Boot validation使用说明,Spring Boot validat...