开发者社区> 问答> 正文

使用MyBatis能否动态修改数据库连接的密码

在使用Mybatis和Spring进行数据库操作时,我们通常将数据库连接的信息(url、用户名、密码等)配置到jdbc.properties里面。通过Spring加载这些信息,建立数据源。Mybatis的mapper使用数据源提供的数据库连接来访问数据库。
这种情况下,数据库的url、用户名、密码是提前配置好的,不能修改的,并且在服务器启动时就读取(通过Spring)了。
那么,有没有可能在运行期间,通过Java代码动态的修改用来进行数据库连接的用户名和密码信息。
比如,我在jdbc.properties里面配置的是:admin/123,但是运行期间外界给我传来一个新的数据库用户和密码:admin2/456,那么我能不能动态地将后续的数据库连接的用户名密码改成admin2/456?

展开
收起
蛮大人123 2016-03-11 15:37:13 8412 0
2 条回答
写回答
取消 提交回答
  • 主要从事 Java 后端开发。

    不建议通过动态修改数据库的连接配置。
    首先,动态修改数据库配置必将造成正在使用的系统无法正常运行,这会对公司的业务以及正在使用系统的用户造成很大的影响,会给公司造成损失。
    其次,动态修改数据库配置如果操作失误,同样的对业务和用户都有影响。
    建议:尽量不要提供对系统会造成严重影响的接口。如果真的需要动态修改数据库配置,尽量保证该数据库所能影响的接口范围最小。

    以下是动态修改配置文件的例子:

    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);
        }
    }
    
    2019-07-17 18:59:24
    赞同 展开评论 打赏
  • 我说我不帅他们就打我,还说我虚伪

    首先要确定你要使用什么连接池,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 这个类extendDruidAbstractDateSource 这个类里面有修改账号密码的方法

     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 修改里面的用户名和密码的

    2019-07-17 18:59:24
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
阿里云&信通院《Serverless数据库技术研究报告》 立即下载
DTCC 2022大会集锦《云原生一站式数据库技术与实践》 立即下载
Java Spring Boot开发实战系列课程【第6讲】:Spring Boot 2.0实战MyBatis与优化(Java面试题) 立即下载