openGauss2.0.0之Java简单测试Sequence

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

openGauss2.0.0之Java测试Sequence

一、实验环境


项目Value
操作系统openEuler
服务器华为云弹性云服务器ECS 1 台 2核心 4GB内存
数据库openGauss2.0.0 单机部署

二、实验目标


  • 目标

    学习openGauss2.0.0的序列的使用熟悉JDBC编程方式操作openGauss数据库

  • 知识点

    •Sequence是一个存放等差数列特殊表。这个表没有实际意义通常用于为行或者表生成唯一的标识符
    •如果给出一个模式名则该序列就在给定的模式中创建否则会在当前模式中创建。序列名必须和同一个模式中的其他序列、表、索引、视图或外表的名称不同
    •创建序列后在表中使用序列的nextval()函数和generate_series(1,N)函数对表插入数据请保证nextval的可调用次数大于等于N+1次否则会因为generate_series()函数会调用N+1次而导致报错。

    序列Sequence是用来产生唯一整数的数据库对象序列的值是按照一定规则自增的整数。因为自增所以不重复因此说Sequence具有唯一标识性。这也是Sequence常被用作主键的原因
    通过序列使某字段成为唯一标识符的方法有两种
    1. 一种是声明字段的类型为序列整型由数据库在后台自动创建一个对应的Sequence。
    2. 另一种是使用CREATE SEQUENCE自定义一个新的Sequence然后将nextval(‘sequence_name’)函数读取的序列值指定为某一字段的默认值这样该字段就可以作为唯一标识符。

    在Data Studio中查看序列如下图所示
    在这里插入图片描述
    序列默认
    最大值为9223372036854775807
    最小值为1
    自增步长为1
    开始值为1
    随着关联序列的数据库表的增加last_value也会变化记录数据库表中关联字段的最后一个数值。

二、实验步骤


  1. 前置步骤

    • openGauss已经正常安装到ECS服务器中了
  2. 在IDEA中创建工程并把从官网下载下来的JDBC驱动包放入到该项目工程下的lib需先创建目录下并将驱动包Add as liberary添加到工程中即可项目工程如下
    在这里插入图片描述

  3. 编写程序程序代码如下

    package com.opengauss.demo;
    
    import java.sql.*;
    import java.util.Properties;
    
    public class SequenceTest {
        public static void main(String[] args) throws SQLException {
            // 获取链接
            Connection conn = getConnect("test001", "suben", "openGauss@1234");
            // 可先保证数据库中不存在表和sequence
            // doBySQL(conn, 0, "drop table t5 cascade;");
            // doBySQL(conn, 0, "drop sequence seq3 cascade;");
            // 创建sequence
            doBySQL(conn, 0, "create sequence seq3;");
            // 查看sequence
            System.out.println("=============创建时sequence中的内容如下=============");
            select(conn, "select * from seq3;",false,false);
            // 创建关联了sequence的表
            doBySQL(conn, 0, "create table if not exists t5(id int not null default nextval('seq3'),name text);");
            // 插入数据到表中
            doBySQL(conn, 1, "insert into t5(name) values(?)");
            // 查看数据表
            select(conn,"select * from t5 order by id desc limit 3;",true,false);
            // 查看sequence
            System.out.println("=============关联数据表插入数据后sequence中的内容如下=============");
            select(conn, "select * from seq3;",false,true);
        }
        
        public static Connection getConnect(String db, String user, String pwd) {
            String driver = "org.postgresql.Driver";
            // 需要创建新的数据库用户使用新的数据库用户连接
            String sourceURL = "jdbc:postgresql://1xx.7x.x9.1x8:26000/" + db + "?";
            Properties properties = new Properties();
            properties.setProperty("user", user);
            properties.setProperty("password", pwd);
            Connection conn = null;
            try {
                Class.forName(driver);
            } catch (Exception var9) {
                var9.printStackTrace();
                return null;
            }
            try {
                conn = DriverManager.getConnection(sourceURL, properties);
                System.out.println("连接成功 ");
                return conn;
            } catch (Exception var8) {
                var8.printStackTrace();
                return null;
            }
        }
    
        public static void doBySQL(Connection conn, int flag, String sql) throws SQLException {
            Statement statement = conn.createStatement();
            if (flag == 0) {
                statement.execute(sql);
            } else {
                conn.setAutoCommit(false); // 设置不自动提交 默认下是自动提交的
                PreparedStatement prs = conn.prepareStatement(sql);
                for (int i = 1; i <= 20000; i++) {
                    prs.setString(1, "第" + i + "次");
                    prs.addBatch(); // 将处理后的SQL都装在一个容器中
                    if (i % 500 == 0) {
                        prs.executeBatch(); // 提交
                        prs.clearBatch(); // 清空容器
                    }
                    conn.commit(); // 提交事务
                }
            }
        }
    
        public static void select(Connection conn, String sql,boolean isTable,boolean isClosed) throws SQLException {
            PreparedStatement preparedStatement = conn.prepareStatement(sql);
            ResultSet resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
               if (isTable){
                   System.out.println(
                           resultSet.getString(1)
                                   + "\t" + resultSet.getString(2));
               }else {
                   System.out.println(
                           resultSet.getString(1)
                                   + "\t" + resultSet.getString(2)
                                   + "\t" + resultSet.getString(3)
                                   + "\t" + resultSet.getString(4)
                                   + "\t" + resultSet.getString(5));
               }
            }
            if (isClosed){
                if (preparedStatement != null) {
                    preparedStatement.close();
                }
                if (conn != null) {
                    conn.close();
                }
            }
        }
    }
    
    
  4. 运行程序查看结果如下所示
    在这里插入图片描述

至此单表关联序列的实验到此结束大家可以尝试一个序列关联多张表的时候会发生什么呢欢迎大家自行实验后给留言分享你们的测试结果和测试结论。如果您觉得有用可点赞可转发给身边的朋友大共同成长

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java