SpringBoot+Mybatis配置多数据源,并实现数据查询和添加

1、添加依赖

mysql依赖

        <!--  mysql依赖 [start]  -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!--  mysql依赖 [end]  -->

mybatis依赖

        <!--  集成mybatis框架 [start]  -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>
        <!--  集成mybatis框架 [end]  -->

json依赖

        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
        </dependency>
2、配置application.properties

注意:url必须使用jdbc-url

#端口号
server.port=8080
# 数据库blog
spring.datasource.blog.jdbc-url=jdbc:mysql://localhost:3306/blog?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
spring.datasource.blog.username=root
spring.datasource.blog.password=root
spring.datasource.blog.driver-class-name=com.mysql.cj.jdbc.Driver

# 数据库monitor
spring.datasource.monitor.jdbc-url=jdbc:mysql://localhost:3306/monitor?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
spring.datasource.monitor.username=root
spring.datasource.monitor.password=root
spring.datasource.monitor.driver-class-name=com.mysql.cj.jdbc.Driver
####################Mybatis配置####################
# 实体类包路径
mybatis.type-aliases-package=com.gh.blog.entity
# mybatis的映射器XML文件路径
mybatis.mapper-locations=classpath*:mapper/*.xml
3、创建各层的包和类

在这里插入图片描述

  • entity包
    Demo实体类对应的是blog数据库的表,Loginmonitor实体类对应的是monitor实体类的表;
    实体类都实现序列化、以及重写toString方法(方便该类型的List数据转JSON) 在这里插入图片描述
    在这里插入图片描述

  • dao包
    各个数据源的DAO包要分开
    在这里插入图片描述

@Repository
public interface DemoDao {
    List<Demo> getAll();
}

在这里插入图片描述

@Repository
public interface LoginmonitorDao {
    List<Loginmonitor> getAll();

    void addList(List<Loginmonitor> list);
}
  • mapper包
    各个数据源的mapper同样也要分开

在这里插入图片描述

<?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.gh.blog.dao.blog.DemoDao">

<!-- 查询信息 -->
<select id="getAll" resultType="com.gh.blog.entity.Demo">
      select * from demo
    </select>
</mapper>

在这里插入图片描述

<?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.gh.blog.dao.monitor.LoginmonitorDao">

    <!-- 查询信息 -->
    <select id="getAll" resultType="com.gh.blog.entity.Loginmonitor">
      select * from loginmonitor
    </select>

    <insert id="addList">
        insert into loginmonitor(id, ip)
        values
        <foreach collection="list" item="bo" separator=",">
            (#{bo.id}, #{bo.ip})
        </foreach>
    </insert>
</mapper>
  • service包
    service层的接口和dao层的一样,只是不需要添加注解在这里插入图片描述
    在这里插入图片描述

  • impl包
    实现service层的接口类,要添加@Service注解
    在这里插入图片描述

@Service
public class DemoImpl implements DemoService {
    @Autowired
    private DemoDao dao;

    @Override
    public List<Demo> getAll() {
        return dao.getAll();
    }
}

在这里插入图片描述

@Service
public class LoginmonitorImpl implements LoginmonitorService {
    @Autowired
    private LoginmonitorDao dao;

    @Override
    public List<Loginmonitor> getAll() {
        return dao.getAll();
    }

    @Override
    public void addList(List<Loginmonitor> list) {
        dao.addList(list);
    }
}
/**
 * @author gaohan
 * @version 1.0
 * @date 2020/8/11 21:10
 */
@RestController
@RequestMapping(produces = MediaType.APPLICATION_JSON_VALUE)	
public class TestController {

    @Autowired
    private DemoService demoService;

    @Autowired
    private LoginmonitorService loginmonitorService;

    @GetMapping(value = "/demo")
    public String demo(){
        List<Demo> list = demoService.getAll();
        System.err.println(list.toString());
        return list.toString();
    }

    @GetMapping(value = "/login")
    public String login(){
        List<Loginmonitor> list = loginmonitorService.getAll();
        System.err.println(list.toString());
        return list.toString();
    }

    @PostMapping(value = "/add")
    public String add(@RequestBody List<Loginmonitor> list) {
        System.err.println(list.toString());
        loginmonitorService.addList(list);
        return "SUCCESS!";
    }
}
4、创建数据源

最重要的一步
blog数据库的数据源,使用@Primary注解标识为默认数据源

package com.gh.blog.config;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;

/**
 * @author gaohan
 * @version 1.0
 * @date 2020/8/12 16:43
 */
//表示这个类为一个配置类
@Configuration
// 配置mybatis的接口类放的地方
@MapperScan(basePackages = "com.gh.blog.dao.blog", sqlSessionFactoryRef = "blogSqlSessionFactory")
public class DataSourceConfig_Blog {

