有任何问题请到技术社区反馈。

24小时免费服务热线:400 991 6599

达梦技术社区:https://eco.dameng.com

1. 介绍

java通过 jni 接口调用dmfldr快速装载接口导数据。

开发环境:CentOS7+DM8(Linux)

2. 准备工作

2.1 java项目引入jar

引入jar com.dameng.floader.jar、 DmJdbcDriver18.jar

我采用的方法是将jar包放到lib目录下.pom文件配置引入路径

    <dependency><groupId>com.dm</groupId><artifactId>DmJdbcDriver18</artifactId><version>18</version><scope>system</scope><systemPath>${project.basedir}/lib/DmJdbcDriver18.jar</systemPath></dependency><dependency><groupId>com.dm</groupId><artifactId>Floader</artifactId><version>1.0</version><scope>system</scope><systemPath>${project.basedir}/lib/com.dameng.floader.jar</systemPath></dependency>

2.2 java项目中引入dll

程序在编译的过程中需要调用DM的一些lib动态链接库文件(运行java项目时需要这些dll)

我采用的方式是在启动类的VM options参数 配置DLL的路径

DM调用的dll在达梦安装目录的三个目录里面都需要引入

// 我的dm安装目录是 D:\damba\dm8 ,需要自行修改称自己的目录
-Djava.library.path=D:\damba\dm8\drivers;D:\damba\dm8\drivers\logmnr;D:\damba\dm8\bin -Dfile.encoding=UTF-8

2.3 创建表

-- 创建表
CREATE TABLE "SYSDBA"."TEST"
(
"C1" INT,
"C2" INT,
"C3" DATE) STORAGE(ON "MAIN", CLUSTERBTR) ;
-- 插入数据
INSERT INTO test VALUES(1, 1 , '2021-09-15');
INSERT INTO test VALUES(2, 2 , '2021-09-16');
INSERT INTO test VALUES(3, 3 , '2021-09-17');
INSERT INTO test VALUES(4, null , '2021-09-18');

3. 代码实战

3.1 导出所有数据

需求:导出表的所有数据

3.1.1 linux

  • 新建 import_start.ctl 文件(新建目录: /dm8/ctl/insert_test)
LOAD DATA
INFILE '/dm8/ctl/insert_test/test.txt'
INTO TABLE test
FIELDS '|'
  • 在dm8的安装目录bin目录下运行dmfldr脚本
./dmfldr userid=SYSDBA/SYSDBA@192.168.60.137:5236 control=\'/dm8/ctl/insert_test/import_start.ctl\' mode=\'out\'
  • 执行成功后会生成test.txt文件

3.1.2 java

package com.dm.demo.jni;
import com.dameng.floader.Instance;
import com.dameng.floader.Properties;import java.io.UnsupportedEncodingException;/*** @author xgt(小光头)* @version 1.0* @date 2021-9-18 11:02*/
public class Import_start {public static void main(String[] args){//System.out.println(System.getProperty("java.library.path"));Instance instance = new Instance();try{//初始化if (instance.allocInstance()){instance.setAttribute(Properties.FLDR_ATTR_SERVER, "192.168.60.137");instance.setAttribute(Properties.FLDR_ATTR_PORT, "5236");instance.setAttribute(Properties.FLDR_ATTR_UID, "SYSDBA");instance.setAttribute(Properties.FLDR_ATTR_PWD, "SYSDBA");instance.initializeInstance(null, null, null, "\"SYSDBA\".\"TEST\"");String attribute = instance.getAttribute(Properties.FLDR_ATTR_DATA_CHAR_SET);String ctl = "OPTIONS\r\n" +"(\r\n" +"mode='out'\r\n" +")\r\n" +"Load\r\n" +"infile 'e:\\fldr_out.txt'\r\n" +"Append\r\n" +"into table \"SYSDBA\".\"TEST\"\r\n" +"FIELDS '|'";//导出的ctrl内容instance.setControl(ctl);}else {try {byte[] bytes = instance.getErrorMsg().getBytes("utf-8");System.out.println(new String(bytes, "utf-8"));} catch (UnsupportedEncodingException e) {e.printStackTrace();}}}catch (Exception e){System.out.println(e);}finally{//释放instance.unitialize();instance.free();}}
}

3.2 导出指定列的数据

需求:导出表的某一些指定列并将显示

3.2.1 linux

