oracle建表语句string,编程式Mybatis获取oracle表创建表语句
写在前面
Mybatis之前使用过一段时间,当然只是粗糙地使用,而且配合Spring有一部分Mybatis管理的内容都交给了Spring,加上一段时间没用到又开始忘了,刚好今天碰到一个要求,Oracle的A库的若干表需要在B库里面创建出来,看上去是挺简单地,通过plsqldeveloper往表名上右键就可以很快查看创建表的DDL语句,或者导出用户对象也是可以。但是由于某些原因,现在需要获取目标表的CREATE语句再到B库执行。假如需要创建的表有几十上百个,这样子一个个右键查看复制就很繁琐,导出用户对象也要在列表找好久,因此刚好借着mybatis来实现获取表CREATE语句保存为SQL文件。这次选择编程式来使用mybatis,不与Spring搭配使用。
(1)首先Oracle本身提供了工具包来获取某一个表的创建表语句
SELECT DBMS_METADATA.GET_DDL('TABLE', 'YOUR_TABLE_NAME','TABLE_OWNER') CREATE_STR FROM DUAL
有了该基础就可以通过Mybatis查询某一个用户下所属表的CREATE语句。
接下来就是着手Mybatis的环境搭建,使用maven来整。
项目大体结构
pom.xml文件一览
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0modelVersion>
cn.cgy.codegroupId>
RmisHelperartifactId>
1.0-SNAPSHOTversion>
3.4.6mybatis.version>
3.7.0mave.compiler.version>
11.2.0.3oracle.jdbc.version>
properties>
org.mybatisgroupId>
mybatisartifactId>
${mybatis.version}version>
dependency>
com.oraclegroupId>
ojdbc6artifactId>
${oracle.jdbc.version}version>
dependency>
dependencies>
org.apache.maven.pluginsgroupId>
maven-compiler-pluginartifactId>
${mave.compiler.version}version>
1.8source>
1.8target>
configuration>
plugin>
plugins>
src/main/javadirectory>
**/*.xmlinclude>
includes>
resource>
src/main/resourcesdirectory>
**/*.xmlinclude>
**/*.propertiesinclude>
includes>
resource>
resources>
build>
project>
MAVEN里面标签元素指定了项目编译及使用的JDK环境为1.8,同时指定MAVEN打包时包含src/main/java下所有xml文件,src/main/resources下所有xml及properties文件,这是为了防止Mybatis的mapper文件没有被找到而出现FileNotFound错误。
Maven里面内容不多,依赖了mybatis核心jar包及oracle驱动jar(由于某些原因,maven现在貌似不提供oracle驱动包,但是oracle驱动jar包是可以在oracle环境下找到的,一般路径为oracle_home/jdbc/lib/ojdbcx.jar,你可以将该jar包弄到本地仓库中,这样子往后就能继续以maven方式引入而不用手动添加jar包依赖)。
jdbc.properties属性文件
driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@your_ip:1521:orcl
username=your_username
password=your_password
mybatis-config.xml文件
dataSource>
environment>
environments>
mappers>
configuration>
HelperMapper.xml文件内容
SELECT DBMS_METADATA.GET_DDL('TABLE', #{tableName}) CREATE_STR FROM DUAL
select>
mapper>
MyDbHelper.java内容
/**
* 获取数据库表的CREATE语句
*@author CGYDAWN
*@date 2018-09-12
*/
public class MyDbHelper {
private static SqlSession session;
private static final String TARGET_PATH = System.getProperty("user.dir")+File.separator+"config"+File.separator+"target"+File.separator;
public MyDbHelper() {
String resource = "mybatis-config.xml";
try (InputStream is = Resources.getResourceAsStream(resource)) {
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
session = sqlSessionFactory.openSession();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 生成一个数据表的SQL文件
*
*@param rptName
*/
private void generateOneTblCreateSql(String rptName) throws Exception {
oracle.sql.CLOB createSqlStr = getCreateSqlStr(tableName);
String createSql = sqlClob2String(createSqlStr,tableName);
generateFile(createSql,tableName);
}
/**
* 获取查询结果
*@param tableName
*@return
*/
private oracle.sql.CLOB getCreateSqlStr(String tableName) {
ArrayList tableList = (ArrayList) session.selectList("cn.cgy.mapper.HelperMapper.qryCreateSqlByName",tableName);
HashMaprecord = (HashMap)tableList.get(0);
return record.get("CREATE_STR");
}
/**
* CLOB类型转为String
*@param clob clob对象
*@param tableName 表名
*@return 建表语句
*@throws Exception
*/
private String sqlClob2String(oracle.sql.CLOB clob,String tableName) throws Exception {
Reader reader = clob.getCharacterStream();
BufferedReader br = new BufferedReader(reader);
String s = br.readLine();
StringBuffer sb = new StringBuffer();
int i = 0;
while(s != null) {
//多余部分丢弃,保留字段部分(该部分视乎实际获取的内容修改)
if(s.indexOf("CONSTRAINT")!=-1) {
break;
}
//丢弃带有用户名的 CREATE TABLE "USER".TABLENAME这一行,改为 CREATE TABLE TABLENAME
else if(s.indexOf(tableName)!=-1){
sb.append("CREATE TABLE "+tableName);
sb.append("\n");
s = br.readLine();
} else {
sb.append(s);
sb.append("\n");
s = br.readLine();
}
}
String rawStr = sb.toString();
String newStr = rawStr.substring(0,rawStr.lastIndexOf(","));
return newStr+"\n"+")";
}
/**
* SQL语句保存.sql文件
*@param createSql CREATE语句
*@param tableName 表名
*@throws Exception
*/
private void generateFile(String createSql,String tableName) throws Exception {
File file = new File(TARGET_PATH+tableName+".sql");
FileOutputStream fos = new FileOutputStream(file);
fos.write(createSql.getBytes());
fos.close();
}
public static void main(String[] args) throws Exception {
MyDbHelper helper = new MyDbHelper();
//如果需要批量获取创表语句,循环调用下面方法即可
helper.generateOneTblCreateSql("YOUR_TABLE_NAME");
}
}
运行main方法后,代码将通过mybatis来获取创建表语句,然后经过一些字符串处理,丢弃一些不太需要的语句部分,保留下纯净的CREATE语句,当然如果需要主键之类的部分则可以进一步修改,视乎具体需要。最后生成的文件保存在项目config/target目录下。
生成好sql文件后,可以在plsqldeveloper下一次性将所有sql文件执行,达到一次性创建表的要求,省时省力。具体方法可以看我这篇文章Oracle plsqldeveloper中一次执行多个SQL脚本
参考资料
Mybatis官网文档
oracle建表语句string,编程式Mybatis获取oracle表创建表语句相关推荐
- mybatis获取oracle xmltype_Mybatis【入门】
什么是MyBatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为 ...
- oracle sqlplus 创建表,如何使用SQL语言在SQL*Plus中创建表
在Oracle中,通常通过两种方法来创建,一种方法是使用OEM图形化管理工具来创建,另一种方法是在SQL*Plus中执行SQL语句来实现. 这里主要说用SQL语句创建. 使用SQL*Plus语句创建表 ...
- mysql创建表的时候日期给个默认值_mysql 创建表时 日期字段默认值为当前时间...
mysql 创建表时 日期字段默认值为当前时间 mysql version 5.1 在mysql创建表的时候经常会遇到创建日期字段需要设置当前时间为默认值的时候,就如sqlserver2000一样,把 ...
- sqlserver 2008修改数据库表的时候错误提示“阻止保存要求重新创建表的更改”...
当用户在在SQL Server 2008企业管理器中更改表结构时,必须要先删除原来的表,然后重新创建新表,才能完成表的更改,如果强行更改会出现以下提示:不允许保存更改.您所做的更改要求删除并重新创建以 ...
- sqlserver设计表不允许保存更改,阻止保存要求重新创建表的更改
sqlserver修改数据库表结构时提示[不允许保存更改.您所做的更改要求删除并重新创建以下表.您对无法重新创建的标进行了更改或者启用了"阻止保存要求重新创建表的更改"选项.] 处 ...
- php中如何上传非表单类数据,PHP Post获取不到非表单数据的问题解决办法
问题描述 在使用vue-axios向后端post数据时,PHP端获取不到post的数据. 问题解决 修改php.ini配置 找到php.ini配置文件,查找enable_post_data_readi ...
- oracle建表语句空间,oracle建表空间语句
一.能帮我解释一下oracle创建表空间的语句吗 1. 创建表空间,名称为db_name; 2. 表空间有一个数据文件*.dbf,大小为200MB; 3. 允许表空间自动扩展(autoextends) ...
- Oracle创建表语句(Create table)语法详解及示例
Oracle创建表语句(Create table)语法详解及示例 创建表(Create table)语法详解 1. ORACLE常用的字段类型ORACLE常用的字段类型有 VARCHAR2 (si ...
- oracle建表加compress,oracle 建表后添加表注释及字段注释
oracle添加表注释和表字段注释 创建Oracle数据库表时候加上注释 CREATE TABLE t1( id varchar2(32) primary key, name VARCHAR2(8) ...
最新文章
- promise实现多个请求并行串行执行
- 计算机设计大赛颁奖典礼主持稿的串词,比赛颁奖典礼主持词
- 全面探索 FreeMarker 模版引擎的扩展性
- C 线程的使用~(下)
- 漫画:8年估值千亿美金的字节跳动是如何修炼的
- sendmail邮件服务器的基本建立过程
- 深度学习中的梯度下降算法
- 苹果和FBI出庭日期延后
- 基于SSM的课设管理小程序源码(课程设计源码)
- Android应用市场应用转让申请流程
- 隐藏文件的查看(Win/Linux/macOS)
- 大一下学期第十一周及以前学习总结
- 人脸识别之人脸对齐(一)--定义及作用
- c语言标识首字母不能是,c语言的标识符由哪字符组成
- 【深度学习 项目实战】Keras深度学习多变量时间序列预测的LSTM模型
- Alpha 测试与 Beta 测试:有什么区别?
- 通信原理实验 多径传播 MATLAB仿真
- mobaxterm ssh密匙 登录被拒绝:server refused our key
- 最新最全的免费股票数据接口--沪深A股基本面数据API接口(四)
- iphone开发前景