Bootstrap

开发 | JAVA连接达梦数据库(DM8)

本文参考文献
https://eco.dameng.com/docs/zh-cn/start/java-development.html
https://eco.dameng.com/docs/zh-cn/app-dev/index.html

概述

本文通过以下方式实现Java程序与DM8数据库的交互

  • 使用JDBC接口(不用框架,最简单)
  • 使用MyBatis框架
  • 使用Spring框架
  • 使用SpringBoot Jdbc 框架

Java的软件开发工具包(SDK)

  • JDK(Java Development Kit)

集成开发环境(IDE)

  • Eclipse
  • IntelliJ IDEA

框架

  • MyBatis
  • Spring
  • Maven
  • Spring Boot
  • Spring Boot Jdbc

【注意】
仅记录实现以上方式所涉及的Java方面的知识点,数据库的知识点略过

Java相关概念

Java概念图

https://docs.oracle.com/javase/8/docs/

在这里插入图片描述

JDK、JRE、JVM

参考文献
JDK、JRE、JVM三者间的联系与区别
https://www.cnblogs.com/bingyimeiling/p/10266949.html
JDK、JRE、JVM三者分别表示什么?有何区别?
https://blog.csdn.net/jy_cai/article/details/116402560

JDK(Java Development Kit)

【作用】
编译、调试、运行java程序

【介绍】
JDK(Java SE Development Kit),Java标准开发包。它提供了编译、运行Java程序所需的各种工具和资源,包括Java编译器、Java运行时环境,以及常用的Java类库等。

下面是JDK安装目录的内容(/home/dmdba/dmdbms/jdk)
bin			>> 最主要的是里面的编译器(javac)
include		>> java与JVM交互用的头文件
jre			>> java运行环境(Java Runtime Environment)
lib			>> 常用java类库
tapset

JDK可分为以下三类:

  • SE(standard edition)
    标准版
  • EE(enterprise edition)
    企业版
  • ME(micro edition)
    移动版

JRE( Java Runtime Environment)

【作用】
运行java程序

【介绍】
Java运行环境,用于解释执行Java的字节码文件

下面是JRE安装目录的内容(/home/dmdba/dmdbms/jdk/jre)
bin		>> 理解为JVM
lib		>> JVM工作所需的类库

JVM(Java Virtual Mechinal)

【作用】
屏蔽不同操作系统之间的差异,连接java程序与操作系统。

操作系统与JVM是一对一的,而JVM与java程序是一对多的(因此,不同的操作系统,使用各自适配的JVM,便能运行同一个java程序)

【介绍】
Java虚拟机,是JRE的一部分。它是整个java实现跨平台的最核心的部分,负责解释执行字节码文件,是可运行java字节码文件的虚拟计算机。所有平台的上的JVM向编译器提供相同的接口,而编译器只需要面向虚拟机,生成虚拟机能识别的代码,然后由虚拟机来解释执行。

当使用Java编译器编译Java程序时,生成的是与平台无关的字节码,这些字节码只面向JVM。不同平台的JVM都是不同的,但它们都提供了相同的接口。JVM是Java程序跨平台的关键部分,只要为不同平台实现了相应的虚拟机,编译后的Java字节码就可以在该平台上运行。

简而言之

JDK:编译 + 调试 + 运行JAVA
JRE:运行JAVA
JVM:使JAVA程序可跨操作系统运行

开发: 安装JDK
普通人: 安装JRE

Java语法

Java包
Java类
Java接口

安装JDK

Java SE Development Kit 8u202(JDK 8)下载地址
https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html
参考文献
https://blog.csdn.net/weixin_36372623/article/details/114613920

安装

windows x64和x86的区别
https://blog.csdn.net/qew2017/article/details/94066762

安装包:jdk-8u202-windows-x64.exe
在这里插入图片描述
开始安装JDK
在这里插入图片描述
安装功能分为:开发工具、源代码、公共JRE
更改路径,将jdk安装在D:\Java\jdk1.8.0_202

