openGauss2.0.0之Java简单测试Sequence

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添加到工程中即可;项目工程如下:
    openGauss2.0.0之Java简单测试Sequence_第1张图片

  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. 运行程序,查看结果如下所示:
    openGauss2.0.0之Java简单测试Sequence_第2张图片

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

你可能感兴趣的:(openGauss,openGauss)