springboot 使用mybatis1.3.2和druid-spring-boot-starter1.2.16和spring-boot-starter-parent2.3.9.RELEASE编写一个mybatis的动态连接程序,可随时切换连接源,其中需要准备一个默认mysql库,用于存放动态连接用户与密码的库,连接到这个默认的库之后使用mybatis查询出所有默认的库来进行动态连接其他库,通过传入的指定字符串来判断是要写换哪个数据源,并且不使用配置文件的方式来决定,指定通过传入的额参数决定,请问这个程序该怎么编写

时间: 2024-02-15 09:02:00 浏览: 23
好的,根据您的需求,我为您编写了一个使用 MyBatis 和 Druid 连接池的动态连接程序,能够随时切换连接源,通过传入的参数来决定使用哪个数据源。具体实现步骤如下: 1. 在默认的 MySQL 库中创建一个表,用于存储动态连接用户和密码信息。示例 SQL 语句如下: ```sql CREATE TABLE dynamic_datasource ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, url VARCHAR(100) NOT NULL, username VARCHAR(50) NOT NULL, password VARCHAR(50) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ``` 2. 在项目中添加依赖,包括 MyBatis、Druid 和 MySQL 驱动等。示例 pom.xml 文件如下: ```xml <dependencies> <!-- MyBatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <!-- Druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.16</version> </dependency> <!-- MySQL 驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.23</version> </dependency> </dependencies> ``` 3. 在 application.yml 中配置 Druid 数据源。示例配置如下: ```yaml spring: datasource: druid: url: jdbc:mysql://localhost:3306/default_db?useUnicode=true&characterEncoding=utf-8 username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver ``` 4. 创建一个动态连接工具类 DynamicDataSourceUtils,用于动态创建数据源、切换数据源等操作。示例代码如下: ```java import com.alibaba.druid.pool.DruidDataSource; import org.apache.ibatis.datasource.DataSourceFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; import org.springframework.stereotype.Component; import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; import java.util.HashMap; import java.util.List; import java.util.Map; @Component public class DynamicDataSourceUtils extends AbstractRoutingDataSource { private static final ThreadLocal<String> dataSourceKey = new ThreadLocal<>(); private static Map<Object, Object> targetDataSources = new HashMap<>(); @Autowired private DataSourceFactory dataSourceFactory; @Override protected Object determineCurrentLookupKey() { return getDataSourceKey(); } public static String getDataSourceKey() { return dataSourceKey.get(); } public static void setDataSourceKey(String key) { dataSourceKey.set(key); } public void addTargetDataSource(String key, String url, String username, String password) { DruidDataSource dataSource = (DruidDataSource) dataSourceFactory.getDataSource(); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); dataSource.setInitialSize(5); dataSource.setMinIdle(5); dataSource.setMaxActive(20); dataSource.setTestWhileIdle(false); dataSource.setTestOnBorrow(false); dataSource.setTestOnReturn(false); dataSource.setValidationQueryTimeout(1); dataSource.setValidationQuery("SELECT 1"); dataSource.setPoolPreparedStatements(false); targetDataSources.put(key, dataSource); super.setTargetDataSources(targetDataSources); super.afterPropertiesSet(); } public void addTargetDataSource(String key, DataSource dataSource) { targetDataSources.put(key, dataSource); super.setTargetDataSources(targetDataSources); super.afterPropertiesSet(); } public void removeTargetDataSource(String key) { targetDataSources.remove(key); super.setTargetDataSources(targetDataSources); super.afterPropertiesSet(); } public List<Map<String, Object>> getDefaultDataSources() { String sql = "SELECT name, url, username, password FROM dynamic_datasource"; try (Connection conn = this.getConnection(); PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery()) { return SqlUtils.resultSetToList(rs); } catch (SQLException e) { throw new RuntimeException(e); } } } ``` 5. 创建一个数据源切换的切面 DynamicDataSourceAspect,用于在需要切换数据源的方法上切换数据源。示例代码如下: ```java import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component @Aspect public class DynamicDataSourceAspect { @Autowired private DynamicDataSourceUtils dataSourceUtils; @Before("@annotation(ds)") public void switchDataSource(JoinPoint joinPoint, DataSource ds) { String dsKey = ds.value(); if (!DynamicDataSourceUtils.getDataSourceKey().equals(dsKey)) { DynamicDataSourceUtils.setDataSourceKey(dsKey); } } } ``` 6. 在需要切换数据源的方法上添加 @DataSource 注解,指定要切换到哪个数据源。示例代码如下: ```java import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; import java.util.List; import java.util.Map; @Mapper public interface UserMapper { @Select("SELECT * FROM user") @DataSource("source1") List<Map<String, Object>> getUsers(); } ``` 7. 在代码中调用 UserMapper 的 getUsers 方法,传入指定的 @DataSource 注解值即可切换数据源。示例代码如下: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; @Service public class UserService { @Autowired private UserMapper userMapper; public List<Map<String, Object>> getUsers(String dataSourceKey) { DynamicDataSourceUtils.setDataSourceKey(dataSourceKey); return userMapper.getUsers(); } } ``` 这样,就可以通过传入参数来动态切换数据源了。

相关推荐

最新推荐

recommend-type

SpringBoot整合mybatis-plus实现多数据源的动态切换且支持分页查询.pdf

SpringBoot整合mybatis-plus实现多数据源的动态切换且支持分页查询,案例以postgresql和oracle数据库为数据源,分别使用mybatis-plus分页插件和pagehelper分页插件实现分页查询。
recommend-type

spring boot整合mybatis-plus启动报错问题及解答.pdf

解决spring-boot整合mybatis-plus启动报错问题; Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2020-08-04 20:19:03.246 ERROR 18020 --- ...
recommend-type

springboot整合mybatis-plus逆向工程的实现

主要介绍了springboot整合mybatis-plus逆向工程的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

springboot集成mybatis-plus遇到的问题及解决方法

主要介绍了springboot集成mybatis-plus遇到的问题及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

Spring + Spring Boot + MyBatis + MongoDB的整合教程

主要给大家介绍了关于Spring + Spring Boot + MyBatis + MongoDB的整合教程,文中通过图文以及示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
recommend-type

RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz

REALTEK 8188FTV 8188eus 8188etv linux驱动程序稳定版本, 支持AP,STA 以及AP+STA 共存模式。 稳定支持linux4.0以上内核。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

:YOLO目标检测算法的挑战与机遇:数据质量、计算资源与算法优化,探索未来发展方向

![:YOLO目标检测算法的挑战与机遇:数据质量、计算资源与算法优化,探索未来发展方向](https://img-blog.csdnimg.cn/7e3d12895feb4651b9748135c91e0f1a.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKJ6YaJ77yM5LqO6aOO5Lit,size_20,color_FFFFFF,t_70,g_se,x_16) # 1. YOLO目标检测算法简介 YOLO(You Only Look Once)是一种
recommend-type

def ObjFun(x,y,beta): # 目标函数 """ Logistic regression loss function :param beta: model parameter vector :param x: feature matrix :param y: label vector :return: loss value """ n = x.shape[0] p = x.shape[1] pred = 1 / (1 + np.exp(-np.dot(x, beta))) pred = np.clip(pred, 1e-15, 1 - 1e-15) # 将预测值限制在一个很小的区间内 ObjVal = -np.sum(y * np.log(pred) + (1 - y) * np.log(1 - pred)) / n return ObjVal

好的,根据上面的目标函数,我们可以推导出其对应的梯度向量函数,如下所示: def gradient(x, y, beta): """ Compute gradient of the logistic regression loss function :param beta: model parameter vector :param x: feature matrix :param y: label vector :return: gradient vector """ n = x.shape[0] pred = 1 /
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。