开发工具 - 功能说明
在这里插入图片描述

源代码 - 功能说明
在这里插入图片描述

公共 JRE - 功能说明
在这里插入图片描述
更改路径,将jre安装在D:\Java\jdk1.8.0_202
在这里插入图片描述
安装完成
在这里插入图片描述

配置

Java开发环境不再需要配置classpath
https://zhuanlan.zhihu.com/p/66792258
Java相关环境变量设置原理
https://blog.csdn.net/ly510587/article/details/90759025

JDK相关的环境变量如下:

  • JAVA_HOME
    JDK安装路径
  • PATH
    方便直接调用JDK里的可执行程序(例如:编译程序 - javac、运行程序 - java)
  • CLASSPATH
    指定程序中使用的.class文件的位置(可以不配置)

新建系统环境变量JAVA_HOME,变量值为JDK安装目录
在这里插入图片描述
编辑环境变量Path,新建值
%JAVA_HOME%\bin
%JAVA_HOME%\jre\bin
在这里插入图片描述

检查

在这里插入图片描述

卸载(需要再执行)

参考文献
【图文详解】如何彻底删除JDK(以win10、jdk1.8为例)
https://blog.csdn.net/weixin_42168713/article/details/112162099
注册表是什么东西?
https://www.php.cn/faq/417818.html
环境变量
https://baike.baidu.com/item/%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F/1730949?fr=aladdin

Eclipse(集成开发环境 IDE)

Eclipse 概述

eclipse(集成开发环境 IDE)
https://baike.baidu.com/item/eclipse/61703?fr=aladdin

Eclipse的设计思想是:一切皆插件

Eclipse核心很小,其它所有功能都以插件的形式附加于Eclipse核心之上
Eclipse基本内核包括:图形API (SWT/Jface), Java开发环境插件(JDT ),插件开发环境(PDE)等

Eclipse安装

Eclipse安装包下载网址(龟速)
https://www.eclipse.org/downloads/packages/release/2018-12/r
Eclipse下载安装教程(官网/版本选择)
https://blog.csdn.net/weixin_42334396/article/details/105445118
eclipse 版本中的RC1-RC3 或 M1-M9是什么意思
https://blog.csdn.net/ba_wang_mao/article/details/111655554

Eclipse有多个版本,此处选择版本:
Eclipse IDE 2018-12 R

每个版本有多个包,此处选择包:(因为它最多人下载,有用的插件基本都包上了)
Eclipse IDE for Enterprise Java Developers
在这里插入图片描述
Package包含内容如下:
在这里插入图片描述

2018的下载太慢了,国内镜像只有新版本的jee,下个新版本的试用看看。
eclipse-jee-2021-06-R-win32-x86_64.zip

eclipse官网下载,修改镜像
https://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/2021-06/R/eclipse-jee-2021-06-R-win32-x86_64.zip
清华镜像
https://mirrors.tuna.tsinghua.edu.cn/eclipse/technology/epp/downloads/release/2021-06/R/

在这里插入图片描述

插件安装

Eclipse 安装插件
https://www.runoob.com/eclipse/eclipse-install-plugins.html

在这里插入图片描述

导入项目

Eclipse如何导入一个项目
https://jingyan.baidu.com/article/02027811201b561bcc9ce5a1.html

导入后报错(需要修改JRE System Library的路径)
在这里插入图片描述

在这里插入图片描述

编译导入的项目

编译TestProduct.java,出现如下报错
在这里插入图片描述

Eclipse 基本使用方法

Eclipse 教程
https://www.runoob.com/eclipse/eclipse-tutorial.html
Eclipse使用教程(图文详解)
https://zhuanlan.zhihu.com/p/146333721?ivk_sa=1024320u

安装插件
导入项目
创建项目

MyBatis框架

