Oracle : 数据库操作工具类

这段代码展示了一个Java类,实现了Oracle数据库操作,包括获取数据源、检查用户是否存在、创建新用户(schema)、在新用户下执行DDL语句以及权限验证。类中使用JdbcTemplate进行数据库交互,并处理了相关异常。
摘要由CSDN通过智能技术生成

这段代码是一个Oracle数据库操作的实现类,实现了一个接口,具体功能是在Oracle数据库中创建新用户(schema),并将指定的DDL语句在该用户下执行。

public class OracleDatabaseStrategy {

    private static final Logger logger = LoggerFactory.getLogger(OracleDatabaseStrategy.class);

	public JdbcTemplate getDataSource(Resource resource) {
		String url = String.format("jdbc:oracle:thin:@%s:%s/%s", resource.getIp(), resource.getPort(), resource.getDatabaseName());
		String driver = resource.getDriverClassName();
		String userName = resource.getUsername();
		String password = resource.getPassword();
		DataSource dataSource = DBSUtil.getDataSource(url, driver, userName, password);
		JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
		jdbcTemplate.getDataSource().getConnection().setAutoCommit(false);
		return jdbcTemplate;
	}

	public boolean schemaIsExist(JdbcTemplate jdbcTemplate, String databaseName) {
		String sql = String.format("SELECT USERNAME FROM SYS.DBA_USERS WHERE USERNAME = '%s'", databaseName);
		try {
			List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
			for (Map<String, Object> next : maps) {
				String SCHEMA_NAME = next.get("USERNAME").toString();
				if (databaseName.equalsIgnoreCase(SCHEMA_NAME)){
					return true;
				}
			}
		} catch (Exception e) {
			String logStr = String.format("queryForList fail. databaseName:%s. ExceptionMessage:%s. ", databaseName, e.getMessage());
			logger.error(logStr);
			throw new BasicException("500", logStr, logStr);
		}
		return false;
	}

    public boolean createScheme(JdbcTemplate jdbcTemplate, String databaseName, Resource resource) {
        List<String> sqlList = new ArrayList<>();
        sqlList.add(String.format("CREATE USER %s IDENTIFIED BY %s", databaseName, databaseName));
        if (!tableSpaceIsExist(jdbcTemplate, databaseName)) {
            sqlList.add(String.format("CREATE TABLESPACE %s DATAFILE '\\opt\\oracledbf\\%s.dbf' SIZE 512m", databaseName, databaseName));
            sqlList.add(String.format("ALTER DATABASE DATAFILE '\\opt\\oracledbf\\%s.dbf' AUTOEXTEND ON MAXSIZE %s", databaseName, resource.getCapacitySize()));
        }
        sqlList.add(String.format("ALTER USER %s DEFAULT TABLESPACE %s", databaseName, databaseName));
        sqlList.add(String.format("GRANT CREATE SESSION, CREATE TABLE, UNLIMITED TABLESPACE TO %s", databaseName));
        try {
            jdbcTemplate.batchUpdate(sqlList.toArray(new String[0]));
            return true;
        } catch (Exception e) {
            String logStr = String.format("createScheme fail. databaseName:%s. ExceptionMessage:%s. ", databaseName, e.getMessage());
            logger.error(logStr);
            throw new BasicException("500", logStr, logStr);
        }
    }

    @Override
    public boolean execSQLBySchema(JdbcTemplate jdbcTemplate, String context, String databaseName, boolean assignFlag) {
        String sql = String.format("ALTER SESSION SET CURRENT_SCHEMA=%s;%n%s", databaseName, context);
        try (BufferedReader bufReader = new BufferedReader(new StringReader(sql))) {
            StringBuilder curTableSQL = new StringBuilder();
            while (true) {
                String line = bufReader.readLine();
                if (line == null) {
                    break;
                }
                curTableSQL.append(line);
                if (!line.contains(";;") && line.contains(";") && line.endsWith(";")) {
                    String curSql = curTableSQL.toString().trim();
                    jdbcTemplate.update(curSql.substring(0, curSql.length() - 1));
                    curTableSQL.setLength(0);
                } else {
                    curTableSQL.append("\n");
                }
            }
            return true;
        } catch (Exception e) {
            String logStr = String.format("execSQLBySchema fail. databaseName:%s. ExceptionMessage:%s. ", databaseName, e.getMessage());
            logger.error(logStr);
            throw new BasicException("500", logStr, logStr);
        }
    }

