Fork me on GitHub

JDBC 方式操作 达梦数据库

JDBC 方式操作 达梦数据库


 

一、启动达梦数据库

本篇博客以访问本地达梦数据库(DM8)为基础进行演示。(前提:本地已经安装了 DM8 数据库!)

关于 Windows 安装达梦数据库,请参考博客:Windows 安装 达梦数据库

关于 Docker 安装达梦数据库,请参考博客:Docker 安装 达梦数据库

关于 JDBC 方式操作达梦数据库,请参考博客:JDBC 方式操作 达梦数据库

关于 MyBatis Plus 操作达梦数据库,请参考博客:MyBatis Plus 操作 达梦数据库

关于 Spring 操作达梦数据库,请参考博客:Spring 操作 达梦数据库

关于 SpringBoot MyBatis Plus 整合达梦数据库,请参考博客:SpringBoot MyBatis Plus 整合 达梦数据库

 

1、启动达梦数据库

搜索“DM服务查看器”,启动“DmServiceDMSERVER

 

2、客户端连接达梦数据库

搜索“DM管理工具”,连接本地数据库,密码:SYSDBA

 

以表 PRODUCTION.PRODUCT_CATEGORY 为例,表数据展示如下:

右键点击表,“浏览数据”即可查看数据:

 

 

二、JDBC 操作 达梦数据库

1、连接达梦数据库

1)准备达梦数据库 JDBC 驱动包

https://eco.dameng.com/download/ 中下载 达梦JDBC 驱动包,如下:

 

2)将 达梦 JDBC 驱动添加到 lib 中

JDK 1.8 对应的 驱动包为:DmJdbcDriver18.jar

 

 

Project Struture --> Project Settings --> Libararies --> +(添加),引入 lib 目录下的 DmJdbcDriver18.jar

 

3)Java程序

package com.miracle.dameng;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DM_jdbc_conn {
    static Connection con = null;
    static String cname = "dm.jdbc.driver.DmDriver";
    static String url = "jdbc:dm://localhost:5236";
    static String userid = "SYSDBA";
    static String pwd = "SYSDBA";

    public static void main(String[] args) {
        try {
            Class.forName(cname);
            con = DriverManager.getConnection(url, userid, pwd);
            con.setAutoCommit(true);
            System.out.println("[SUCCESS] connect database");
        } catch (Exception e) {
            System.out.println("[FAIL] connect database: " + e.getMessage());
        } finally {
            try {
                disConn(con);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void disConn(Connection con) throws SQLException {
        if (con != null) {
            con.close();
        }
    }
}

 

4)运行结果

 

2、JDBC 基本操作(增、删、改、查)

1)Java程序

package com.miracle.dameng;

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

public class DM_jdbc_operate {
    // 定义 DM JDBC 驱动串
    static String jdbcString = "dm.jdbc.driver.DmDriver";
    // 定义 DM URL 连接串
    static String urlString = "jdbc:dm://localhost:5236";
    // 定义连接用户名
    static String userName = "SYSDBA";
    // 定义连接用户口令
    static String password = "SYSDBA";
    // 定义连接对象
    static Connection conn = null;
    // 定义 SQL 语句执行对象
    static Statement state = null;
    // 定义结果集对象
    static ResultSet rs = null;

    public static void main(String[] args) {
        try {
            //1.加载 JDBC 驱动程序
            System.out.println("Loading JDBC Driver...");
            Class.forName(jdbcString);
            //2.连接 DM 数据库
            System.out.println("Connecting to DM Server...");
            conn = DriverManager.getConnection(urlString, userName, password);
            //3.通过连接对象创建 java.sql.Statement 对象
            state = conn.createStatement();
//-----------------------------------------------------------------------------
            //基础操作:此处对应的操作代码为示例库中 PRODUCTION 模式中的
            //PRODUCT_CATEGORY 表
            //增加
            //定义增加的 SQL 这里由于此表中的结构为主键,自增,只需插入 name 列的值
            String sql_insert = "insert into PRODUCTION.PRODUCT_CATEGORY(name) values('厨艺')";
            //执行添加的 SQL 语句
            state.execute(sql_insert);
            //删除
            //定义删除的 SQL 语句
//            String sql_delete = "delete from PRODUCTION.PRODUCT_CATEGORY where name = '厨艺'";
            //执行删除的 SQL 语句
//            state.execute(sql_delete);
            //修改
            String sql_update = "update PRODUCTION.PRODUCT_CATEGORY set name = '国学' where name = '文学'";
            //查询表中数据
            //定义查询 SQL
            String sql_selectAll = "select * from PRODUCTION.PRODUCT_CATEGORY";
            //执行查询的 SQL 语句
            rs = state.executeQuery(sql_selectAll);
            displayResultSet(rs);
//----------------------------------------------------------------------------
            state.executeUpdate(sql_update);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                //关闭资源
                rs.close();
                state.close();
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    //显示结果集
    public static void displayResultSet(ResultSet rs) throws SQLException {
        while (rs.next()) {
            int i = 1;
            Object id = rs.getObject(i++);
            Object name = rs.getObject(i++);
            System.out.println(id + "  " + name);
        }
    }
}

 

2)运行效果

 

3)数据表数据

 

3、绑定变量

1)Java 程序