基本概念

MyBatis
https://baike.baidu.com/item/MyBatis/2824918?fr=aladdin

内聚性、耦合性
框架

工作原理

MyBatis简单使用和入门理解
https://www.cnblogs.com/hapjin/p/7290876.html
Mybatis之工作原理
https://blog.csdn.net/u014297148/article/details/78696096

执行器:Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
参数处理器: ParameterHandler (getParameterObject, setParameters)
结构处理器 ResultSetHandler (handleResultSets, handleOutputParameters)
sql查询处理器:StatementHandler (prepare, parameterize, batch, update, query)
  • dao层
  • pojo层
    存放实体类
  • test层

几个文件
jdbc.properties
mybatis-config.xml
TestProduct.java
ProductCategory.java
ProductCategoryMapper.java
ProductCategoryMapper.xml

使用JDBC接口(不用框架,最简单)

JDBC 接口
https://eco.dameng.com/docs/zh-cn/app-dev/java-jdbc.html

概述

JDBC (Java Database Connectivity) 是 Java 应用程序与数据库的接口规范,旨在让各数据库开发商为 Java 程序员提供标准的数据库应用程序编程接口 (API)。JDBC 定义了一个跨数据库、跨平台的通用 SQL 数据库 API。

DM JDBC 数据库驱动程序是一个能够支持基本 SQL 功能的通用应用程序编程接口,支持一般的 SQL 数据库访问。通过 JDBC 驱动程序,用户可以在应用程序中实现对 DM 数据库的连接与访问,JDBC

驱动程序的主要功能包括:

  • 建立与 DM 数据库的连接。
  • 转接发送 SQL 语句到数据库。
  • 处理并返回语句执行结果。

环境介绍

软件版本
DM 数据库DM8
JDKJDK 8
Eclipse2021-06

安装DM8数据库

参考:
https://eco.dameng.com/docs/zh-cn/start/install-dm-linux-prepare.html
https://blog.csdn.net/weixin_41709724/article/details/121101353

准备示例库

最起码要准备测试表 PRODUCTION.PRODUCT_CATEGORY

参考:
https://eco.dameng.com/docs/zh-cn/pm/example-description.html

安装JDK

看目录【安装JDK】

JDK版本如下
C:\Users\host1>java -version
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)

安装Eclipse

看目录【Eclipse(集成开发环境 IDE)】

使Java与DM数据库交互

新建Java Project
在这里插入图片描述
设置项目存放路径、JRE路径
在这里插入图片描述
新建Class
在这里插入图片描述
新建jdbc_conn类、java_jdbc包
在这里插入图片描述
java_jdbc.java代码如下

package java_jdbc;

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

public class jdbc_conn {
    static Connection con = null;
    static String cname = "dm.jdbc.driver.DmDriver";
    static String url = "jdbc:dm://192.168.8.10: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]conn database");
        } catch (Exception e) {
            System.out.println("[FAIL]conn database:" + e.getMessage());
        }
    }
    public void disConn(Connection con) throws SQLException {
        if (con != null) {
            con.close();
        }
    }
}

添加 DM JDBC 驱动包(DmJdbcDriver18.jar)
在这里插入图片描述
【注意 1】
DmJdbcDriver18.jar在数据库安装目录/drivers/jdbc下可以找到
在这里插入图片描述
DmJdbcDriver18.jar没有导入成功的话,将出现如下错误
在这里插入图片描述

运行jdbc_conn.java
在这里插入图片描述
【注意 1】
数据库IP、端口、用户、密码、防火墙

【注意 2】
代码待研究(此处仅复制粘贴,未做注释)

开发示例

基本操作(增删改查)

在这里插入图片描述

jdbc_dml.java代码如下

package java_jdbc;

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

