spring-boot mybadis多数据源配置

强烈推荐:只要一行注解,使用mybatis的多数据源,无需要任何配置。

github地址:https://gitee.com/xiaojiezhu/mybadis-starter.git


只需要一行注解,就可以配置mybadis的多数据源

这是一个基于spring boot 的mybadis的starter

支持多个数据源

使用方法很简单,先定义一些配置文件,放到application.yml中

mysql:
  server:
    saas:
      url: "jdbc:mysql://localhost:3306/saas?useUnicode=true&characterEncoding=utf8"
      username: root
      password: 123
      driverClassName: com.mysql.jdbc.Driver
      initialSize: 1  #初始化大小
      minIdle: 1  #空闲连接池的大小
      maxActive: 50 #最大激活数量
    saas2:
      url: "jdbc:mysql://localhost:3306/saas2?useUnicode=true&characterEncoding=utf8"
      username: root
      password: 123
      driverClassName: com.mysql.jdbc.Driver
      initialSize: 1  #初始化大小
      minIdle: 1  #空闲连接池的大小
      maxActive: 50 #最大激活数量

main方法

@MyBadisLoader({"saas = com.llc.admin.web.dao.saas = classpath:mapper/*xml" , 
                "saas2 = com.llc.admin.web.dao.saas2 = classpath:mapper/*.xml,classpath:mapper/user/*.xml"})
@SpringBootApplication
public class WebApplication {

    public static void main(String[] args) {
        SpringApplication.run(WebApplication.class,args);
    }
}

上面的注解中 saas是上方配置文件,数据源的名称,后面是扫描的接口包名,可以用逗号分隔传入多个,再后面是扫描xml的配置文件路径,也支持多个 注解中接收的是一个数组,所以支持多个数据源,除此不需要任何代码就可以使用


需要的包依赖 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xiaojiezhu.mybadis.starter</groupId>
<artifactId>mybadis-starter</artifactId>
<version>1.0</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>1.4.7.RELEASE</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.20</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.27</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
</dependencies>
</project>

 

详细使用看码云上代码

纯代码配置的spring boot mybadis多数据源的配置

github地址:https://gitee.com/xiaojiezhu/spring-boot-ds-mybadis

需要的包依赖 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>datasource-mybatis</groupId>
    <artifactId>ds-mybatis</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <parent>
        <groupId>com.framework.sass.service</groupId>
        <artifactId>service-root</artifactId>
        <version>1.0</version>
    </parent>

    <dependencies>
        <!-- Begin of DB related -->
        <dependency> <!-- for ChainedTransactionManager configuration -->
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-commons</artifactId>
        </dependency>
        <dependency> <!-- exclude掉缺省的jdbc配置 -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.tomcat</groupId>
                    <artifactId>tomcat-jdbc</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- 同项目的其它包...开始 -->
        <dependency>
            <groupId>com.framework.recWeiMsg</groupId>
            <artifactId>msg-message</artifactId>
            <version>1.0</version>
        </dependency>
<!--        <dependency>
            <groupId>com.framework.recWeiMsg</groupId>
            <artifactId>msg-commons</artifactId>
            <version>1.0</version>
        </dependency>-->
<!--        <dependency>
            <groupId>com.framework.recWeiMsg</groupId>
            <artifactId>msg-weichat</artifactId>
            <version>1.0</version>
        </dependency>-->
        <!-- 同项目的其它包...结束 -->

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.0</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.0</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.3</version>
        </dependency>


        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency> <!-- mybatis 分页插件 -->
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>4.1.6</version>
        </dependency>

    </dependencies>


</project>

目录:resources/ mapper中xml文件 a.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.zxj.ds.mybatis.dao.saas2.DbSaas2Dao">

    <select id="getOilOrder" resultType="com.framework.msg.db.businessTransaction.OrderRecord">
        select * from orderRecord
    </select>
</mapper>

启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 1:去掉配置中的basePackage路径 测试无法去掉,或者说多数据源情况下无法去掉,需要配置一个包,可以扫描到子包
 * 2:全部写在一个类里面          不行,读取不到
 * 3:注解class,使用class.forName        可以,(Class<? extends Annotation>) Class.forName("com.zxj.ds.mybatis.annotation.SaasDao")
 * 4:SQL写在配置文件中         可以
 * 5:两个数据源是否都支持事务   只有一个数据源支持事务,那就是dataSource中配置了@Primary注解的数据源
 * 6:两个数据源是不是可以一起回滚事务     只有一个注解支持事务
 * 7:自动转驼峰       可以,但是设置了驼峰就强制转驼峰,不支持下划线
 */
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}

更换数据源为druid,删除了注解的配置

DataSourceConfiguration.java

package com.zxj.ds.mybatis.configuration;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;

/**
 * Created by Administrator on 2017/5/4.
 */
