草庐IT

JDBC操作达梦数据库

咀个栗子 2023-06-01 原文

目录

一、JDBC概述

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

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

2. 注册驱动

3. 创建连接

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

 5. 执行结果的返回

三、实战运用

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

2. JDBC执行语句语句块

3. DM JDBC执行存储过程

4. DM JDBC操作大字段

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

6. DM JDBC执行SQL脚本:


 

一、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

有关JDBC操作达梦数据库的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  3. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  4. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  5. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  6. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  7. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  8. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  9. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

  10. 微信小程序通过字典表匹配对应数据 - 2

    前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立

随机推荐