springboot系列之多數據源配置

springboot系列之多數據源

網上很多文章都有多數據源和動態數據源的介紹,只能只介紹多數據源的配置方式,廢話不多說了,直接上代碼

以下內容僅供參考,有不對的地方請廣大客官批評指正。

應用場景

一般用於主從模式或者業務比較複雜需要連接不同的分庫來支持業務。

application.properties

mybatis.type-aliases-package=com.husy.springboot.multisource.entity

spring.datasource.test1.jdbc-url=jdbc:mysql://localhost:3306/test-db1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.test1.username=root
spring.datasource.test1.password=123456
spring.datasource.test1.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.test2.jdbc-url=jdbc:mysql://localhost:3306/test-db2?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.test2.username=root
spring.datasource.test2.password=123456
spring.datasource.test2.driver-class-name=com.mysql.cj.jdbc.Driver

數據源配置

最關鍵的一塊,首先創建 DataSource,然後創建 SqlSessionFactory 再創建事務,最後包裝到 SqlSessionTemplate 中。其中需要指定分庫的 mapper 文件地址,以及分庫dao層代碼。

具體如下::

第一個數據源配置

DataSource1Config.java

/**
 * @description: 主數據源配置,@Primary這個註解必須要加,因爲不加的話spring將分不清楚那個爲主數據源(默認數據源)
 * @author: hsy
 * @date; 2019/9/22
 */
//表示這個類爲一個配置類
@Configuration
// 配置mybatis的接口類放的地方
@MapperScan(basePackages="com.husy.springboot.multisource.mapper.test1",sqlSessionFactoryRef = "test1SqlSessionFactory")
public class DataSource1Config {

	// 將這個對象放入Spring容器中
	@Bean(name = "test1DataSource")
	//application.properteis中對應屬性的前綴
	@ConfigurationProperties(prefix = "spring.datasource.test1")
	// 表示這個數據源是默認數據源
	@Primary
	public DataSource testDataSource() {
		return DataSourceBuilder.create().build();
	}


