0


JDBC操作达梦数据库

一、JDBC概述

    JDBC(Java DataBase Connectivity)即java数据库连接,它是一种用于执行SQL语句的Java API,是由一组用Java语言编写的类和接口组成,其本质就是java官方提供的一套规范(接口)。用于帮助开发人员快速实现不同关系型数据库的连接;不同的数据库厂商,针对这套接口,提供不同的数据库驱动,即Java实现类;达梦为DM8版本提供的JDBC驱动DmJdbcDriver18.jar,DM7版本对应使用DmJdbcDriver17.jar,DM6版本对应使用DmJdbcDriver16.jar。

二、JDBC操作达梦数据库过程(JDBC3.0标准)

1. 导入驱动包(DmJdbcDriver18.jar)

    DmJdbcDriver18.jar包路径在达梦安装路径的drivers-->jdbc目录下,具体过程可参考博文:

JDBC连接达梦数据库并打印日志_咀个栗子的博客-CSDN博客_jdbc打印日志win10版一、安装JDK1. 下载并运行jdk-8u181-windows-x64.exe ;更改环境变量:在path变量中添加jdk安装路径的bin目录,与jre的bin路径;https://blog.csdn.net/weixin_61894388/article/details/123165703?spm=1001.2014.3001.5502

2. 注册驱动

    注册数据库驱动程序(driver)。可以通过调用 java.sql.DriverManager 类的 registerDriver方法显式注册驱动程序,也可以通过加载数据库驱动程序类隐式注册驱动程序。
//显示注册
DriverManager.registerDriver(new dm.jdbc.driver.dmDriver());
//隐式注册
Class.forName("dm.jdbc.driver.DmDriver");
    隐式注册过程中加载实现了 java.sql.Driver 的类,dm.jdbc.driver.DmDriver 类包含一静态部分,它创建该类的实例。当加载驱动程序时,驱动程序会自动调用 DriverManager.registerDriver 方法向 DriverManager 注册自己。通过调用方法 Class.forName(String str),将显式地加载驱动程序。

3. 创建连接

(1)DriverManager.getConnection方式连接:

// localhost可以是IP或主机名或服务名,logLevel为可选项,可指定JDBC执行日志打印路径;
String cname = "dm.jdbc.driver.DmDriver";
String url = "jdbc:dm://localhost:5236?logLevel=all&logDir=D:\\DBA\\dm8\\jdbclog";
String userid = "SYSDBA";
String pwd = "SYSDBA";
// 加载达梦JDBC驱动:
Class.forName(cname); 
// 连接数据库:
Connection conn = DriverManager.getConnection(url, username, usrpwd);

在多用户共用此代码时,可以选择手动输入连接参数:

// 手动输入连接参数:
@SuppressWarnings("resource")
Scanner sc = new Scanner(System.in);
System.out.print("用户名:");
String username = sc.next();
System.out.print("口令:");
String pwd = sc.next();
System.out.print("主机名|IP:");
String ip = sc.next();
System.out.print("端口号:");
int port = sc.nextInt();
// 定义达梦JDBC驱动:
String cname = "dm.jdbc.driver.DmDriver";
// 定义URL字符串:
String url = "jdbc:dm://"+ip+":"+port+"?logLevel=all&logDir=D:\\DBA\\dm8\\jdbclog";

(2)连接池(dbcp)方式连接:

    dbcp连接池需要另外添加外部jar包commons-dbcp-1.4.jar,导入 org.apache.commons.dbcp.BasicDataSource即可。commons-dbcp-1.4.jar下载链接:https://repo.maven.apache.org/maven2/commons-dbcp/commons-dbcp/1.4/commons-dbcp-1.4.jarhttps://repo.maven.apache.org/maven2/commons-dbcp/commons-dbcp/1.4/commons-dbcp-1.4.jar
@SuppressWarnings("resource")
Scanner sc = new Scanner(System.in);
System.out.print("用户名:");
String username = sc.next();
System.out.print("口令:");
String pwd = sc.next();
System.out.print("主机名|IP:");
String ip = sc.next();
System.out.print("端口号:");
int port = sc.nextInt();

