编程式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文件一览

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.cgy.code</groupId>
    <artifactId>RmisHelper</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <mybatis.version>3.4.6</mybatis.version>
        <mave.compiler.version>3.7.0</mave.compiler.version>
        <oracle.jdbc.version>11.2.0.3</oracle.jdbc.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>${oracle.jdbc.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${mave.compiler.version}</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>
        </resources>
    </build>
</project>

MAVEN里面<build>标签元素指定了项目编译及使用的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文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 引入配置文件 -->
    <properties resource="jdbc.properties"/>
    <!-- 配置环境,默认为开发环境 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 使用相对于类路径的资源引用 -->
    <mappers>
        <mapper resource="cn/cgy/mapper/HelperMapper.xml"/>
    </mappers>
</configuration>

HelperMapper.xml文件内容

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 如果获取的表是属于当前连接用户,可以省略owner参数,因此SQL工具类只有两个参数 -->
<mapper namespace="cn.cgy.mapper.HelperMapper">
    <select id="qryCreateSqlByName" resultType="java.util.Map">
        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);
        HashMap<String,oracle.sql.CLOB> record = (HashMap<String,oracle.sql.CLOB>)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官网文档

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值