	@Bean(name = "test1SqlSessionFactory")
	// 表示這個數據源是默認數據源
	@Primary
	// @Qualifier表示查找Spring容器中名字爲test1DataSource的對象
	public SqlSessionFactory test1SqlSessionFactory(@Qualifier("test1DataSource") DataSource datasource) throws Exception {
		MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
		bean.setDataSource(datasource);
		// 設置mybatis的xml所在位置
		bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/test1/*.xml"));
		return bean.getObject();
	}

	@Bean(name = "test1SqlSessionTemplate")
	@Primary
	public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
		return new SqlSessionTemplate(sqlSessionFactory);
	}

	@Bean(name = "test1TransactionManager")
	@Primary// 表示這個數據源是默認數據源
	public DataSourceTransactionManager testTransactionManager(@Qualifier("test1DataSource") DataSource dataSource) {
		return new DataSourceTransactionManager(dataSource);
	}

}

第二個數據源配置

DataSource2Config.java


/**
 * @description: 數據源配置
 * @author: hsy
 * @date; 2019/9/22
 */
//表示這個類爲一個配置類
@Configuration
// 配置mybatis的接口類放的地方
@MapperScan(basePackages="com.husy.springboot.multisource.mapper.test2",sqlSessionFactoryRef = "test2SqlSessionFactory")
public class DataSource2Config {

	// 將這個對象放入Spring容器中
	@Bean(name = "test2DataSource")
	//application.properteis中對應屬性的前綴
	@ConfigurationProperties(prefix = "spring.datasource.test2")
	public DataSource testDataSource() {
		return DataSourceBuilder.create().build();
	}


	@Bean(name = "test2SqlSessionFactory")
	// 表示這個數據源是默認數據源
	public SqlSessionFactory test1SqlSessionFactory(@Qualifier("test2DataSource") DataSource datasource) throws Exception {
		MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
		bean.setDataSource(datasource);
		// 設置mybatis的xml所在位置
		bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/test2/*.xml"));
		return bean.getObject();
	}

	@Bean(name = "test2SqlSessionTemplate")
	public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
		return new SqlSessionTemplate(sqlSessionFactory);
	}

	@Bean(name = "test2TransactionManager")
	public DataSourceTransactionManager testTransactionManager(@Qualifier("test2DataSource") DataSource dataSource) {
		return new DataSourceTransactionManager(dataSource);
	}

}

注意了:

1、@Primary這個註解必須要加,因爲不加的話spring將分不清楚那個爲主數據源(默認數據源)

2、mapper的接口、xml形式以及dao層都需要兩個分開

3、由於我使用了 mybatis-plus 插件。所有這裏必須用MybatisSqlSessionFactoryBean,如果是使用SqlSessionFactoryBean會報出現 Invalid bound statement (not found) 異常

entity

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class Users implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 主鍵id
     */
    @TableId(value = "user_id", type = IdType.AUTO )
    private Long userId;

    /**
     * 用戶名
     */
    @TableField("user_name")
    private String userName;

    /**
     * 密碼
     */
    @TableField("password")
    private String password;

    /**
     * 0:男,1:女
     */
    @TableField("user_sex")
    private Integer userSex;

    @TableField("nick_name")
    private String nickName;

}

Mapper 和xml

public interface Users1Mapper extends BaseMapper<Users> {
}
public interface Users2Mapper extends BaseMapper<Users> {
}
<?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.husy.springboot.multisource.mapper.test1.Users1Mapper">
</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.husy.springboot.multisource.mapper.test2.Users1Mapper">
</mapper>

service

public interface IUsersService{
	List<Users> getAll();
	Users getOne(Long id);
	void insert(Users user);
	void update(Users user);
	void delete(Long id);
}

@Service
public class UsersServiceImpl implements IUsersService {
	@Resource
	Users1Mapper users1Mapper;
	@Resource
	Users2Mapper users2Mapper;

	@Override
	public List<Users> getAll() {
		return users2Mapper.selectList(new QueryWrapper<>());
	}

	@Override
	public Users getOne(Long id) {
		return users2Mapper.selectById(id);
	}

	@Override
	public void insert(Users user) {
		users1Mapper.insert(user);
	}

	@Override
	public void update(Users user) {
		users1Mapper.update(user,null);
	}

	@Override
	public void delete(Long id) {
		users1Mapper.deleteById(id);
	}
}

controller

@RestController
@RequestMapping("users")
public class UsersController {
	@Autowired
	IUsersService usersService;

	@RequestMapping("/getUsers")
	public List<Users> getUsers() {
		List<Users> users=usersService.getAll();
		return users;
	}

	@RequestMapping("/getUser")
	public Users getUser(Long id) {
		Users user=usersService.getOne(id);
		return user;
	}

	@RequestMapping("/add")
	public void save(@RequestBody  Users user) {
		usersService.insert(user);
	}

	@RequestMapping(value="update")
	public void update(@RequestBody Users user) {
		usersService.update(user);
	}

	@RequestMapping(value="/delete/{id}")
	public void delete(@PathVariable("id") Long id) {
		usersService.delete(id);
	}
}

項目目錄結構如下

在這裏插入圖片描述

GitHub項目地址:https://github.com/HusyCoding/springboot-demo/tree/master/springboot-multi-source

SQL腳本:

CREATE TABLE `users` (
	`user_id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
	`user_name` VARCHAR(32) NOT NULL COMMENT '用戶名' COLLATE 'utf8_general_ci',
	`password` VARCHAR(32) NOT NULL COMMENT '密碼' COLLATE 'utf8_general_ci',
	`user_sex` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '0:男,1:女',
	`nick_name` VARCHAR(32) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
	PRIMARY KEY (`user_id`)
)
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1
;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章