四.SpringBoot集成实例系列-注解型多数据源mybatis

文章列表

本系列将通过实例分别实现Springboot集成mybatis(mysql),mail,mongodb,cassandra,scheduler,redis,kafka,shiro,websocket。
具体文章系列如下:
一.SpringBoot集成实例系列-xml型单数据源mybatis
二.SpringBoot集成实例系列-xml型多数据源mybatis
三.SpringBoot集成实例系列-注解型单数据源mybatis
四.SpringBoot集成实例系列-注解型多数据源mybatis
五.SpringBoot集成实例系列-邮件email
六.SpringBoot集成实例系列-单数据源mongodb
七.SpringBoot集成实例系列-多数据源mongodb
八.SpringBoot集成实例系列-缓存redis
九.SpringBoot集成实例系列-数据库cassandra
十.SpringBoot集成实例系列-定时任务scheduler
十一.SpringBoot集成实例系列-消息队列kafka
十二.SpringBoot集成实例系列-消息推送websocket

上一篇文章我们简单实现了注解型的单数据源mybatis.本章将实现不同数据源即多数据源的注解型mybatis。整个代码实现与多数据源的xml型mybatis相差不大。

1.需求

输出库test中表user的记录和库test2中表user的记录总和
建表语句见博文或源码

2.技术要点

2.1 springboot集成mybatis配置

配置多个数据源如:
spring.datasource.test1...
spring.datasource.test2...
以此类推
注解型的,配置文件去除mybatis相关配置。
2.2 多数据实现

1) @MapperScan(basePackages = "com.lm.mapper.test1", sqlSessionTemplateRef = "test1SqlSessionTemplate")
配置需要扫描的mapper接口
2) @Bean(name = "test1DataSource")
@ConfigurationProperties(prefix = "spring.datasource.test1")
@Primary
定义datasource,以及已application.properties配置文件数据源对应的名称
@Primary,当多个数据源时,需要定义一个主数据源,即优先考虑被注解的对象注入
相对xml型的多数据源,去除配置数据源对应的myabtis中mapper.xml路径
2.3 mapper接口配置

将mapper.xml文件的相关sql脚本信息,移植到通过mapper接口注解来实现。

3.代码实现

3.1 项目结构

3.2 properties配置文件
spring.datasource.test1.driverClassName = com.mysql.jdbc.Driver
spring.datasource.test1.url = jdbc:mysql://192.168.32.128:3306/test?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://192.168.32.128:3306/test2?useUnicode=true&characterEncoding=utf-8
spring.datasource.test2.username = root
spring.datasource.test2.password = root
3.3 datasource数据源实现
DataSource1Config文件
package com.lm.datasource;

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.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
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 org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

/**
 * test1数据源
 * 
 * @author liangming.deng
 * @date 2017年6月30日
 *
 */
@Configuration
@MapperScan(basePackages = "com.lm.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);
		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);
	}

}
DataSource2Config文件
package com.lm.datasource;

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.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

/**
 * test2数据源
 * 
 * @author liangming.deng
 * @date 2017年6月30日
 *
 */
@Configuration
@MapperScan(basePackages = "com.lm.mapper.test2", sqlSessionTemplateRef = "test2SqlSessionTemplate")
public class DataSource2Config {

	@Bean(name = "test2DataSource")
	@ConfigurationProperties(prefix = "spring.datasource.test2")
	public DataSource testDataSource() {
		return DataSourceBuilder.create().build();
	}

	@Bean(name = "test2SqlSessionFactory")
	public SqlSessionFactory testSqlSessionFactory(@Qualifier("test2DataSource") DataSource dataSource)
			throws Exception {
		SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
		bean.setDataSource(dataSource);
		return bean.getObject();
	}

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

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

}
3.4 User1Mapper和User2Mapper接口
User1Mapper接口
package com.lm.mapper.test1;

import java.util.List;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import com.lm.entity.UserEntity;
import com.lm.enums.SexEnums;
/**
 * mybatis中mapper接口
 * @author liangming.deng
 * @date   2017年6月21日
 *
 */