package com.miracle.dameng;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class DM_jdbc_prepareStatement {
    // 定义 DM JDBC 驱动串
    static String jdbcString = "dm.jdbc.driver.DmDriver";
    // 定义 DM URL 连接串
    static String urlString = "jdbc:dm://localhost:5236";
    // 定义连接用户名
    static String userName = "SYSDBA";
    // 定义连接用户口令
    static String password = "SYSDBA";
    // 定义连接对象
    static Connection conn = null;
    // 定义 SQL 语句执行对象
    static PreparedStatement pstate = null;

    public static void main(String[] args) {
        try {
            //1.加载 JDBC 驱动程序
            System.out.println("Loading JDBC Driver...");
            Class.forName(jdbcString);
            //2.连接 DM 数据库
            System.out.println("Connecting to DM Server...");
            conn = DriverManager.getConnection(urlString, userName, password);
//------------------------------------------------------------------------------------------------------------------------------
            //绑定操作:此处操作对应的数据库,为示例库中的 PRODUCTION 模式中的
            //PRODUCT_CATEGORY 表
            //根据指定 id 修改 PRODUCT_CATEGORY 表中的 name 的值
            //这里 name 和 id 不确认用?代替
            String sql_updateNameById = "update PRODUCTION.PRODUCT_CATEGORY set name = ? where PRODUCT_CATEGORYID = ? ";
            //3.通过连接对象和修改语句的模板,创建 java.sql.PreparedStatement 对象
            pstate = conn.prepareStatement(sql_updateNameById);
            //4.绑定?对应的参数:理论上有多少个?就要绑定多少个值;
            //把 id 为 3 所对应的 name 值修改为 "天文"
            pstate.setString(1, "天文");
            pstate.setInt(2, 3);
            //5. 执行 SQL 语句
            pstate.executeUpdate();
//------------------------------------------------------------------------------------------------------------------------------
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                pstate.close();
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

 

2)数据库数据

 

4、插入大字段数据(图片、文档等)

1)创建包含大字段的数据表

CREATE TABLE "PRODUCTION"."BIG_DATA"
(
"ID" INT IDENTITY(1, 1) NOT NULL,
"PHOTO" IMAGE,
"DESCRIBE" BLOB,
"TXT" CLOB,
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "BOOKSHOP", CLUSTERBTR) ;

 

2)准备图片、文档

在 D 盘根目录下,创建 DM8特点.jpg达梦产品简介.txt 两个文件,作为大字段存储,如下图所示:

(说明:图片和文档,自己可以根据实际情况进行替换,此处仅作为示例。)

 

3)Java 程序

往数据表 PRODUCTION.BIG_DATA 中写入数据

//1.插入大字段信息:  
package com.miracle.dameng;

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.nio.charset.StandardCharsets;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class DM_jdbc_operate_bigData {
    // 定义 DM JDBC 驱动串
    static String jdbcString = "dm.jdbc.driver.DmDriver";
    // 定义 DM URL 连接串
    static String urlString = "jdbc:dm://localhost:5236";
    // 定义连接用户名
    static String userName = "SYSDBA";
    // 定义连接用户口令
    static String password = "SYSDBA";
    // 定义连接对象
    static Connection conn = null;
    // 定义 SQL 语句执行对象
    static PreparedStatement pstate = null;

    public static void main(String[] args) {
        try {
            //1.加载 JDBC 驱动程序
            System.out.println("Loading JDBC Driver...");
            Class.forName(jdbcString);
            //2.连接 DM 数据库
            System.out.println("Connecting to DM Server...");
            conn = DriverManager.getConnection(urlString, userName, password);
//------------------------------------------------------------------------------------------------------------------------
            //1.插入大字段信息:
            String sql_insert = "INSERT INTO PRODUCTION.BIG_DATA (photo, describe, txt)VALUES(?,?,?);";
            pstate = conn.prepareStatement(sql_insert);
            //加载图片为输入流
            String filePath = "D:\\DM8特点.jpg";
            File file = new File(filePath);
            String filePath2 = "D:\\达梦产品简介.txt";
            File file2 = new File(filePath2);
            InputStream in = new BufferedInputStream(new FileInputStream(file));
            InputStream in2 = new BufferedInputStream(new FileInputStream(file));
            BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file2), StandardCharsets.UTF_8));
            //1.绑定 stream 流信息到第一个?
            pstate.setBinaryStream(1, in);
            //2.绑定 Inputstream 对象到第二个?这里
            pstate.setBlob(2, in2);
            //3.绑定 Reader 对象到第三个?
            pstate.setClob(3, reader);
            pstate.executeUpdate();
            //------------------------------------------------------------------------------------------------------------------------
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                pstate.close();
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

 