    // 将这个对象放入Spring容器中
    @Bean(name = "blogDataSource")
    // 表示这个数据源是默认数据源
    @Primary
    // 读取application.properties中的配置参数映射成为一个对象
    // prefix表示参数的前缀,要和application.properties配置里的参数对上
    @ConfigurationProperties(prefix = "spring.datasource.blog")
    public DataSource getDateSource1() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "blogSqlSessionFactory")
    // 表示这个数据源是默认数据源
    @Primary
    // @Qualifier表示查找Spring容器中名字为blogDataSource的对象
    public SqlSessionFactory blogSqlSessionFactory(@Qualifier("blogDataSource") DataSource datasource)
            throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(datasource);
        bean.setMapperLocations(
                // 设置mybatis的xml所在位置
                new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/blog/*.xml"));
        return bean.getObject();
    }

    @Bean("blogSqlSessionTemplate")
    // 表示这个数据源是默认数据源
    @Primary
    public SqlSessionTemplate blogSqlSessionTemplate(
            @Qualifier("blogSqlSessionFactory") SqlSessionFactory sessionfactory) {
        return new SqlSessionTemplate(sessionfactory);
    }
}

monitor数据库的数据源

package com.gh.blog.config;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;

/**
 * @author gaohan
 * @version 1.0
 * @date 2020/8/12 16:43
 */
//表示这个类为一个配置类
@Configuration
@MapperScan(basePackages = "com.gh.blog.dao.monitor", sqlSessionFactoryRef = "monitorSqlSessionFactory")
public class DataSourceConfig_Monitor {

    @Bean(name = "monitorDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.monitor")
    public DataSource getDateSource2() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "monitorSqlSessionFactory")
    public SqlSessionFactory monitorSqlSessionFactory(@Qualifier("monitorDataSource") DataSource datasource)
            throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(datasource);
        bean.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/monitor/*.xml"));
        return bean.getObject();
    }

    @Bean("monitorSqlSessionTemplate")
    public SqlSessionTemplate monitorSqlSessionTemplate(
            @Qualifier("monitorSqlSessionFactory") SqlSessionFactory sessionfactory) {
        return new SqlSessionTemplate(sessionfactory);
    }
}

5、测试

blog数据库demo表数据查询
在这里插入图片描述
monitor数据库loginmonitor表数据插入
在这里插入图片描述
monitor数据库loginmonitor表数据查询
在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring Boot应用中使用Mybatis和Hikari实现多数据源,可以按照以下步骤进行操作: 1. 在pom.xml文件中添加相关依赖,包括spring-boot-starter-jdbc、mybatis-spring-boot-starter、hikariCP等。 2. 在application.yml配置文件中配置多个数据源,例如: ``` spring: datasource: master: jdbc-url: jdbc:mysql://localhost:3306/master username: root password: root driver-class-name: com.mysql.jdbc.Driver slave: jdbc-url: jdbc:mysql://localhost:3306/slave username: root password: root driver-class-name: com.mysql.jdbc.Driver ``` 3. 创建多个数据源配置类,例如: ``` @Configuration @MapperScan(basePackages = "com.example.demo.master.mapper", sqlSessionTemplateRef = "masterSqlSessionTemplate") public class MasterDataSourceConfig { @Primary @Bean(name = "masterDataSource") @ConfigurationProperties(prefix = "spring.datasource.master") public DataSource masterDataSource() { return DataSourceBuilder.create().type(HikariDataSource.class).build(); } @Primary @Bean(name = "masterSqlSessionFactory") public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); return bean.getObject(); } @Primary @Bean(name = "masterTransactionManager") public DataSourceTransactionManager masterTransactionManager(@Qualifier("masterDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Primary @Bean(name = "masterSqlSessionTemplate") public SqlSessionTemplate masterSqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } } ``` ``` @Configuration @MapperScan(basePackages = "com.example.demo.slave.mapper", sqlSessionTemplateRef = "slaveSqlSessionTemplate") public class SlaveDataSourceConfig { @Bean(name = "slaveDataSource") @ConfigurationProperties(prefix = "spring.datasource.slave") public DataSource slaveDataSource() { return DataSourceBuilder.create().type(HikariDataSource.class).build(); } @Bean(name = "slaveSqlSessionFactory") public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); return bean.getObject(); } @Bean(name = "slaveTransactionManager") public DataSourceTransactionManager slaveTransactionManager(@Qualifier("slaveDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "slaveSqlSessionTemplate") public SqlSessionTemplate slaveSqlSessionTemplate(@Qualifier("slaveSqlSessionFactory") SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } } ``` 4. 在需要使用数据源的地方使用@Qualifier注解指定数据源,例如: ``` @Service public class UserService { @Autowired @Qualifier("masterSqlSessionTemplate") private SqlSessionTemplate masterSqlSessionTemplate; @Autowired @Qualifier("slaveSqlSessionTemplate") private SqlSessionTemplate slaveSqlSessionTemplate; public List<User> getUsersFromMaster() { return masterSqlSessionTemplate.selectList("com.example.demo.master.mapper.UserMapper.selectAll"); } public List<User> getUsersFromSlave() { return slaveSqlSessionTemplate.selectList("com.example.demo.slave.mapper.UserMapper.selectAll"); } } ``` 这样就可以在Spring Boot应用中使用Mybatis和Hikari实现多数据源了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值