  • 新建 import_targe_data.ctl 文件(新建目录: /dm8/ctl/insert_test)
OPTIONS
(
SQL ='select C1 from SYSDBA.TEST'
)
LOAD DATA
INFILE '/dm8/ctl/insert_test/test.txt'
INTO TABLE test
FIELDS '|'
(
C1 TERMINATED BY ' '
)
  • 在dm8的安装目录bin目录下运行dmfldr脚本
./dmfldr userid=SYSDBA/SYSDBA@192.168.60.137:5236 control=\'/dm8/ctl/insert_test/import_targe_data.ctl\' mode=\'out\'

3.2.2 java

package com.dm.demo.jni;
import com.dameng.floader.Instance;
import com.dameng.floader.Properties;import java.io.UnsupportedEncodingException;/*** @author 高垣* @version 1.0* @date 2021-9-18 11:02*/
public class Import_targe_data {public static void main(String[] args){//System.out.println(System.getProperty("java.library.path"));Instance instance = new Instance();try{//初始化if (instance.allocInstance()){instance.setAttribute(Properties.FLDR_ATTR_SERVER, "192.168.60.137");instance.setAttribute(Properties.FLDR_ATTR_PORT, "5236");instance.setAttribute(Properties.FLDR_ATTR_UID, "SYSDBA");instance.setAttribute(Properties.FLDR_ATTR_PWD, "SYSDBA");instance.initializeInstance(null, null, null, "\"SYSDBA\".\"TEST\"");String attribute = instance.getAttribute(Properties.FLDR_ATTR_DATA_CHAR_SET);String ctl = "OPTIONS\r\n" +"(\r\n" +"mode='out'\r\n" +"SQL='select C1 from SYSDBA.TEST'\r\n" +")\r\n" +"Load\r\n" +"infile 'e:\\fldr_out.txt'\r\n" +"Append\r\n" +"into table \"SYSDBA\".\"TEST\"\r\n" +"FIELDS '|'\n" +" (\n" +" C1 TERMINATED BY ' '\n" +" )";//导出的ctrl内容instance.setControl(ctl);}else {try {byte[] bytes = instance.getErrorMsg().getBytes("utf-8");System.out.println(new String(bytes, "utf-8"));} catch (UnsupportedEncodingException e) {e.printStackTrace();}}}catch (Exception e){System.out.println(e);}finally{//释放instance.unitialize();instance.free();}}
}

3.3 导出指定列并修改NULL值

需求:导出指定表的列并将显示NULL的字段修改为其他值

温馨提示:因为在CTL文件中编写语句,存在双引号冲突的问题,使用函数时采用双单引号形式

3.3.1 linux

