某项目需要做数据同步,还是不同数据库,所以创建了一个多数据源项目,后期如果想做相关方面的处理,只需要重新配置DBConfig,新建DAO,Entity等。
1.创建一个springboot项目,导入Springboot所需要的包和mysql,pgsql的包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.10</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.13</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
2.项目目录结构,DB1为mysql数据库,DB2为pgsql数据库。
3.新建第一个数据源配置信息,DB1DataSourceConfig
package com.nightmare.multiple.sources.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.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
/**
* @Author: WuChang
* @Description:
* @Date: Created in 2022-05-31 5:04 PM
* @Modified By:
*/
@Configuration
@MapperScan(basePackages = "com.nightmare.multiple.sources.dao.db1",sqlSessionFactoryRef = "db1SqlSessionFactory")
public class DB1DataSourceConfig {
static final String MAPPER_LOCATION = "classpath:/mapper/db1/*.xml";
@Bean("db1DataSource")
@ConfigurationProperties(prefix = "spring.datasource.db1")
public DataSource getDb1DataSource(){
return DataSourceBuilder.create().build();
}
@Bean("db1SqlSessionFactory")
public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION));
return bean.getObject();
}
@Bean("db1SqlSessionTemplate")
public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory);
}
}
4.新建mysql数据库MysqlUserDAO.java和MysqlUserMapper.xml。
package com.nightmare.multiple.sources.dao.db1;
import com.nightmare.multiple.sources.entity.db1.MysqlUserEO;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @Author: WuChang
* @Description:
* @Date: Created in 2022-08-26 5:56 PM
* @Modified By:
*/
@Component
public interface MysqlUserDAO {
List<MysqlUserEO> getMysqlUserEOS();
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.nightmare.multiple.sources.dao.db1.MysqlUserDAO">
<!-- 通用查询映射结果 -->
<resultMap id="MysqlUserResultMap" type="com.nightmare.multiple.sources.entity.db1.MysqlUserEO">
<result column="id" property="id" />
<result column="user_id" property="userId"/>
<result column="user_name" property="userName"/>
<result column="user_code" property="userCode"/>
<result column="user_password" property="userPassword"/>
<result column="isFlag" property="isFlag"/>
<result column="create_date" property="createDate"/>
<result column="created_by" property="createdBy"/>
</resultMap>
<select id="getMysqlUserEOS" resultMap="MysqlUserResultMap" parameterType="com.nightmare.multiple.sources.entity.db1.MysqlUserEO">
select id, user_id, user_name,user_code,user_password,isFlag,create_date,created_by from t_user;
</select>
</mapper>
5.新建第二个数据源配置:DB2DataSourceConfig.java
package com.nightmare.multiple.sources.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.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
/**
* @Author: WuChang
* @Description:
* @Date: Created in 2022-05-31 5:05 PM
* @Modified By:
*/
@Configuration
@MapperScan(basePackages = "com.nightmare.multiple.sources.dao.db2",sqlSessionFactoryRef = "db2SqlSessionFactory")
public class DB2DataSourceConfig {
static final String MAPPER_LOCATION = "classpath:/mapper/db2/*.xml";
@Bean("db2DataSource")
@ConfigurationProperties(prefix = "spring.datasource.db2")
public DataSource getDb2DataSource(){
return DataSourceBuilder.create().build();
}
@Bean("db2SqlSessionFactory")
public SqlSessionFactory db2SqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION));
return bean.getObject();
}
@Bean("db2SqlSessionTemplate")
public SqlSessionTemplate db2SqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory);
}
}
6.新建pgsql数据库PGUserDAO.java和PGUserMapper.xml。
package com.nightmare.multiple.sources.dao.db2;
import com.nightmare.multiple.sources.entity.db2.PGUserEO;
import org.springframework.stereotype.Component;
/**
* @Author: WuChang
* @Description:
* @Date: Created in 2022-08-26 5:57 PM
* @Modified By:
*/
@Component
public interface PGUserDAO {
void savePGUserEO(PGUserEO pgUserEO);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.nightmare.multiple.sources.dao.db2.PGUserDAO">
<!-- 通用查询映射结果 -->
<resultMap id="PGUserResultMap" type="com.nightmare.multiple.sources.entity.db2.PGUserEO">
<result column="id" property="id" />
</resultMap>
<insert id="savePGUserEO" parameterType="com.nightmare.multiple.sources.entity.db2.PGUserEO">
INSERT INTO tuser (id, user_id, user_name,user_code,user_password,is_flag,create_date,created_by)
VALUES (#{id},#{userId},#{userName},#{userCode},#{userPassword},#{isFlag},#{createDate},#{createdBy})
</insert>
</mapper>
7.application.yml
spring:
application:
name: multiple-data
datasource:
dynamic:
primary: db1 # 配置默认数据库
db1:
jdbc-url: jdbc:mysql://localhost:3306/wu_nightmare
username: ******
password: ******
driver-class-name: com.mysql.cj.jdbc.Driver
db2:
jdbc-url: jdbc:postgresql://localhost:5432/pgtestdb
username: ****
password: ****
driver-class-name: org.postgresql.Driver
8.效果:
Mysql查询数据:select * from t_user;
Pgsql 查询数据:select * from public.tuser;