@Configuration
public class DataSourceConfiguration {
    //数据库连接相关的参数:
    private String driverClassName = "com.mysql.jdbc.Driver";
    private String jdbcIpPort = "3306";
    private String jdbcUrl = "jdbc:mysql://server1:3306/%s?useUnicode=true&characterEncoding=utf8";
    private String userName = "root";
    private String password = "123";

    //连接池相关的参数:
    //等待从连接池中获得连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 缺省:30秒
    private long connectionTimeout = 30000;
    //一个连接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟
    private long idleTimeout = 600000;
    //一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒以上,
    //参考MySQL wait_timeout参数(show variables like '%timeout%';)
    private long maxLifetime = 1765000;
    //连接池中允许的最大连接数。缺省值:10;推荐的公式:((core_count * 2) + effective_spindle_count)
    private int maximumPoolSize = 15;


    @Bean()
    @Primary
    public DataSource dataSource1(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName(driverClassName);
        ds.setUrl(String.format(jdbcUrl, "saas"));
        ds.setUsername(userName);
        ds.setPassword(password);
        return ds;
    }

    @Bean()
    public DataSource dataSource2(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName(driverClassName);
        ds.setUrl(String.format(jdbcUrl, "saas2"));
        ds.setUsername(userName);
        ds.setPassword(password);
        return ds;
    }
}


新建 MyBatisConfiguration.java 文件


只需要一行注解,就可以配置mybadis的多数据源

这是一个基于spring boot 的mybadis的starter

支持多个数据源

使用方法很简单,先定义一些配置文件,放到application.yml中

package com.zxj.ds.mybatis.configuration;

import com.github.pagehelper.PageHelper;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.data.transaction.ChainedTransactionManager;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.TransactionManagementConfigurer;

import javax.annotation.Resource;
import javax.sql.DataSource;
import java.util.Properties;

/**
 * Created by Administrator on 2017/5/4.
 */
@Configuration
@EnableTransactionManagement
@AutoConfigureAfter(DataSourceConfiguration.class)
public class MyBatisConfiguration implements TransactionManagementConfigurer {
    private final static Logger logger = LoggerFactory.getLogger(MyBatisConfiguration.class);

    @Resource(name = "dataSource1")
    private DataSource ds1;
    @Resource(name = "dataSource2")
    private DataSource ds2;


    /**
     * 配置SqlSessionFactory:
     * - 创建SqlSessionFactoryBean,并指定一个dataSource;
     * - 设置这个分页插件:https://github.com/pagehelper/Mybatis-PageHelper;
     * - 指定mapper文件的路径;
     */
    @Bean
    public SqlSessionFactory sqlSessionFactory1() {
        return setMapper(ds1);
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory2() {
        return setMapper(ds2);
    }





    private SqlSessionFactory setMapper(DataSource ds) {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(ds);

        //分页插件
        PageHelper pageHelper = new PageHelper();
        Properties properties = new Properties();
        properties.setProperty("dialect", "mysql");
        properties.setProperty("reasonable", "false");
        properties.setProperty("pageSizeZero", "true");
        pageHelper.setProperties(properties);
        bean.setPlugins(new Interceptor[]{pageHelper});

        try {
            //指定mapper xml目录
            ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
            bean.setMapperLocations(resolver.getResources("classpath:mapper/*.xml"));
            //设置配置项
            org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
            //自动把下划线转成驼峰
//            configuration.setMapUnderscoreToCamelCase(true);
            bean.setConfiguration(configuration);
            return bean.getObject();
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            throw new RuntimeException(e);
        }
    }

    /**
     * Transaction 相关配置
     * 因为有两个数据源,所有使用ChainedTransactionManager把两个DataSourceTransactionManager包括在一起。
     */
    @Override
    public PlatformTransactionManager annotationDrivenTransactionManager() {
        DataSourceTransactionManager dtm1 = new DataSourceTransactionManager(ds1);
        DataSourceTransactionManager dtm2 = new DataSourceTransactionManager(ds2);

        ChainedTransactionManager ctm = new ChainedTransactionManager(dtm2, dtm1);
        return ctm;
    }


}

创建 MyBatisScanner.java


package com.zxj.ds.mybatis.configuration;

import com.zxj.ds.mybatis.annotation.Saas2Dao;
import com.zxj.ds.mybatis.annotation.SaasDao;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.lang.annotation.Annotation;

/**
 * Created by Administrator on 2017/5/4.
 */
@Configuration
@AutoConfigureAfter(MyBatisConfiguration.class)
public class MyBatisScanner {