BasicDataSource source = new BasicDataSource();
source.setDriverClassName("dm.jdbc.driver.DmDriver");
source.setUrl("jdbc:dm://"+ip+":"+port+"?logLevel=all&logDir=D:\\DBA\\dm8\\jdbclog");
source.setUsername(username);
source.setPassword(pwd);
// 初始化连接池中的连接个数:
source.setInitialSize(10);
// 最大活动数:
source.setMaxActive(5);
// 获得连接:
Connection connection = source.getConnection();
System.out.println(connection);

4. 执行器发送SQL到数据库执行

    执行器对象用于将 SQL 语句发送到数据库服务器。DM JDBC 提供三种类型的语句对象:Statement,PreparedStatement,CallableStatement。其中这三种执行器接口继承关系是: PreparedStatement 是 Statement的子类,CallableStatement 是 PreparedStatement 的子类。每一种语句对象用来运行特定类型的 SQL 语句。

(1)Statement 对象:

    Statement接口提供了三种执行SQL的方法:executeQuery、executeUpdate和execute。 
  • executeQuery 方法用于产生单个结果集的语句,例如 SELECT 语句。

  • executeUpdat方法e 用于执行INSERT、UPDATE或DELETE语句以及SQL DDL语句,如CREATE TABLE和DROP TABLE。INSERT、UPDATE或DELETE语句的效果是修改表中零行或多行中的一列或多列。executeUpdate返回值是一个整数,表示受影响的行数。对于CREATE TABLE或DROP TABLE等DDL语句,executeUpdate返回值总为零。

  • execute方法 用于执行返回多个结果集、多个更新元组数或二者组合的语句。

      执行语句的三种方法都将关闭所调用的 Statement 对象的当前打开结果集(如果存在),这意味着在重新执行 Statement 对象之前,需要完成对当前 ResultSet 对象的处理。
    
// Statement 对象用来运行简单类型的 SQL 语句,语句中无需指定参数。
Connection conn = DriverManager.getConnection(url, userid, pwd);
Statement stmt = conn.createStatement();
String sqlstr1="CREATE TABLE \"DMJDBC\".\"EMP\" (ID INT,NAME VARCHAR2(12))";
String sqlstr2="TRUNCATE TABLE \"DMJDBC\".\"EMP\";";
String sqlstr3 = "insert into \"DMJDBC\".\"EMP\"(ID,NAME) values(11,'JDBC');"
               + "insert into \"DMJDBC\".\"EMP\"(ID,NAME) values(12,'DM8');"
               + "COMMIT;";
stmt.executeUpdate(sqlstr1);
stmt.execute(sqlstr2);
stmt.execute(sqlstr3);
// 关闭连接:
conn.close();

(2)PreparedStatement对象:

  • PreparedStatement 对象包含已编译的 SQL 语句,语句已经“准备好”;
  • 包含于PreparedStatement对象中的SQL语句可具有一个或多个IN参数。IN参数的值在SQL语句创建时未被指定。相反,该语句为每个IN参数保留一个问号(“?”)作为占位符。每个问号所对应的值必须在该语句执行之前,通过适当的 setXXX 方法来提供。
    由于 PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement 对象。因此,需要多次重复执行的SQL语句经常创建为 PreparedStatement 对象,以提高效率。
     作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能。另外它还添加了一整套方法,用于设置发送给数据库以取代IN参数占位符的值。同时,三种方法execute、executeQuery 和 executeUpdate 能执行设置好参数的语句对象。
String sqlstr = "UPDATE \"DMJDBC\".\"EMP\" SET NAME = ? WHERE ID = ?";
PreparedStatement pstmt = con.prepareStatement(sqlstr);
// 赋值:
cstmt.setString(1,"jdbc");
cstmt.setIn(2,11);
// 或使用setObject方法显式地将输入参数转换为特定的JDBC类型:
// pstmt.setObject(1,"jdbc",java.sql.Types.VARCHAR2);
// pstmt.setObject(2,18,java.sql.Types.INT);
// 执行语句
cstmt.execute();

(3)CallableStatement对象:

    CallableStatement用来运行SQL存储过程。存储过程是数据库中已经存在的SQL语句,它通过名字调用。
     CallableStatement是PreparedStatement的子类。CallableStatement中定义的方法用于处理OUT参数或INOUT参数的输出部分:注册OUT参数的JDBC类型(一般 SQL 类型)、从这些参数中检索结果,或者检查所返回的值是否为JDBC NULL。