public class jdbc_dml {
// 定义 DM JDBC 驱动串
static String jdbcString = "dm.jdbc.driver.DmDriver";
// 定义 DM URL 连接串
static String urlString = "jdbc:dm://192.168.8.10: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 e) {
            e.printStackTrace();
        } catch (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);
        }
    }
}

【注意 1】
数据库IP、端口、用户、密码、防火墙

【注意 2】
代码待研究(此处仅复制粘贴,未做注释)

运行结果如下

执行前,用disql查看PRODUCTION.PRODUCT_CATEGORY表的内容

SQL> select * from PRODUCTION.PRODUCT_CATEGORY;

行号     PRODUCT_CATEGORYID NAME     
---------- ------------------ ---------
1          1                  小说
2          2                  文学
3          3                  计算机
4          4                  英语
5          5                  管理
6          6                  少儿
7          7                  金融

7 rows got

已用时间: 0.351(毫秒). 执行号:1509.

【注意】
此时有"英语"、“文学”;没有"厨艺"

执行jdbc_dml.java
在这里插入图片描述
执行后,用disql查看PRODUCTION.PRODUCT_CATEGORY表的内容

SQL> select * from PRODUCTION.PRODUCT_CATEGORY;

行号     PRODUCT_CATEGORYID NAME     
---------- ------------------ ---------
1          1                  小说
2          2                  文学
3          3                  计算机
4          4                  英语
5          5                  管理
6          6                  少儿
7          7                  金融
8          8                  厨艺

8 rows got

已用时间: 5.347(毫秒). 执行号:1510.

【注意】
新增了"厨艺",但"文学"没有替换成"国学","英语"没有被删除。(where条件没派上用场,待排查,字符集有问题?)

绑定变量

在这里插入图片描述

jdbc_prepareStatement.java代码如下

package java_jdbc;

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

public class jdbc_prepareStatement{
    // 定义 DM JDBC 驱动串
    static String jdbcString = "dm.jdbc.driver.DmDriver";
    // 定义 DM URL 连接串
    static String urlString = "jdbc:dm://192.168.8.10: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.绑定?对应的参数:理论上有多少个?就要绑定多少个值;
            //把 id3 所对应的 name 值修改为 "魔幻"
            pstate.setString(1, "魔幻");
            pstate.setInt(2, 3);
            //5. 执行 SQL 语句
            pstate.executeUpdate();
//----------------------------------------------------------------------------
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                pstate.close();
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

【注意 1】
数据库IP、端口、用户、密码、防火墙

【注意 2】
代码待研究(此处仅复制粘贴,未做注释)

运行结果如下

执行前,用disql查看PRODUCTION.PRODUCT_CATEGORY表的内容

SQL> select * from PRODUCTION.PRODUCT_CATEGORY;

行号     PRODUCT_CATEGORYID NAME     
---------- ------------------ ---------
1          1                  小说
2          2                  文学
3          3                  计算机
4          4                  英语
5          5                  管理
6          6                  少儿
7          7                  金融
8          8                  厨艺

8 rows got

已用时间: 0.243(毫秒). 执行号:1512.

执行jdbc_prepareStatement.java
在这里插入图片描述
执行后,用disql查看PRODUCTION.PRODUCT_CATEGORY表的内容

SQL> select * from PRODUCTION.PRODUCT_CATEGORY;
SQL> select * from PRODUCTION.PRODUCT_CATEGORY;

行号     PRODUCT_CATEGORYID NAME     
---------- ------------------ ---------
1          1                  小说
2          2                  文学
3          3                  计算机
4          4                  英语
5          5                  管理
6          6                  少儿
7          7                  金融
8          8                  厨艺

8 rows got

已用时间: 0.387(毫秒). 执行号:1521.

【注意】
PRODUCT_CATEGORYID = 3 的"计算机"应该被修改为"魔幻"(where条件没派上用场,待排查)

使用MyBatis框架

使用Spring框架

使用SpringBoot Jdbc 框架

达梦云适配中心:
https://eco.dameng.com

;