劫持别人网站做排名/讯展网站优化推广
SpringBoot+MyBatis配置多数据源
文章目录
- SpringBoot+MyBatis配置多数据源
- 前言
- 一、项目搭建
- 1.1 项目结构
- 1.2 相关依赖
- 1.3 排除数据源的自动装配
- 1.4 配置文件 application.yml
- 1.5 数据源配置类
- 1.6 mydb 数据库
- 1.7 mydb2 数据库
- 二、启动项目测试
- 总结
前言
说明:
- 配置两个 MySQL 数据库,针对不同数据库中的表进行查询所有的操作
思路:
- 分包扫描,配置多个数据源。
步骤:
- 创建 springboot 项目,引入基本依赖;
- 排除数据源的自动装配;
- 在
application.yml
配置文件中配置多个数据源; - 定义配置类,一个数据源对应一个配置类;
- 编写 实体类、mapper 接口和 xml 进行测试;
一、项目搭建
1.1 项目结构
|_src/main/|_java/com/more/|_config/|_DataSourceOne.java # 数据源1的相关配置|_DataSourceTwo.java # 数据源2的相关配置|_domain/|_Account.java|_User.java|_mapper/|_one/|_OneMapper.java|_tow/|_TwoMapper.java|_StartApplication|_resources/ # 静态资源文件|_mapper/|_one/|_OneMapper.xml|_two/|_TwoMapper.xml|_application.yml
1.2 相关依赖
<dependencies><!-- web 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.38</version></dependency><!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.1</version></dependency><!-- 测试 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><!--热部署工具--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency>
</dependencies>
1.3 排除数据源的自动装配
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class StartApplication {public static void main(String[] args) {SpringApplication.run(StartApplication.class, args);}
}
1.4 配置文件 application.yml
server:port: 9090# 数据源
datasource:jdbc1:driverClassName: com.mysql.jdbc.Driverjdbc-url: jdbc:mysql://127.0.0.1:3306/mydb?useUnicode=true&characterEncoding=utf8&useSSL=falseusername: rootpassword: rootjdbc2:driverClassName: com.mysql.jdbc.Driverjdbc-url: jdbc:mysql://127.0.0.1:3306/mydb2?useUnicode=true&characterEncoding=utf8&useSSL=falseusername: rootpassword: root
- 这里需要注意的是
jdbc
连接参数是固定写法
1.5 数据源配置类
主配置数据源(未指定时的默认数据源)
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
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;@Configuration
@MapperScan(basePackages = "com.more.mapper.one", sqlSessionFactoryRef = "factoryOne")
public class DataSourceOne {/*@Primary 表示主数据源,未指定使用哪个数据源时默认使用@ConfigurationProperties 表示从配置文件中获取值, prefix 表示前缀匹配*//*** 注入 数据源1*/@Bean(name = "DataSource1")@Primary@ConfigurationProperties(prefix = "datasource.jdbc1")public DataSource getDateSource1() {return DataSourceBuilder.create().build();}/*** 注入 mybatis 的 sqlSessionFactory* 设置 数据源 与 xml 路径*/@Bean(name = "factoryOne")@Primarypublic SqlSessionFactory test1SqlSessionFactory(@Qualifier("DataSource1") DataSource datasource) throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();// 设置数据源bean.setDataSource(datasource);// 设置 mybatis 的 xml 所在位置bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/one/*.xml"));return bean.getObject();}
}
第二个数据源
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
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.core.io.support.PathMatchingResourcePatternResolver;import javax.sql.DataSource;@Configuration
@MapperScan(basePackages = "com.more.mapper.two", sqlSessionFactoryRef = "factoryTwo")
public class DataSourceTwo {/*** 创建数据源*/@Bean(name = "DataSource2")@ConfigurationProperties(prefix = "datasource.jdbc2")public DataSource getDateSource1() {return DataSourceBuilder.create().build();}/*** 创建 mybatis 的 sqlSessionFactory*/@Bean(name = "factoryTwo")public SqlSessionFactory test1SqlSessionFactory(@Qualifier("DataSource2") DataSource datasource) throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(datasource);bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/two/*.xml"));return bean.getObject();}
}
1.6 mydb 数据库
实体类,对应 mydb.user
表
import lombok.Data;@Data
public class User {private int id;private String username;private String password;
}
mapper 接口定义:
package com.more.mapper.one;import com.more.domain.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;import java.util.List;@Repository
@Mapper
public interface OneMapper {List<User> findAll();
}
xml 映射配置:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.more.mapper.one.OneMapper"><resultMap id="map" type="com.more.domain.User"><id column="id" property="id"/><result column="username" property="username"/><result column="password" property="password"/></resultMap><select id="findAll" resultMap="map">select * from my_user</select></mapper>
1.7 mydb2 数据库
实体类,对应 mydb2.account
表:
import lombok.Data;@Data
public class Account {private int id;private String accName;private String accPsw;
}
mapper 接口定义:
package com.more.mapper.two;import com.more.domain.Account;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;import java.util.List;@Repository
@Mapper
public interface TwoMapper {List<Account> getAll();
}
xml 映射配置:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.more.mapper.two.TwoMapper"><resultMap id="map" type="com.more.domain.Account"><id column="id" property="id"/><result column="account_name" property="accName"/><result column="account_psw" property="accPsw"/></resultMap><select id="getAll" resultMap="map">select * from my_account</select>
</mapper>
二、启动项目测试
import com.more.domain.Account;
import com.more.domain.User;
import com.more.mapper.one.OneMapper;
import com.more.mapper.two.TwoMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest
public class BaseApplicationTest {@AutowiredOneMapper oneMapper;@AutowiredTwoMapper twoMapper;@Testpublic void test() {List<User> all = oneMapper.findAll();all.forEach(System.out::println);List<Account> all2 = twoMapper.getAll();all2.forEach(System.out::println);}
}
总结
- 实现思路:通过不同数据源扫描不同 Mapper 包实现。
- MyBatis多数据源配置时需要排除排除数据源的自动装配:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
- 自定义数据源的配置类,并在配置类中指定 Mapper 接口及 Mapper 映射文件的扫描路径。