String sqlstr2="{CALL DMJDBC.SP_ALTER(?,?)}";            
CallableStatement cstmt = conn.prepareCall(sqlstr2);
// 赋值:
cstmt.setString(1,"jdbc");
cstmt.setString(2,11);
// 执行语句
cstmt.execute();

5. 执行结果的返回

    ResultSet 提供执行 SQL 语句后从数据库返回结果中获取数据的方法。执行SQL语句后数据库返回结果被 JDBC 处理成结果集对象,可以用ResultSet对象的next方法以行为单位进行浏览,用 getXXX 方法取出当前行的某一列的值。
     通过 Statement,PreparedStatement,CallableStatement 三种不同类型的语句进行查询都可以返回 ResultSet 类型的对象。

(1)行和光标:

    ResultSet维护指向其当前数据行的逻辑光标。每调用一次next方法,光标向下移动一行,使其成为当前数据行。

(2)列:

    方法 getXXX 提供了获取当前行中某列值的途径。在每一行内,可按任何次序获取列值。

列名或列号可用于标识要从中获取数据的列。例如,如果 ResultSet 对象 rs 的第二列名为“title”,则下列两种方法都可以获取存储在该列中的值:

String s = rs.getString("title");
String s = rs.getString(2);

将某表中的数据循环读出:

while(rs.next()){
    //获取数据
    int id = rs.getInt(1);
    String name = rs.getString(2);
    int age = rs.getInt(3);
    System.out.println("编号:"+id+",姓名:"+name+",年龄:"+age);
}

三、实战运用

1. JDBC执行DML语句和建表语句

package jdbcdm1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;

public class JDBC_TAB {
    /**
     * @param args the command line arguments
     * @author QIQI
     * @date 20220722
     */
    public static void main(String[] args) {
        String cname = "dm.jdbc.driver.DmDriver";
        String url = "jdbc:dm://192.168.222.221:5236?logLevel=all&logDir=D:\\DBA\\dm8\\jdbclog";
        String userid = "SYSDBA";
        String pwd = "SYSDBA";
        
        try{
            Class.forName(cname); 
            Connection conn = DriverManager.getConnection(url, username, usrpwd);
            Statement stmt = null;            
            stmt = conn.createStatement();
            String sqlstr1="DROP TABLE IF EXISTS DMJDBC.EMP;";
            String sqlstr2="CREATE TABLE DMJDBC.EMP(ID INT,NAME VARCHAR(12),AGE INT)";            
            String sqlstr3="INSERT INTO \"DMJDBC\".\"EMP\" VALUES (12,'JACK',32),(13,'MARY',22),(14,'TOMCAT',NULL);"
                          + "UPDATE \"DMJDBC\".\"EMP\" SET AGE=23 WHERE ID=14;"
                          + "DELETE \"DMJDBC\".\"EMP\" WHERE NAME = 'JACK';"
                          + "COMMIT;";
            String sqlstr4="SELECT * FROM DMJDBC.EMP;";            
            // 执行语句
            stmt.executeUpdate(sqlstr1);
            stmt.executeUpdate(sqlstr2);
            stmt.execute(sqlstr3);
            // 执行查询
            ResultSet rs = stmt.executeQuery(sqlstr4);
            System.out.println("============ 员工信息表 =============");
            while(rs.next()){
                //获取数据
                int id = rs.getInt(1);
                String name = rs.getString(2);
                int age = rs.getInt(3);
                System.out.println("编号:"+id+",姓名:"+name+",年龄:"+age);
                System.out.println("---------------------------------");
            }
            conn.close();
       } catch(Exception e){
            e.printStackTrace();
       }  
    }
}

2. JDBC执行语句语句块

package jdbcdm1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class demo2 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // 代码等待控制台手动输入用户名、口令、主机IP、端口号等等信息:
        @SuppressWarnings("resource")
        Scanner sc = new Scanner(System.in);
        System.out.print("用户名:");
        String username = sc.next();
        System.out.print("口令:");
        String usrpwd = sc.next();
        System.out.print("主机名|IP:");
        String ip = sc.next();
        System.out.print("端口号:");
        int port = sc.nextInt();
        // 定义达梦JDBC驱动:
        String cname = "dm.jdbc.driver.DmDriver";
        // 定义URL字符串:
        String url = "jdbc:dm://"+ip+":"+port+"?logLevel=all&logDir=D:\\DBA\\dm8\\jdbclog";
        
       try{
            Class.forName(cname); 
            Connection conn = DriverManager.getConnection(url, userid, pwd);
            Statement stmt = null;
            
            stmt = conn.createStatement();
            String sqlstr="DECLARE "
                        + "COL1 VARCHAR(50):='ALTER TABLE DMJDBC.EMP ADD OBJ_NAME INT;';"
                        + "COL2 VARCHAR(50):='ALTER TABLE DMJDBC.EMP ADD OBJ_TIME VARCHAR(12);';"
                        + "BEGIN "
                        + "EXECUTE IMMEDIATE COL1;"
                        + "EXECUTE IMMEDIATE COL2;"
                        + "END;";

            stmt.executeUpdate(sqlstr);
            conn.close();
       } catch(Exception e){
            e.printStackTrace();
       }  
    }
}

