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

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"));
}

}

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: