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

来源:互联网 发布:旅游市场调查数据 编辑:程序博客网 时间:2024/06/13 05:07
文章列表

本系列将通过实例分别实现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.Driverspring.datasource.test1.url = jdbc:mysql://192.168.32.128:3306/test?useUnicode=true&characterEncoding=utf-8spring.datasource.test1.username = rootspring.datasource.test1.password = rootspring.datasource.test2.driverClassName = com.mysql.jdbc.Driverspring.datasource.test2.url = jdbc:mysql://192.168.32.128:3306/test2?useUnicode=true&characterEncoding=utf-8spring.datasource.test2.username = rootspring.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")@Primarypublic DataSource testDataSource() {return DataSourceBuilder.create().build();}@Bean(name = "test1SqlSessionFactory")@Primarypublic SqlSessionFactory testSqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource)throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);return bean.getObject();}@Bean(name = "test1TransactionManager")@Primarypublic DataSourceTransactionManager testTransactionManager(@Qualifier("test1DataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}@Bean(name = "test1SqlSessionTemplate")@Primarypublic 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日 * */@RestControllerpublic class UserController {@Autowiredprivate User2Mapper user2Mapper;@Autowiredprivate 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