  • 新建 import_targe_func_data.ctl 文件(新建目录: /dm8/ctl/insert_test)
OPTIONS
(
SQL ='select c1,IFNULL(c2,''1'') c2 from test'
)
LOAD DATA
INFILE '/dm8/ctl/insert_test/test.txt'
INTO TABLE test
FIELDS '|'
(
C1 TERMINATED BY ' ',
C2 TERMINATED BY ' '
)
  • 在dm8的安装目录bin目录下运行dmfldr脚本
./dmfldr userid=SYSDBA/SYSDBA@192.168.60.137:5236 control=\'/dm8/ctl/insert_test/import_targe_func_data.ctl\' mode=\'out\' ./dmfldr userid=SYSDBA/SYSDBA@192.168.60.137:5236 control=\'/dm8/ctl/insert_func/test1/test.ctl\' mode=\'out\' select C1,replace(V1,chr(47),''\'') V1 from test1'

3.3.2 java

package com.dm.demo.jni;
import com.dameng.floader.Instance;
import com.dameng.floader.Properties;import java.io.UnsupportedEncodingException;/*** @author 高垣* @version 1.0* @date 2021-9-18 11:02*/
public class TestFloderImport2 {public static void main(String[] args){Instance instance = new Instance();try{//初始化if (instance.allocInstance()){instance.setAttribute(Properties.FLDR_ATTR_SERVER, "192.168.60.137");instance.setAttribute(Properties.FLDR_ATTR_PORT, "5236");instance.setAttribute(Properties.FLDR_ATTR_UID, "SYSDBA");instance.setAttribute(Properties.FLDR_ATTR_PWD, "SYSDBA");instance.initializeInstance(null, null, null, "\"SYSDBA\".\"TEST\"");String attribute = instance.getAttribute(Properties.FLDR_ATTR_DATA_CHAR_SET);String ctl = "OPTIONS\r\n" +"(\r\n" +"mode='out'\r\n" +"SQL='select c1,IFNULL(c2,''1'') c2 from SYSDBA.TEST'\r\n" +")\r\n" +"Load\r\n" +"infile 'e:\\fldr_out.txt'\r\n" +"Append\r\n" +"into table \"SYSDBA\".\"TEST\"\r\n" +"FIELDS '|'\n" +" (\n" +" C1 TERMINATED BY ' ',\n" +" C2 TERMINATED BY ' '\n" +" )";//导出的ctrl内容instance.setControl(ctl);}else {try {byte[] bytes = instance.getErrorMsg().getBytes("utf-8");System.out.println(new String(bytes, "utf-8"));} catch (UnsupportedEncodingException e) {e.printStackTrace();}}}catch (Exception e){System.out.println(e);}finally{//释放instance.unitialize();instance.free();}}
}

===================================

下面的测试是另外一张表测试附表结构

CREATE TABLE "SYSDBA"."TEST1"
(
"C1" INT,
"V1" VARCHAR(50)) STORAGE(ON "MAIN", CLUSTERBTR) ;insert into "SYSDBA"."TEST1"("C1", "V1") VALUES(1, '11/a');
insert into "SYSDBA"."TEST1"("C1", "V1") VALUES(2, '22/2/2');
insert into "SYSDBA"."TEST1"("C1", "V1") VALUES(3, '33/3//');

3.4 导出数据并使用嵌套函数

OPTIONS
(
SQL ='select C1,replace(V1,chr(47),''\'') V1 from test1'
)
LOAD DATA
INFILE '/dm8/ctl/insert_func/test1/test.txt'
INTO TABLE test1
FIELDS '|'
(
C1 TERMINATED BY ' ',
V1 TERMINATED BY ' '
)
[dmdba@localhost bin]$ ./dmfldr userid=SYSDBA/SYSDBA@192.168.60.137:5236 control=\'/dm8/ctl/insert_func/test1/test1.ctl\' mode=\'out\'

3.5 导出数据并函数嵌套使用char函数

OPTIONS
(
SQL ='select C1,replace(replace(V1,chr(47),chr(41)),chr(41),chr(39)) V1 from test1'
)
LOAD DATA
INFILE '/dm8/ctl/insert_func/test1/test.txt'
INTO TABLE test1
FIELDS '|'
(
C1 TERMINATED BY ' ',
V1 TERMINATED BY ' '
)
[dmdba@localhost bin]$ ./dmfldr userid=SYSDBA/SYSDBA@192.168.60.137:5236 control=\'/dm8/ctl/insert_func/test1/test2.ctl\' mode=\'out\'

3.6 导出数据并函数嵌套+拼接

OPTIONS
(
SQL ='select C1,replace(replace(V1,chr(47),chr(41)),chr(41),chr(39)|| chr(42)) V1 from test1'
)
LOAD DATA
INFILE '/dm8/ctl/insert_func/test1/test.txt'
INTO TABLE test1
FIELDS '|'
(
C1 TERMINATED BY ' ',
V1 TERMINATED BY ' '
)
[dmdba@localhost bin]$ ./dmfldr userid=SYSDBA/SYSDBA@192.168.60.137:5236 control=\'/dm8/ctl/insert_func/test1/test3.ctl\' mode=\'out\'

3.7 导出数据并函数嵌套+替换+拼接

OPTIONS
(
SQL ='select C1,replace(replace(V1,''/'',chr(41)),chr(41),chr(39)|| chr(42)) V1 from test1'
)
LOAD DATA
INFILE '/dm8/ctl/insert_func/test1/test.txt'
INTO TABLE test1
FIELDS '|'
(
C1 TERMINATED BY ' ',
V1 TERMINATED BY ' '
)
[dmdba@localhost bin]$ ./dmfldr userid=SYSDBA/SYSDBA@192.168.60.137:5236 control=\'/dm8/ctl/insert_func/test1/test4.ctl\' mode=\'out\'

4. 常见问题

4.1 指定的列与服务器列不一致


编写的ctl文件中 SQL属性的语句执行后的值与FIELDS属性配置的值不一样导致,修改一下就好

4.2 java.lang.UnsatisfiedLinkError

报错:Exception in thread “main” java.lang.UnsatisfiedLinkError: no dmutl in java.library.path

意思是说:运行项目需要去java.library.path中加载dmutldll然后没找到。我的解决方案是在启动类上配置参数去配置这个DLL所在的文件路径

我采用的方式是在启动类的VM options参数 配置DLL的路径

DM调用的dll在达梦安装目录的三个目录里面都需要引入

// 我的dm安装目录是 D:\damba\dm8 ,需要自行修改称自己的目录
-Djava.library.path=D:\damba\dm8\drivers;D:\damba\dm8\drivers\logmnr;D:\damba\dm8\bin -Dfile.encoding=UTF-8

4.3 项目的资料

链接:https://pan.baidu.com/s/1Gtsbsq_EM25pzWYuBWpVzg 提取码:4hrp

调用DM FLDR JNI导出数据库文件相关推荐

  1. Android模拟器(ADM)打不开/data,无法导出数据库文件

    貌似新版的模拟器都要root才能访问database了,下面方法行不通. 方法一:使用facebook的Stetho 方法二:我选择放弃不看... 1.进入Android/sdk/platform-t ...