    /**
     * - 设置SqlSessionFactory;
     * - 设置dao所在的package路径,路径可以以逗号或者分号进行分隔设置多个
     * - 关联注解在dao类上的Annotation名字;
     * - 上面的注解可以不需要
     */
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer1() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory1");
        mapperScannerConfigurer.setBasePackage("com.zxj.ds.mybatis.dao.saas");
        //mapperScannerConfigurer.setAnnotationClass((Class<? extends Annotation>) Class.forName("com.zxj.ds.mybatis.annotation.SaasDao"));
        return mapperScannerConfigurer;
    }

    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer2() {
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory2");
        mapperScannerConfigurer.setBasePackage("com.zxj.ds.mybatis.dao.saas2");
        //mapperScannerConfigurer.setAnnotationClass(Saas2Dao.class);
        return mapperScannerConfigurer;
    }
}

配置完成,从 controller开始,具体使用


package com.zxj.ds.mybatis.controller;

import com.framework.msg.db.WeichatAccount;
import com.framework.msg.db.businessTransaction.OrderRecord;
import com.zxj.ds.mybatis.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

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

/**
 * @Author 朱小杰
 * @Date 2017/5/4 10:41:42
 * 说明这个类的作用...
 */
@Controller
public class HelloController {
    @Autowired
    private HelloService service;

    @RequestMapping("/")
    @ResponseBody
    public String a(){
        List<Map<String,Object>> users = service.getUsers();
        System.out.println(users);

        List<OrderRecord> orders = service.getOilOrder();
        System.out.println(orders);

        List<WeichatAccount> accounts = service.getAccounts();
        System.out.println(accounts);

        return "SUCCESS";
    }

    @ResponseBody
    @RequestMapping("/b")
    public String b(){
        service.b();
        return "b";
    }
}

service新建  HelloService.java 文件

package com.zxj.ds.mybatis.service;

import com.framework.msg.db.WeichatAccount;
import com.framework.msg.db.businessTransaction.OrderRecord;
import com.zxj.ds.mybatis.dao.saas2.DbSaas2Dao;
import com.zxj.ds.mybatis.dao.saas.DbSaasDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

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


@Service
public class HelloService {
    @Autowired
    private DbSaasDao saasDao;
    @Autowired
    private DbSaas2Dao saas2Dao;
    public List<Map<String, Object>> getUsers() {
        List<Map<String, Object>> datas = saasDao.getUsers();
        return datas;
    }

    public List<OrderRecord> getOilOrder() {
        List<OrderRecord> d = saas2Dao.getOilOrder();
        return d;
    }

    public List<WeichatAccount> getAccounts() {
        return saasDao.getAccounts();
    }

    @Transactional
    public void b() {
/*        boolean r = saasDao.addApp("002","xxx");
        System.out.println(r);
        throw new RuntimeException("");*/

        boolean r = saas2Dao.addStaff("id1","xx");
        throw new RuntimeException("");

    }
}

Dao中分别创建二个包 saas 和 saas2 

saas中创建  DbSaasDao.java 文件
package com.zxj.ds.mybatis.dao.saas;


import com.framework.msg.db.WeichatAccount;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

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

//@SaasDao
@Mapper
public interface DbSaasDao {

    @Select("select * from weichat_user limit 50")
    List<Map<String, Object>> getUsers();

    @Select("select * from weichat_account limit 50")
    List<WeichatAccount> getAccounts();

    @Insert("INSERT INTO `saas`.`app_version` (`id`, `name`, `version`, `can_use_version`, `update_url`, `create_time`, `update_time`, `desc`, `fileSize`) VALUES (#{id}, #{name}, '1.0.4', '1.0.3', 'http://www.kindpetro.com.cn/admin/sqf.apk', '2017-04-18 11:09:49', '2017-04-18 11:09:52', '1,优化页面显示; \\r\\n2,修复Bug。', '0');\n")
    boolean addApp(@Param("id") String id,@Param("name") String name);
}

saas2中创建  DbSaas2Dao.java 文件

package com.zxj.ds.mybatis.dao.saas2;


import com.framework.msg.db.businessTransaction.OrderRecord;
import com.zxj.ds.mybatis.annotation.Saas2Dao;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;

import java.util.List;

@Mapper
//@Repository
public interface DbSaas2Dao {

    List<OrderRecord> getOilOrder();

    @Insert("INSERT INTO `saas2`.`staff` (`id`, `name`, `appid`, `openid`, `create_time`) VALUES (#{id},#{name}, 'wx2e9a7946612800c5', 'oZnKxwb6QKhv8xNN0of3eAvEd6mM', '2016-12-15 15:04:48');\n")
    boolean addStaff(@Param("id") String id,@Param("name") String name);
}

创建 annotation 包 

创建Saas2Dao.java文件

package com.zxj.ds.mybatis.annotation;

import java.lang.annotation.*;

/**
 * 连SAAS2数据库
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Saas2Dao {
}

创建SaasDao.java文件

package com.zxj.ds.mybatis.annotation;

import java.lang.annotation.*;

/**
 * 连接SAAS库
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface SaasDao {
}
完成





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值