3. DM JDBC执行存储过程

(1)DM JDBC创建存储过程:

package jdbcdm1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class SP_JDBC {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
       // 代码等待控制台手动输入用户名、口令、主机IP、端口号等等信息:
        @SuppressWarnings("resource")
        Scanner sc = new Scanner(System.in);
        System.out.print("用户名:");
        String username = sc.next();
        System.out.print("口令:");
        String usrpwd = sc.next();
        System.out.print("主机名|IP:");
        String ip = sc.next();
        System.out.print("端口号:");
        int port = sc.nextInt();
        // 定义达梦JDBC驱动:
        String cname = "dm.jdbc.driver.DmDriver";
        // 定义URL字符串:
        String url = "jdbc:dm://"+ip+":"+port+"?logLevel=all&logDir=D:\\DBA\\dm8\\jdbclog";
        
       try{
            Class.forName(cname); 
            Connection conn = DriverManager.getConnection(url, userid, pwd);
            Statement stmt = null;
            
            stmt = conn.createStatement();
            String sqlstr="CREATE OR REPLACE PROCEDURE DMJDBC.SP_ALTER(A IN VARCHAR(12) , B IN VARCHAR(12)) AS " 
                        + "DECLARE "
                        + "COL1 VARCHAR(50):='ALTER TABLE DMJDBC.EMP ADD '||A||' INT;';"
                        + "COL2 VARCHAR(50):='ALTER TABLE DMJDBC.EMP ADD '||B||' VARCHAR(12);';"
                        + "BEGIN "
                        + "EXECUTE IMMEDIATE COL1;"
                        + "EXECUTE IMMEDIATE COL2;"
                        + "END;";

            stmt.executeUpdate(sqlstr);
            conn.close();
       } catch(Exception e){
            e.printStackTrace();
       }  
    }
}

(2)DM JDBC调用存储过程:

package jdbcdm1;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;

public class SP_JDBC_EXEC {
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // 代码等待控制台手动输入用户名、口令、主机IP、端口号等等信息:
        @SuppressWarnings("resource")
        Scanner sc = new Scanner(System.in);
        System.out.print("用户名:");
        String username = sc.next();
        System.out.print("口令:");
        String usrpwd = sc.next();
        System.out.print("主机名|IP:");
        String ip = sc.next();
        System.out.print("端口号:");
        int port = sc.nextInt();
        // 定义达梦JDBC驱动:
        String cname = "dm.jdbc.driver.DmDriver";
        // 定义URL字符串:
        String url = "jdbc:dm://"+ip+":"+port+"?logLevel=all&logDir=D:\\DBA\\dm8\\jdbclog";
        
       try{
            Class.forName(cname); 
            Connection conn = DriverManager.getConnection(url, userid, pwd);
            
            String sqlstr2="{CALL DMJDBC.SP_ALTER(?,?)}";            
            CallableStatement cstmt = conn.prepareCall(sqlstr2);
            // 赋值:
            cstmt.setString(1,"OBJ_NAME");
            cstmt.setString(2,"OBJ_TIME");
            // 执行语句
            cstmt.execute();
            conn.close();
       } catch(Exception e){
            e.printStackTrace();
       }  
    }
}

4. DM JDBC操作大字段

    先在达梦数据库服务端创建表:
-- 创建图片信息表:
CREATE TABLE "DMJDBC"."DMIMAGE"
(
    "PID" INTEGER NOT NULL,
    "PHOTO_NAME" VARCHAR(20) NOT NULL,
    "PHOTO" IMAGE NOT NULL,
    "TXT" TEXT,
    NOT CLUSTER PRIMARY KEY("PID")
) 
STORAGE(ON "TBS", CLUSTERBTR) ;