public interface User1Mapper {
	@Select("select * from user")
	@Results({
		@Result(id=true,property="id",column="id"),
		@Result(property="userName",column="userName"),
		@Result(property="nickName",column="nickName"),
		@Result(property="passWord",column="passWord"),
		@Result(property="email",column="email"),
		@Result(property="regTime",column="regTime"),
		@Result(property="sexEnums",column="sex",javaType=SexEnums.class)})
	List<UserEntity> getAll();

	@Select("select * from user where id=#{id}")
	@Results({
		@Result(id=true,property="id",column="id"),
		@Result(property="userName",column="userName"),
		@Result(property="nickName",column="nickName"),
		@Result(property="passWord",column="passWord"),
		@Result(property="email",column="email"),
		@Result(property="regTime",column="regTime"),
		@Result(property="sexEnums",column="sex",javaType=SexEnums.class)})
	UserEntity getUserById(Long id);

	@Insert("INSERT INTO user(userName,nickName,passWord,email,regTime,sex) "
			+ "VALUES(#{userName}, #{nickName}, #{passWord}, #{email}, #{regTime}, #{sex}) ")
	void insert(UserEntity user);

	
	@Update("UPDATE user SET userName=#{userName},nickName=#{nickName} where id=#{id}")
	void update(UserEntity user);

	@Delete("DELETE FROM user where id=#{id}")
	void delete(Long id);
}
User2Mapper接口
package com.lm.mapper.test2;

import java.util.List;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import com.lm.entity.UserEntity;
import com.lm.enums.SexEnums;
/**
 * mybatis中mapper接口
 * @author liangming.deng
 * @date   2017年6月21日
 *
 */
public interface User2Mapper {
	@Select("select * from user")
	@Results({
		@Result(id=true,property="id",column="id"),
		@Result(property="userName",column="userName"),
		@Result(property="nickName",column="nickName"),
		@Result(property="passWord",column="passWord"),
		@Result(property="email",column="email"),
		@Result(property="regTime",column="regTime"),
		@Result(property="sexEnums",column="sex",javaType=SexEnums.class)})
	List<UserEntity> getAll();

	@Select("select * from user where id=#{id}")
	@Results({
		@Result(id=true,property="id",column="id"),
		@Result(property="userName",column="userName"),
		@Result(property="nickName",column="nickName"),
		@Result(property="passWord",column="passWord"),
		@Result(property="email",column="email"),
		@Result(property="regTime",column="regTime"),
		@Result(property="sexEnums",column="sex",javaType=SexEnums.class)})
	UserEntity getUserById(Long id);

	@Insert("INSERT INTO user(userName,nickName,passWord,email,regTime,sex) "
			+ "VALUES(#{userName}, #{nickName}, #{passWord}, #{email}, #{regTime}, #{sex}) ")
	void insert(UserEntity user);

	
	@Update("UPDATE user SET userName=#{userName},nickName=#{nickName} where id=#{id}")
	void update(UserEntity user);

	@Delete("DELETE FROM user where id=#{id}")
	void delete(Long id);
}
3.5 前端控制器controller
package com.lm.web;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.lm.entity.UserEntity;
import com.lm.mapper.test1.User1Mapper;
import com.lm.mapper.test2.User2Mapper;
/**
 * 前端控制器
 * @author liangming.deng
 * @date   2017年6月21日
 *
 */
@RestController
public class UserController {

	@Autowired
	private User2Mapper user2Mapper;

	@Autowired
	private User1Mapper user1Mapper;
	@RequestMapping("/getUsers")
	public List<UserEntity> getUsers() {
		List<UserEntity> users = user2Mapper.getAll();
		return users;
	}
	
	@RequestMapping("/getAllUserCount")
	public String getAllUserCount(){
		int user1Count = user1Mapper.getAll().size();
		int user2Count = user2Mapper.getAll().size();
		
		return "user1Count:" + user1Count + " add " + "user2Count:" + user2Count + " = " + (user1Count+user2Count); 
	}

	@RequestMapping("/getUser")
	public UserEntity getUser(Long id) {
		UserEntity user = user2Mapper.getUserById(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) {
		user2Mapper.delete(id);
	}

}
3.6 运行效果

4. 代码地址

Github: https://github.com/a123demi/spring-boot-integration
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值