您的位置:首页 > 编程语言 > Java开发

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

2017-07-18 19:59 411 查看
文章列表

本系列将通过实例分别实现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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息