使用 jdbc 实现一个用户访问多个 schema 下的表

一、想实现这样的场景

假设我们在做一个工具,工具有两个模块,一个模块是数据源模块,一个模块是数据查询模块
数据源模块负责配置一些 url,用户名,密码之类的参数,数据查询模块使用这些参数,去查询数据。
假设现在有一个数据库,有好多 schema,每一个 schema 都有可能被查询,这个时候,得要去数据源那边,为每一个 schema 配置一个连接参数。

二、这是我们不想要的,如何优化

可以使用 alter session set current_schema = my_schema 这样的语法,在一个用户中,切换不同的 schema 来查询。

三、实现

先在 oracle 数据库中创建好 game 和 video 用户。
具体的创建过程,可以参考我之前写的这篇:

oracle user 和 schema 的区别

在 video 用户中,把 my_video 表的查询权限给了 game 用户。
game 用户直接 select * from video.my_video 是可以查询的。

然后也可以执行一下 alter session set current_schema=video,

就可以直接使用 select * from my_video 查询了,但是此时是不能查询 my_game 表的,因为当前 schema 已经变了。

所以可以使用这个原理,就可以在数据源那边配置一个连接,
数据查询模块这边,选择 schema,然后 再选择 每个 schema 的表,去查询就可以了。

四、具体代码

package com.dsj361.oracleJdbc;


import java.sql.*;

/**
 * @Author wangkai
 * @Time 2020/11/28 15:49
 */
public class OracleJdbcTest {
    
    

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
    
    
        Class.forName("oracle.jdbc.driver.OracleDriver");
        // 以 game 用户登录
        Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@//192.168.56.10:1521/helowin","game","game");

        PreparedStatement ps1 = connection.prepareStatement("alter session set current_schema=video");
        ps1.executeUpdate();

        // 尝试查询 video 用户下的 my_video 表
        PreparedStatement ps = connection.prepareStatement("select * from my_video");
        ResultSet rs = ps.executeQuery();
        while (rs.next()) {
    
    
//            int id = rs.getInt(1);
//            System.out.println("id,"+id);
            String game = rs.getString(1);
            System.out.println("game:"+game);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_24434251/article/details/110286607