COMMENT ON TABLE "DMJDBC"."DMIMAGE" IS '图片信息表';
COMMENT ON COLUMN "DMJDBC"."DMIMAGE"."PID" IS '图片ID编号';
COMMENT ON COLUMN "DMJDBC"."DMIMAGE"."PHOTO_NAME" IS '图片名';
COMMENT ON COLUMN "DMJDBC"."DMIMAGE"."PHOTO" IS '图片';
COMMENT ON COLUMN "DMJDBC"."DMIMAGE"."TXT" IS '图片信息介绍';
     在Windows10客户端下载几张图片和几段与对应图片的介绍信息复制粘贴到txt文本,之后通过客户端eclipse工具运行此代码,将图片和文本内容输入数据库
// JDBC 操作大字段入库:
package jdbcdm1;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class DMJDBC_LOB {
    
    @SuppressWarnings({ "unused", "resource" })
    public static void main(String[] args) {
        // TODO code application logic here
        
        String cname = "dm.jdbc.driver.DmDriver";
        String url = "jdbc:dm://192.168.222.221:5236?logLevel=all&logDir=D:\\DBA\\dm8\\jdbclog";
        String userid = "SYSDBA";
        String pwd = "SYSDBA";
        
        Connection conn = null;
        PreparedStatement pstate = null;
        try {
            //1.加载 JDBC 驱动程序
            System.out.println("Loading JDBC Driver...");
            Class.forName(cname);
            //2.连接 DM 数据库
            System.out.println("Connecting to DM Server...");
            conn = DriverManager.getConnection(url, userid, pwd);

            // 插入信息:  
            String sql_insert = "INSERT INTO DMJDBC.DMIMAGE (\"PID\",\"PHOTO_NAME\",\"PHOTO\",\"TXT\")"
                              + "VALUES(?,?,?,?);";
            pstate = conn.prepareStatement(sql_insert);
            // 加载图片为输入流:
            String filePath = "D:\\DBA\\images\\zuiquan2.jpeg";
            File file = new File(filePath);
            String filePath2 = "D:\\DBA\\images\\zuiquan2.txt";
            File file2 = new File(filePath2);
            InputStream img1 = new BufferedInputStream(new FileInputStream(file));
            InputStream txt1 = new BufferedInputStream(new FileInputStream(file));
            BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file2),"UTF-8"));
            
            // 赋值1:
            pstate.setInt(1,01);
            // 赋值2:
            pstate.setString(2,"醉拳2");
            // 绑定InputStream:
            pstate.setBinaryStream(3,img1);
            // 绑定Inputstream:
            pstate.setBlob(4,txt1);
            // 执行语句:
            pstate.executeUpdate();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } finally {
            try {
                pstate.close();
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

5. DM JDBC查询大字段输出至客户端

    将数据库里存储的图片输出到客户端,预先在数据库存入一些图片和图片介绍信息,创建一个SQL脚本:/opt/dm8/image/images.sql,将此SQL脚本导入到数据库。
TRUNCATE TABLE DMJDBC.DMIMAGE;
@INSERT INTO "DMJDBC"."DMIMAGE" VALUES 
(01,'醉拳2',@'/opt/dm8/image/zuiquan2.jpeg','
醉拳2剧情简介
本片讲述的是一代宗师黄飞鸿年少时代一段历险。民初年间,年轻的黄飞鸿(成龙 饰)自学了一套威力无穷的拳法——醉拳。但是每次打出这套拳法,都要先喝得酩酊大醉,利用醉态打破一切武学定律,才能发挥出醉拳的威力。因为这样,黄飞鸿父亲黄麒英严禁儿子练这种有伤风雅、而且违背习武强身法则的拳法。
年少顽皮的飞鸿常常背着父亲在练习醉拳,并以此打败了众多强手。这天,飞鸿和父亲一起上东北办事。半途上,父子俩遇上了一伙外国强盗,他们暗中将国宝玉玺偷运出境。为了阻止这伙强盗、夺回国宝,飞鸿只好使出他的拿手绝活——醉拳!
');
@INSERT INTO "DMJDBC"."DMIMAGE" VALUES 
(02,'醉拳1',@'/opt/dm8/image/zuiquan1.jpeg','
醉拳1是1978在香港上映/播出的一部动作片电影,由成龙,袁小田,黄正利,王憾尘主演,袁和平执导。本站电影频道于2021年11月20日收录高清完整版,并提供免费在线观看服务。
醉拳1剧情:广东武术界名人黄麒英自儿子黄飞鸿小时候起就严格训练其习武,可惜黄飞鸿少年时代年轻气盛,经常用三脚猫功夫在外惹事生非,武学上一直无大的长进直到某次较量中被人打得落花流水且受到侮辱,黄飞鸿才发誓要拜苏乞儿为师好好习武由于苏乞儿懒于收徒,加上对黄飞鸿的人品很不信任,他开出了种种苛刻条件为表决心,黄飞鸿一一应允并努力将它们全都实现,终以真心R30;广东武术界名人黄麒英自儿子黄飞鸿小时候起就严格训练其习武,可惜黄飞鸿少年时代年轻气盛,经常用三脚猫功夫在外惹事生非,武学上一直无大的长进。直到某次较量中被人打得落花流水且受到侮辱,黄飞鸿才发誓要拜苏乞儿为师好好习武。由于苏乞儿懒于收徒,加上对黄飞鸿的人品很不信任,他开出了种种苛刻条件。为表决心,黄飞鸿一一应允并努力将它们全都实现,终以真心将苏乞儿打动,令其将醉拳传授给了他,黄飞鸿渐从一名莽撞的少年成长为一个见义勇为的年轻人。
');
@INSERT INTO "DMJDBC"."DMIMAGE" VALUES 
(04,'大白',@'/opt/dm8/image/dabai.jpeg','
敢问最近几年中最流行、最抢手、最惹人疼爱的私人健康顾问是谁?不用说,当然是《超能陆战队》中的Baymax了!或者你可以叫他大白、胖子、白球恩、白胖胖……这个高大、呆萌、线条简单的气球机器人可是2015年3月份全世界电影观众们的心头宠。他不但让他们在影院笑声连连,回到家里依旧情思捻不断。大白到底是何德何能,捕获了众多影迷的芳心呢?
温柔体贴,关怀备至。他的发明者阿正细心地给予他健壮的身材和无害的表情。还特意选取了恰当的材料,使胖嘟嘟的他看上去就想让人抱一抱。作为私人健康护理的他,有着良好的职业习惯和专业素养。对患者忠心耿耿,无微不至,照顾朋友更是格外贴心。
踏实靠谱,聪明能干。在这方面,大白可谓无可挑剔。
天性纯良,目的单纯,以救死扶伤、保护弱小为己任,没有什么太多的野心和要求,只希望他在乎的人能够对他说上一句“我对你的服务很满意”,另一方面,他又接受了小宏的改造,武装地也是有模有样,一手日本空手道打得干净利落,有板有眼,学起各种技能来更是游刃有余。
品德高尚,坚守底线。大白有着一颗“有理有利有节”的道德心。大白是真善良,无论是刀山还是火海他永远都把朋友保护在自己的怀里。5个湿漉漉的小伙伴抱着大白烤火的样子,实在是温馨。他为了改善小宏的情绪,带小宏飞翔,给予小宏拥抱,成为了小宏亲密无间的朋友,在小宏悲伤时鼓励安慰他。但是他的服从和宠溺也是有底线的——他绝不肯伤害人类。
臂膀坚实,舍己为人。大白证明自己“真爱”的方式更加令人动容,他选择了牺牲自己救助别人。在命悬一线的紧要关头,大白勇敢地放弃了自己,把生还的希望留给了小宏。
总之,他既像一个孩子,天真懵懂,什么都不懂;也像大人一样,默默地接受你,忍让你。
');
@INSERT INTO "DMJDBC"."DMIMAGE" VALUES 
(05,'A计划',@'/opt/dm8/image/Ajihua.jpeg','
上世纪初,猖獗的香港海盗罗三炮屡屡劫持商船,考虑到各国商家的投资信心会因此减少,导致香港国际贸易中心的地位不保,于是香港政府改编水师,成立了水警抵抗海盗并且制定了A计划,但总因为种种原因出击失败。水警警长马如龙(成龙饰)执行公务时遭人陷害,愤而辞职。海盗头目罗三炮(狄威饰)抓走英国将军及其家眷做人质,当局决定利用和海盗有勾结的周永龄从中调停。因为早知周永龄与海盗勾结,马如龙自告奋勇拯救人质,他重组水警并且继续执行A计划,期望通过与上司洪天赐(元彪饰)及好兄弟卓一飞(洪金宝饰)作里应外合,将海盗一网打尽。
');
COMMIT;
EXIT;
SQL> start /opt/dm8/image/images.sql

eclipse执行以下代码,将数据库中的图片和图片介绍信息存放到某个路径下:

// JDBC 查询大字段输出至客户端:
package jdbcdm1;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DMJDBC_LOB_EXPORT {
    public static class DMJDBC_LOB {
        
        public static void main(String[] args) {
            // TODO code application logic here
            String cname = "dm.jdbc.driver.DmDriver";
            String url = "jdbc:dm://192.168.222.221:5236?logLevel=all&logDir=D:\\DBA\\dm8\\jdbclog";
            String userid = "SYSDBA";
            String pwd = "SYSDBA";
            
            Connection conn = null;
            PreparedStatement pstate = null;
            ResultSet rs = null;
            InputStream img = null;
            FileOutputStream fos = null;
            FileOutputStream fos2 = null;
            BufferedReader reader = null;
            try {
                //1.加载 JDBC 驱动程序
                System.out.println("Loading JDBC Driver...");
                Class.forName(cname);
                //2.连接 DM 数据库
                System.out.println("Connecting to DM Server...");
                conn = DriverManager.getConnection(url, userid, pwd);
                
                //3.查询大字段信息 SQL 语句
                String sql_insert = "SELECT * FROM DMJDBC.DMIMAGE;";
                pstate = conn.prepareStatement(sql_insert);
                //4.创建 ResultSet 对象保存查询结果集
                rs = pstate.executeQuery();
                //5.解析结果集
                while(rs.next()) {
                    // 获取第一列 PID 信息:
                    int id = rs.getInt("PID");
                    // 获取第二列 PHOTO_NAME 信息:
                    // String pname = rs.getString("PHOTO_NAME");
                    // 获取第三列 PHOTO 图片信息,并把该图片直接写入到 D:\DBA\images\photo.jpeg;
                    img = rs.getBinaryStream("PHOTO");
                    fos = new FileOutputStream("D:\\DBA\\images\\photo"+id+".jpeg");
                    int num = 0;                    
                    //每次从输入流中读取一个字节数据,如果没读到最后指针向下继续循环
                    while((num=img.read())!=-1) {
                        //将每次读取的字节数据,写入到输出流中
                        fos.write(num);
                    }                    
                    //获取第四列的 Clob 大字段信息
                    //Clob 大字段处理的是字符型大字段信息,文本等数据
                    Clob clob = rs.getClob("TXT");
                    reader = new BufferedReader(clob.getCharacterStream());
                    fos2 = new FileOutputStream("D:\\DBA\\images\\photo"+id+".txt");
                    String str = null;
                    int num2 = 0;
                    while((str=reader.readLine())!=null) {
                        //将每次读取的字节数据
                        System.out.println(str.toString());
                        fos2.write(num2);
                    }
                }
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    //关闭资源
                    fos.close();
                    img.close();
                    rs.close();
                    pstate.close();
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

6. DM JDBC执行SQL脚本:

    将SQL语句写入SQL脚本,JDBC运行SQL脚本,可以实现多条SQL语句集中执行,具体过程可参考博文:

DM JDBC执行SQL脚本_咀个栗子的博客-CSDN博客JDBC(Java DataBase Connectivity)即java数据库连接,它是一种用于执行SQL语句的Java API,是由一组用Java语言编写的类和接口组成,其本质就是java官方提供的一套规范(接口)。用于帮助开发人员快速实现不同关系型数据库的连接;不同的数据库厂商,针对这套接口,提供不同的数据库驱动,即Java实现类;达梦为DM8版本提供的JDBC驱动DmJdbcDriver18.jar,DM7版本对应使用DmJdbcDriver17.jar....https://blog.csdn.net/weixin_61894388/article/details/125983617?spm=1001.2014.3001.5501

更多资讯请上达梦技术社区了解: https://eco.dameng.com

标签: 数据库 dba 大数据

本文转载自: https://blog.csdn.net/weixin_61894388/article/details/125664926
版权归原作者 咀个栗子 所有, 如有侵权,请联系我们删除。

“JDBC操作达梦数据库”的评论:

还没有评论