  2. php如何对几G的文本数据去重,Linux下导出数据库文件进行统计+去重

    本文主要讲述了如何在Linux中实现数据库文件统计以及去重,感兴趣的朋友可以来学习一下! 1. 把数据库表导出到文本文件中 mysql -h主机 -P端口 -u用户 -p密码 -A 数据库 -e &q ...

  3. 服务器怎么导出数据库文件,怎么导出服务器数据库文件

    怎么导出服务器数据库文件 内容精选 换一换 确认后点击确认即可,导出内容参考表1.选择界面 MongoDB官网提供了针对不同操作系统的客户端安装包,其二进制安装包下载页面链接为:https://www ...

  4. mysql语句导出数据库文件_通过Mysql命令行语句来导入、导出数据库文件

    Mysql命令行导出数据库: 1.首先我们通过命令行进入到mysql安装目录的bin目录下,比如我输入的命令行为: cd C:\Program Files\MySQL\MySQL Server 5.5 ...

  5. 如何在 MySQL / MariaDB 中导入导出数据,导入导出数据库文件、Excel、CSV

    文章目录 本教程将详细讲解 1. MySQL / MariaDB 数据库数据「导出」 2. MySQL / MariaDB 数据库数据「导入」 3. 使用「卡拉云」一键导入导出 MySQL / Mar ...

  6. mysql导入导出数据库文件(转载)

    http://www.cnblogs.com/zcw-ios/articles/3319480.html 在命令行下mysql的数据导出有个很好用命令mysqldump,它的参数有一大把,可以这样查看 ...

  7. cmd命令不识别exp_cmd 命令行exp 命令导出数据库文件

    好处:命令导出的数据库包含了所有比如:表结构,表数据,序列,触发器,表空间等 参考博客:https://www.cnblogs.com/tytr/p/9056690.html1 将数据库TEST完全导 ...

  8. mysql数据库导入sql文件Mysql导入导出.sql文件的方法

    mysql数据库导入sql文件:Mysql导入导出.sql文件的方法 mysql导入sql文件:Mysql导入导出.sql文件 步骤如下: 一.MYSQL的命令行模式的设置: 桌面->我的电脑- ...

  9. java大数据量导出csv文件并压缩

    java大数据量导出csv文件并压缩 java使用POI大数据量导出excel一般会存在以下几个问题: 一次从数据库查询出这么大数据,查询缓慢 查询数据量过大时会内存溢出 解决方案:分页查询数据,比如 ...

最新文章

  1. Android性能优化之运算篇
  2. Java 高级 --- 多线程快速入门
  3. LCS最大公共子序列【转载】
  4. Android 用adb 打印linux内核调试信息dmesg和kmsg命令
  5. CentOS下搭建Squid代理服务器
  6. 故障模块名称kernelbase.dll_西门子PLC数字量DI扩展模块1221一级总代理
  7. python中字典的键必须是可以哈希的对象
  8. 安卓手机关闭底部键盘灯的方法(htc G11亲测有效)
  9. javascript JSON.parse和eval的区别
  10. swift UI专项训练19 TextView 多行文本
  11. linux系统自行清理归档日志_Linux下自动删除归档日志文件的方法
  12. 网络空间安全要学c语言吗,网络空间安全科学与技术(英文)杂志投稿-专门发布期刊官方征稿信息-万维书刊网...
  13. 怎么让拿到的字符串类型的值去掉双引号显示_python入门系列:Python数据类型
  14. 【word】如何在word宏里面写vb代码选中所有表格
  15. 2021-2022-1 线性代数知识点总结
  16. gp数据库和mysql区别_gp数据库(创建表分区)
  17. 很常用的倒计时脚本,可任意设置时…
  18. PMP-项目成本管理
  19. SkeyeVSS智慧渣土可视化管理系统赋能渣土车辆智能化管理
  20. 递归:汉罗塔问题的程序实现

热门文章

  1. Java黑皮书课后题第10章:10.2(BMI类)将下面的新构造方法加入BMI类中
  2. Java黑皮书课后题第6章:**6.24(显示当前日期和时间)程序清单2-7显示当前时间。改进这个例子,显示当前的日期和时间。程序清单6-12中的日历例子可以提供一些如何提供如何求年月日的思路
  3. const_cast的应用
  4. [转载]常用CASE工具介绍
  5. luogu P2512 [HAOI2008]糖果传递
  6. 蓝书3.7 欧拉回路
  7. @Transactional注解事务不回滚不起作用无效
  8. SQL Server加密存储过程的破解
  9. IOS第二天多线程-04简化单例模式
  10. IOS设计模式之四(备忘录模式,命令模式)