在使用Mybatis和Spring进行数据库操作时,我们通常将数据库连接的信息(url、用户名、密码等)配置到jdbc.properties里面。通过Spring加载这些信息,建立数据源。Mybatis的mapper使用数据源提供的数据库连接来访问数据库。
这种情况下,数据库的url、用户名、密码是提前配置好的,不能修改的,并且在服务器启动时就读取(通过Spring)了。
那么,有没有可能在运行期间,通过Java代码动态的修改用来进行数据库连接的用户名和密码信息。
比如,我在jdbc.properties里面配置的是:admin/123,但是运行期间外界给我传来一个新的数据库用户和密码:admin2/456,那么我能不能动态地将后续的数据库连接的用户名密码改成admin2/456?
不建议通过动态修改数据库的连接配置。
首先,动态修改数据库配置必将造成正在使用的系统无法正常运行,这会对公司的业务以及正在使用系统的用户造成很大的影响,会给公司造成损失。
其次,动态修改数据库配置如果操作失误,同样的对业务和用户都有影响。
建议:尽量不要提供对系统会造成严重影响的接口。如果真的需要动态修改数据库配置,尽量保证该数据库所能影响的接口范围最小。
以下是动态修改配置文件的例子:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
public class UpdateProperties {
public static void main(String[] args) throws IOException {
Properties prop = new Properties();
//获取文件输入流
FileInputStream inputFile = new FileInputStream("src/jdbc.properties");
//读取配置文件
prop.load(inputFile);
inputFile.close();
//打印修改前配置信息
System.out.println("" + prop);
//修改配置文件属性(动态修改,可对该方法进行传参)
prop.setProperty("user", "admin2");
prop.setProperty("password", "456");
//获取文件输入流
FileOutputStream outputFile = new FileOutputStream("src/jdbc.properties");
//将修改后的信息保存到配置文件中
prop.store(outputFile, "update jdbc");
outputFile.close();
// 打印修改后配置信息
System.out.println("" + prop);
}
}
首先要确定你要使用什么连接池,Druid 的话是Springmvc有这样的配置的
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<property name="driverClassName">
<value>${jdbc.mysql.driver}</value>
</property>
<property name="url">
<value>${jdbc.mysql.url}</value>
</property>
<property name="username">
<value>${jdbc.mysql.username}</value>
</property>
<property name="password">
<value>${jdbc.mysql.password}</value>
</property>
<!-- 连接池最大使用连接数 -->
<property name="maxActive">
<value>${maxActive}</value>
</property>
<!-- 初始化连接大小 -->
<property name="initialSize">
<value>${initialSize}</value>
com.alibaba.druid.pool.DruidDataSource
这个类extend
了DruidAbstractDateSource
这个类里面有修改账号密码的方法
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
if(!StringUtils.equals(this.password, password)) {
if(this.inited) {
LOG.info("password changed");
}
this.password = password;
}
}
所以说是可以拿到dataSource 修改里面的用户名和密码的
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。