一、想实现这样的场景
假设我们在做一个工具,工具有两个模块,一个模块是数据源模块,一个模块是数据查询模块。
数据源模块负责配置一些 url,用户名,密码之类的参数,数据查询模块使用这些参数,去查询数据。
假设现在有一个数据库,有好多 schema,每一个 schema 都有可能被查询,这个时候,得要去数据源那边,为每一个 schema 配置一个连接参数。
二、这是我们不想要的,如何优化
可以使用 alter session set current_schema = my_schema 这样的语法,在一个用户中,切换不同的 schema 来查询。
三、实现
先在 oracle 数据库中创建好 game 和 video 用户。
具体的创建过程,可以参考我之前写的这篇:
在 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);
}
}
}