4)数据库数据

 

双击 PHOTO 字段,效果如下:

 

双击 TXT 字段,效果如下:

 

5、查询大字段数据(图片、文档等)

1)Java 程序

package com.miracle.dameng;

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.Blob;
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 DM_jdbc_operate_bigData2 {
    // 定义 DM JDBC 驱动串
    static String jdbcString = "dm.jdbc.driver.DmDriver";
    // 定义 DM URL 连接串
    static String urlString = "jdbc:dm://localhost:5236";
    // 定义连接用户名
    static String userName = "SYSDBA";
    // 定义连接用户口令
    static String password = "SYSDBA";
    // 定义连接对象
    static Connection conn = null;
    // 定义 SQL 语句执行对象
    static PreparedStatement pstate = null;
    // 定义保存结果集的对象
    static ResultSet rs = null;
    // 定义输入流对象
    static InputStream in = null;
    // 定义输出流对象
    static FileOutputStream fos = null;
    // 定义输出流对象
    static FileOutputStream fos2 = null;
    // 定义高效字符流对象
    static BufferedReader reader = null;

    public static void main(String[] args) {
        try {
            //1.加载 JDBC 驱动程序
            System.out.println("Loading JDBC Driver...");
            Class.forName(jdbcString);
            //2.连接 DM 数据库
            System.out.println("Connecting to DM Server...");
            conn = DriverManager.getConnection(urlString, userName, password);
//-----------------------------------------------------------------------------------------------
            //3.查询大字段信息 SQL 语句
            String sql_insert = "SELECT * FROM PRODUCTION.BIG_DATA ;";
            pstate = conn.prepareStatement(sql_insert);
            //4.创建 ResultSet 对象保存查询结果集
            rs = pstate.executeQuery();
            //5.解析结果集
            while (rs.next()) {
                //获取第一列 id 信息
                int id = rs.getInt("id");
                //获取第二列 photo 图片信息,并把该图片直接写入到 D:/id_DM8特点.jpg;
                in = rs.getBinaryStream("photo");
                fos = new FileOutputStream("D:/" + id + "_DM8特点.jpg");
                int num = 0;
                //每次从输入流中读取一个字节数据,如果没读到最后指针向下继续循环
                while ((num = in.read()) != -1) {
                    //将每次读取的字节数据,写入到输出流中
                    fos.write(num);
                }
                //获取第三列的 Blob 大字段信息
                //Blob 对象处理的是字节型大字段信息例如图片、视频文件等
                Blob blob = rs.getBlob("describe");
                in = blob.getBinaryStream();
                fos2 = new FileOutputStream("D:/" + id + "_Blob_DM8特点.jpg");
                //每次从输入流中读取一个字节数据,如果没读到最后指针向下继续循环
                while ((num = in.read()) != -1) {
                    //将每次读取的字节数据,写入到输出流中
                    fos2.write(num);
                }
                //获取第四列的 Clob 大字段信息
                //Clob 大字段处理的是字符型大字段信息,文本等数据
                Clob clob = rs.getClob("txt");
                reader = new BufferedReader(clob.getCharacterStream());
                String str = null;
                while ((str = reader.readLine()) != null) {
                    //将每次读取的字节数据
                    System.out.println(str.toString());
                }
            }
//-----------------------------------------------------------------------------------------
        } 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();
                in.close();
                rs.close();
                pstate.close();
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

2)运行效果

 

 3)图片预览效果

 

posted @ 2023-10-16 16:31  龙凌云端  阅读(6060)  评论(0编辑  收藏  举报