    @Override
    public boolean tableSpaceIsExist(JdbcTemplate jdbcTemplate, String tableSpaceName) {
        String sql = String.format("SELECT TABLESPACE_NAME FROM DBA_TABLESPACES WHERE UPPER(TABLESPACE_NAME) = UPPER('%s')", tableSpaceName);
        try {
            return jdbcTemplate.queryForObject(sql, String.class) != null;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    @Override
    public boolean verifyPermissions(JdbcTemplate jdbcTemplate, String username) {
        String sql = "SELECT COUNT(*) AS RESULT FROM SESSION_PRIVS WHERE PRIVILEGE IN ('CREATE USER', 'CREATE TABLESPACE')";
        try {
            return jdbcTemplate.queryForObject(sql, Integer.class) == 2;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}

这份文档提供了一个Oracle数据库操作的实现类,包含以下方法:

  • getDataSource(Resource resource)

该方法用于获取Oracle数据库的数据源并使用JdbcTemplate封装该数据源,返回一个JdbcTemplate对象。参数resource表示要连接的数据库的配置信息。

  • schemaIsExist(JdbcTemplate jdbcTemplate, String schemaName)

该方法用于查询Oracle数据库中是否存在指定名称的用户(schema),查询SQL语句为SELECT USERNAME FROM SYS.DBA_USERS WHERE USERNAME = 'schemaName'。如果存在该用户,则返回true,否则返回false。

  • createScheme(JdbcTemplate jdbcTemplate, String schemaName, Resource resource)

该方法用于在Oracle数据库中创建一个新用户。具体实现分为以下步骤:

a) 创建新用户:SQL语句为CREATE USER schemaName IDENTIFIED BY schemaName

b) 检查是否存在指定名称的表空间,如果不存在则创建表空间,并将该表空间授权给新用户。

c) 授权新用户的权限:SQL语句为grant create session,create table,unlimited tablespace to schemaName

该方法返回一个boolean类型的值,表示创建新用户是否成功。

  • execSQLBySchema(JdbcTemplate jdbcTemplate, String context, String schemaName, boolean assignFlag)

该方法用于在指定的用户下执行DDL语句。将DDL语句分割成多个独立的SQL语句,并逐一执行。SQL语句的执行需要在特定的用户下进行,使用SQL语句ALTER SESSION SET CURRENT_SCHEMA=schemaName将当前会话的默认用户设置为指定的用户。然后将DDL语句逐一执行,执行时需要注意SQL语句的格式,需要将多行的SQL语句拼接成一行,并用分号(;)分割。如果DDL语句执行成功,则返回true,否则返回false。

该方法使用的SQL语句包括:

a) SELECT USERNAME FROM SYS.DBA_USERS WHERE USERNAME = 'schemaName'

b) CREATE USER schemaName IDENTIFIED BY schemaName

c) create tablespace schemaName datafile '\opt\oracledbf\schemaName.dbf' size 512m

d) ALTER DATABASE DATAFILE '\opt\oracledbf\schemaName.dbf' AUTOEXTEND ON MAXSIZE capacitySize

e) alter user schemaName default tablespace schemaName

f) grant create session,create table,unlimited tablespace to schemaName

g) ALTER SESSION SET CURRENT_SCHEMA=schemaName

这个工具类提供了创建新用户以及在该用户下执行DDL语句的功能,方便Oracle数据库的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值