springboot之mybatis使用分包实现多数据源
2018-10-25 19:41
633 查看
首先是application配置文件,这里有几个大坑和大家分享一下:
1.application.yml中数据源配置需要去除idea自带的前缀,见下图,否则会连不上数据库的
[code]#正确格式 #spring: # datasource: # password: abc # driver-class-name: com.mysql.jdbc.Driver # url: jdbc:mysql://localhost:3306/book?useUnicode=true&characterEncoding=utf-8 # username: root #错误格式 spring: datasource: # 需要去除idea自带的格式 data-前缀 data-username: data-password:
2.多数据源配置 jdbc-url这里需要注意要加jdbc-前缀,不然会报错
[code]#指定自定义typeHandler mybatis.type-handlers-package=ink.toppest.springboot_test.handler #配置多数据源 spring.datasource.test1.driverClassName=com.mysql.jdbc.Driver spring.datasource.test1.jdbc-url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8 spring.datasource.test1.username=root spring.datasource.test1.password=123 spring.datasource.test2.driverClassName=com.mysql.jdbc.Driver spring.datasource.test2.jdbc-url=jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8 spring.datasource.test2.username=root spring.datasource.test2.password=123
实体类 User.java
[code]import lombok.Data; import lombok.experimental.Accessors; /** * 描述: * * @author HASEE * @create 2018-10-25 13:37 */ @Data @Accessors(chain = true) public class User { Sex sex; String userName; }
Sex.java
[code]package ink.toppest.springboot_test.entity; public enum Sex { man("男"),woman("女"); String sexName; Sex(String sexName){ this.sexName=sexName; } public String getSexName() { return sexName; } public void setSexName(String sexName) { this.sexName = sexName; } }
mapper1.UserMapper1.java
[code]package ink.toppest.springboot_test.mapper1; import ink.toppest.springboot_test.entity.Sex; import ink.toppest.springboot_test.entity.User; import ink.toppest.springboot_test.handler.SexEnumTypeHandler; 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 java.util.List; /** * 描述: * * @author HASEE * @create 2018-10-25 13:44 */ public interface UserMapper1 { @Select("select * from tb_user") @Results({ @Result(property = "sex",column = "sex",javaType = Sex.class,typeHandler = SexEnumTypeHandler.class), @Result(property = "userName",column = "user_name") }) List<User> getAll(); @Select("select * from tb_user where id=#{id}") @Results({ @Result(property = "sex",column = "sex",javaType = Sex.class), @Result(property = "userName",column = "user_name") }) User getOne(int id); @Insert("insert into tb_user(user_name,sex) values (#{userName},#{sex}) ") void insert(User user); }
为了方便mapper2.UserMapper2同上
SexEnumTypeHandler.java --------------用于枚举类型转换
[code]package ink.toppest.springboot_test.handler; import ink.toppest.springboot_test.entity.Sex; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.MappedTypes; import org.springframework.stereotype.Component; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * 描述: * * @author HASEE * @create 2018-10-25 17:34 */ @MappedTypes(Sex.class) public class SexEnumTypeHandler extends BaseTypeHandler<Sex> { //将枚举类型转成字符串存入数据库 @Override public void setNonNullParameter(PreparedStatement preparedStatement, int i, Sex sex, JdbcType jdbcType) throws SQLException { System.out.println("typeHandler-------work"); preparedStatement.setString(i,sex.getSexName()); } //下面三个都是字符串转枚举类型 @Override public Sex getNullableResult(ResultSet resultSet, String s) throws SQLException { return getEnum(s); } @Override public Sex getNullableResult(ResultSet resultSet, int i) throws SQLException { return getEnum(resultSet.getString(i)); } @Override public Sex getNullableResult(CallableStatement callableStatement, int i) throws SQLException { return getEnum(callableStatement.getString(i)); } private Sex getEnum(String val){ //将从数据库获得的字符串值转成枚举类型 Class<Sex> sexClass = Sex.class; Sex[] sexs = sexClass.getEnumConstants(); for(Sex sex:sexs){ if(sex.getSexName().equals(val)){ return sex; } } return null; } }
DataSourceConfiguration1.java -------------数据源1,注意两个数据源和不同mapper包关联,@Primary不加会报错
[code]package ink.toppest.springboot_test.config; 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.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.jdbc.datasource.DataSourceTransactionManager; import javax.sql.DataSource; /** * 描述: * 配置多数据源 * * @author HASEE * @create 2018-10-25 18:01 */ @Configuration @MapperScan(basePackages = "ink.toppest.springboot_test.mapper1", sqlSessionTemplateRef = "test1SqlSessionTemplate") public class DataSourceConfiguration1 { @Bean(name = "DataSource1") @ConfigurationProperties(prefix = "spring.datasource.test1") @Primary public DataSource test1DataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "SqlSessionFactory1") @Primary public SqlSessionFactory testSqlSessionFactory(@Qualifier("DataSource1") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); //bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test1/*.xml")); //将自定义的枚举类型处理器加入 bean.setTypeHandlersPackage("ink.toppest.springboot_test.handler"); return bean.getObject(); } @Bean(name = "test1TransactionManager") @Primary public DataSourceTransactionManager testTransactionManager(@Qualifier("DataSource1") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "test1SqlSessionTemplate") @Primary public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("SqlSessionFactory1") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
DataSourceConfiguration2.java --------------同上,不加@Primary(多数据源时,@PRimary有且只有一个)
[code]package ink.toppest.springboot_test.config; 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.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 org.springframework.jdbc.datasource.DataSourceTransactionManager; import javax.sql.DataSource; /** * 描述: * 配置多数据源 * * @author HASEE * @create 2028-20-25 28:02 */ @Configuration @MapperScan(basePackages = "ink.toppest.springboot_test.mapper2", sqlSessionTemplateRef = "test2SqlSessionTemplate") public class DataSourceConfiguration2 { @Bean(name = "DataSource2") @ConfigurationProperties(prefix = "spring.datasource.test2") public DataSource test2DataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "SqlSessionFactory2") public SqlSessionFactory testSqlSessionFactory(@Qualifier("DataSource2") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); //bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test2/*.xml")); bean.setTypeHandlersPackage("ink.toppest.springboot_test.handler"); return bean.getObject(); } @Bean(name = "test2TransactionManager") public DataSourceTransactionManager testTransactionManager(@Qualifier("DataSource2") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "test2SqlSessionTemplate") public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("SqlSessionFactory2") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
测试:
[code]package ink.toppest.springboot_test; import ink.toppest.springboot_test.entity.Sex; import ink.toppest.springboot_test.entity.User; import ink.toppest.springboot_test.mapper1.UserMapper1; import ink.toppest.springboot_test.mapper2.UserMapper2; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class SpringbootTestApplicationTests { @Autowired UserMapper2 userMapper; @Test public void contextLoads() { userMapper.insert(new User().setSex(Sex.man).setUserName("jack")); } }
阅读更多
相关文章推荐
- Spring Boot 整合mybatis 使用多数据源的实现方法
- (十一)Spring Boot整合Mybatis使用druid实现多数据源自动切换
- Springboot+Mybatis+Druid 实现多数据源,与事务管理
- spring Boot 整合mybatis 如何使用多数据源
- spring boot整合mybatis使用c3p0数据源连接mysql
- spring boot整合mybatis使用c3p0数据源连接mysql
- Spring Boot 整合 Mybatis 实现 Druid 多数据源详解
- Spring Cloud Spring Boot mybatis分布式微服务云架构(四十二)使用log4j实现http请求日志入mongodb(1)
- Spring Cloud Spring Boot mybatis分布式微服务云架构(四十三)使用log4j实现http请求日志入mongodb(2)
- 从0开始学习SpringCould(5)--SpringBoot 集成Mybatis使用Druid数据源
- 第九章 springboot + mybatis + 多数据源 (AOP实现)
- Spring Boot 整合 Mybatis 实现 Druid 多数据源详解
- Spring Boot 整合 Mybatis 实现 Druid 多数据源详解
- 第九章 springboot + mybatis + 多数据源 (AOP实现)
- springboot + mybatis + 多数据源 (AOP实现)
- Springboot整合Mybatis实现Druid多数据源
- eclipse 使用maven 搭建 springboot+mybatis + 多数据源
- Spring Boot 整合mybatis 如何使用多数据源
- Spring Boot 集成Mybatis实现主从(多数据源)分离方案