一个项目中配置多个数据源(链接不同库jdbc),无限大,具体多少根据内存大小

项目中多数据源如何划分:分包名(业务)或注解方式。分包名方式类似多个不同的jar,同业务需求放一个包中。

分包方式配置多数据源

项目目录结构

2.14.1 pom文件

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.9.RELEASE</version>
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- mybatis-spring-boot-starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
<!-- mysql 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<!-- 提示建议引入 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>

2.14.2 创建test1包名下类

public class Employee implements Serializable{
private static final long serialVersionUID = 1L;
private Integer id;
private String lastName;
public interface EmployeeDao {

//    @Insert("insert into myemployeee(last_name) values (#{lastName})")
int insert(Employee emp);
}

EmployeeMapping.xml文件

<?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.springboot2.test1.dao.EmployeeDao">
<insert id="insert" parameterType="com.springboot2.test1.bean.Employee">
insert into myemployeee(last_name) values (#{lastName,jdbcType=VARCHAR})
</insert>
</mapper>

service类

@Service
public class EmployeeService {
@Autowired
EmployeeDao employeeDao; public Integer insert(Employee emp) {
return employeeDao.insert(emp);
}
}

2.14.3 创建test2包名下类

public class User implements Serializable{

    private static final long serialVersionUID = 1L;
private Integer id;
private String name;
private Integer age;
public interface UserDao {
// @Insert("insert into myuser(name,age) values (#{name},#{age})")
int insert(User user);
}

UserMapping.xml文件

<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.springboot2.test2.dao.UserDao">
<insert id="insert" parameterType="com.springboot2.test2.bean.User">
insert into myuser(name,age) values (#{name,jdbcType=VARCHAR},#{age,jdbcType=INTEGER})
</insert>
</mapper>
@Service
public class UserService { @Autowired
UserDao userDao; public Integer insert(User user2) {
return userDao.insert(user2);
}
}

2.14.4 重点:多数据源配置

2.14.4.1首先application.yml文件

#多数据源配置
spring:
datasource:
test1: #数据源1(自定义)
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/mytest?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=GMT%2B8&allowMultiQueries=true
username: root
password: (***)
test2: #数据源2(自定义)
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/mytest2?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=GMT%2B8&allowMultiQueries=true
username: root
password: (***)

注意:虽然为高版本,但多数据源配置时,必须为spring.datasource.test.jdbc-url而不是spring.datasource.test.url

2.14.4.2多数据源配置类

/**
* 数据源配置
* @author admin
*
*/
@Configuration
@MapperScan(basePackages= "com.springboot2.test1.dao",sqlSessionFactoryRef="test1SqlSessionFactory") //注意:com.springboot2.test1.dao是dao类的包名!!
public class DatasourceConfig1 { /**
* 配置test1数据库
* @return
*/
@Bean(name="test1DataSource")
@ConfigurationProperties(prefix="spring.datasource.test1")
@Primary
public DataSource test1DataSource() {
return DataSourceBuilder.create().build();
} /**
* 创建sqlsessinfactory会话工厂
* @param dataSource
* @return
* @throws Exception
*/
@Bean(name="test1SqlSessionFactory")
@Primary
public SqlSessionFactory test1SqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
//加载mapping文件
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath:com/springboot2/test1/mapping/*.xml"));
return sqlSessionFactoryBean.getObject();
} /**
* 事务管理
*/
@Bean(name="test1TransactionManager")
@Primary
public DataSourceTransactionManager test1TransactionManager(@Qualifier("test1DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
} /**
* 创建SqlSessionTemplate
* @param sqlSessionFactory
* @return
*/
@Bean(name="test1SqlSessionTemplate")
@Primary
public SqlSessionTemplate test1SqlSessionTemplate(@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory); }
}
/**
* 数据源配置
* @author admin
*
*/
@Configuration
@MapperScan(basePackages= {"com.springboot2.test2.dao"},sqlSessionFactoryRef="test2SqlSessionFactory")
public class DatasourceConfig2 { /**
* 配置test2数据库
* @return
*/
@Bean(name="test2DataSource")
@ConfigurationProperties(prefix="spring.datasource.test2")
public DataSource test2DataSource() {
return DataSourceBuilder.create().build();
} /**
* 创建sqlsessinfactory会话工厂
* @param dataSource
* @return
* @throws Exception
*/
@Bean(name="test2SqlSessionFactory")
public SqlSessionFactory test2SqlSessionFactory(@Qualifier("test2DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
//加载mapping文件
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath:com/springboot2/test2/mapping/*.xml"));
return sqlSessionFactoryBean.getObject();
} /**
* 事务管理
*/
@Bean(name="test2TransactionManager")
public DataSourceTransactionManager test2TransactionManager(@Qualifier("test2DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
} /**
* 创建SqlSessionTemplate
* @param sqlSessionFactory
* @return
*/
@Bean(name="test2SqlSessionTemplate")
public SqlSessionTemplate test2SqlSessionTemplate(@Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory); }
}

注意:

1)分包方式下@Primary可以不写!

2)mapperscan扫描为dao类对应的包名而不是dao类,否则会导致无法注入,报错缺少component注解。

2.14.5 controller类

@RestController
public class MultiDataSourceController {
@Autowired
EmployeeService employeeService1;
@Autowired
UserService userService; @RequestMapping("/insertEmployee")
public String insert(String lastName){
Employee emp=new Employee();
emp.setLastName(lastName);
int i=employeeService1.insert(emp);
return i+"";
} //接收json格式请求
@RequestMapping("/insertUser")
public String insert(@RequestBody User user){
User user2=new User();
user2.setAge(user.getAge());
user2.setName(user.getName());
int i=userService.insert(user2);
return i+"";
}
//接收普通格式多参数请求
@RequestMapping("/insertUser2")
public String insertUser2(@RequestParam("name") String name,@RequestParam("age") Integer age){
User user2=new User();
user2.setAge(age);
user2.setName(name);
int i=userService.insert(user2);
return i+"";
}

2.14.7 启动类

@SpringBootApplication
//@MapperScan("com.springboot2.dao")//多数据源下在数据源配置中配置DatasourceConfig1和DatasourceConfig2
public class StartApplication { public static void main(String[] args) {
SpringApplication.run(StartApplication.class, args);
} }

2.14.8 测试

1 Get请求:http://localhost:8080/insertEmployee?lastName=test2222

执行成功返回1

2 Post请求(且content-type为application/json类型)

http://localhost:8080/insertUser

请求参数:

{

"name":"test3",

"age":11

}

返回成功1

3 get请求(content-type类型随意)

http://localhost:8080/insertUser2?name=ttdd&age=22

返回成功1

2.15SpringBoot多数据源事务(24)

@Service
public class EmployeeService {
@Autowired
EmployeeDao employeeDao;
/**
* 添加事务管理
* @param emp
* @return
* @throws Exception
*/
@Transactional(transactionManager="test1TransactionManager",rollbackFor=Exception.class)
public Integer insert(Employee emp) throws Exception{
/**
* 抛出异常事务无效:默认检测unchecked异常才回滚,checked异常也回滚需要设置rollbackFor=Exception.class
* https://www.cnblogs.com/syp172654682/p/9811341.html
*/
int i=this.other(emp);
return i;
} @Transactional(transactionManager="test1TransactionManager")
public Integer other(Employee emp) throws Exception{
int i=employeeDao.insert(emp);
try {
i=i/0;
}catch(Exception e) {
Logger.logMsg(Logger.INFO, "异常");
throw new Exception();
}
return i;
}
}

启动类

@SpringBootApplication
@EnableTransactionManagement
//@MapperScan("com.springboot2.dao")//多数据源下在数据源配置中配置DatasourceConfig1和DatasourceConfig2
public class StartApplication { public static void main(String[] args) {
SpringApplication.run(StartApplication.class, args);
} }

问题:

1)抛出Exception异常事务无效,原因及解决方法见上面代码

2)其他事务失效问题见:https://www.cnblogs.com/cslj2013/p/10924755.html

github: https://github.com/cslj2013/springboot2.0_multi_datasources.git

springboot学习入门简易版九---springboot2.0整合多数据源mybatis mysql8+(22)的更多相关文章

  1. springboot学习入门简易版六---springboot2.0整合全局捕获异常及log4j日志(12-13)

    使用Aop实现 1创建异常请求 在原有项目基础上,jspController中创建一个可能发生异常的请求: /** * 全局捕获异常测试 * @param i * @return */ @Reques ...

  2. springboot学习入门简易版五---springboot2.0整合jsp(11)

    springboot对jsp支持不友好,内部tomcat对jsp不支持,需要使用外部tomcat,且必须打包为war包. 1 创建maven项目 注意:必须为war类型,否则找不到页面. 且不要把js ...

  3. springboot学习入门简易版三---springboot2.0启动方式

    2.4使用@componentscan方式启动 2.4.1 @EnableAutoConfiguration 默认只扫描当前类 @EnableAutoConfiguration 默认只扫描当前类,如果 ...

  4. springboot学习入门简易版二---springboot2.0项目创建

    2 springboot项目创建(5) 环境要求:jdk1.8+ 项目结构: 2.1创建maven工程 Group id :com.springbootdemo Artifact id: spring ...

  5. springboot学习入门简易版八---springboot2.0多环境配置、整合mybatis mysql8+(19-20)

    2.11 SpringBoot多环境配置(19)  application.properties中配置 Spring.profiles.active=prd 配置环境: Application-dev ...

  6. springboot学习入门简易版四---springboot2.0静态资源访问及整合freemarker视图层

    2.4.4 SpringBoot静态资源访问(9) Springboot默认提供静态资源目录位置需放在classpath下,目录名需要符合如下规则 /static  /public  /resourc ...

  7. springboot学习入门简易版一---springboot2.0介绍

    1.1为什么用springboot(2) 传统项目,整合ssm或ssh,配置文件,jar冲突,整合麻烦.Tomcat容器加载web.xml配置内容 springboot完全采用注解化(使用注解方式启动 ...

  8. springboot学习入门简易版七---springboot2.0使用@Async异步执行方法(17)

    1启动类开启异步调用注解 @SpringBootApplication @EnableAsync //开启异步调用 public class StartApplication { 不开启则异步调用无效 ...

  9. SpringBoot2.0 整合 QuartJob ,实现定时器实时管理

    一.QuartJob简介 1.一句话描述 Quartz是一个完全由java编写的开源作业调度框架,形式简易,功能强大. 2.核心API (1).Scheduler 代表一个 Quartz 的独立运行容 ...

随机推荐

  1. beyond compare解决特殊字符无法输出、多sheet页无法对比以及文件太大超出系统内存问题的Excel转txt脚本

    beyond compare解决特殊字符无法输出.多sheet页无法对比以及文件太大超出系统内存问题的Excel转txt脚本 ' XLS_to_CSV.vbs ' ' Converts an Exce ...

  2. jdbc批量写入

    jdbc加了rewriteBatchedStatements=true就可以提升很多倍,

  3. ArrayList: java之ArrayList详细介绍(转)

    1  ArrayList介绍 ArrayList简介 ArrayList 是一个数组队列,相当于 动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractList,实现了List ...

  4. javascript数组遍历的几种常用方法性能分析对比

    前言: 数组遍历有很多种方法,虽然不同方法有不同的特性及适用环境,除了普通飞for循环之外,for...in能直接输出数组元素的索引,for...of能直接输出数组元素的值,map则可以直接生成新的数 ...

  5. openresty开发系列32--openresty执行流程之1初始化阶段

    openresty开发系列32--openresty执行流程之初始化阶段 一)初始化阶段 1)init_by_lua   init_by_lua_block     init_by_lua_file语 ...

  6. Python3基础 yield send 变量名= yield i

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...

  7. OpenShift 4.1 基本问题探索

    因为在OpenShift 4.1环境中不建议直接登录集群主机操作,因此很多操作可能需要在外部的Client VM上完成.当然用rhel的worker node的同事也可以和原来习惯保持一致. 这里记录 ...

  8. Swift编码总结6

    1.UILabel的minimumScaleFactor: 需要UIlabel根据字数多少来减小字体大小,使得UIlabel能够显示全所有的文字.你需要做的就是设置minimumScaleFactor ...

  9. H5混合开发中android终端和ios终端常见的兼容问题2

    转自 https://www.cnblogs.com/stoneniqiu/p/6077112.html 1.ios键盘挡住输入框. setInterval(function () { if (doc ...

  10. PHP设计模式 - 享元模式

    运用共享技术有效的支持大量细粒度的对象 享元模式变化的是对象的存储开销 享元模式中主要角色: 抽象享元(Flyweight)角色:此角色是所有的具体享元类的超类,为这些类规定出需要实现的公共接口.那些 ...