JAVA-JDBC连接数据库一个问题:我采用通过事务提交添加属性值,为什么没有虽然没有添加,但是ID自动增加

JAVA-JDBC连接数据库一个问题:我采用通过事务提交添加属性值,为什么没有虽然没有添加,但是ID自动增加,第1张

首先自增ID本来就被设计成为不参与数据库事务的,原因是什么呢?为了防止ID生成阻塞和防止ID错乱,因为对了一张表来说,不是只有你一个线程在申请ID,其他的新增线程了也在申请ID,假设你在事务中第一次申请到了ID=1,但这时你的事务并没提交,也就是这个等于1的ID现在并没有真正入库,想想这时别人的进程也去申请同一个表的ID时,ID生成器该给他1还是2?当然是2啦!如果你这时你回滚你的事务,假设事务把ID=1回滚了,给回ID生成器,ID生成器还能把它给出去别人用么?肯定不行啦,为啥,如果这时那个上次拿到2的线程这次又去拿,不是要拿到1了?说好的自增呢?!也许你会说可以等你下次申请ID时给你呀,把3给刚刚那个拿了2的呀,不好意思,数据库会话(SqlSession)一关,谁记得你呀!

有两种方法可以设置主键,一种是自增长主键,另一种就是生成唯一序列

一、自增长主键

--首先建一个表TEST

create table TEST

(

NID int PRIMARY KEY,

test1 varchar2(20),

test2 varchar2(20),

test3 varchar2(20),

test4 varchar2(20),

test5 varchar2(20)

)

-- 再建一个序列SEQ_TEST

create sequence SEQ_TEST

minvalue 1 --最小值

nomaxvalue --不设置最大值

start with 1 --从1开始计数

increment by 1 --每次加1个

nocycle --一直累加,不循环

nocache; --不建缓冲区

以上代码完成了一个序列(sequence)的建立过程,名称为SEQ_TEST,范围是从1开始到无限大(无限大的程度是由你机器决定的),nocycle 是决定不循环,如果你设置了最大值那么你可以用cycle 会使seq到最大之后循环对于nocache顺便说一下如果你给出了cache值那么系统将自动读取你的cache值大小个seq,这样在反复 *** 作时会加快运行速度,但如果遭遇意外情况如当机了或Oracle死了,则下次取出的seq值将和上次的不连贯(如果连不连贯无所谓建议用cache,因为时间就是金钱呀!)

你只有了表和序列还不够,最好再建一个触发器来执行它!代码如下:

CREATE OR REPLACE TRIGGER tg_test

BEFORE INSERT ON test FOR EACH ROW WHEN (newnid is null)

begin

select seq_testnextval into:newnid from dual;

end;

下面是测试

select from test

insert into test(nid,test1) values(6,'aaa')

insert into test(test1) values('bbb')

要想用jdbc得到一行数据,需要使用ResultSetMetaData 对象来实现,具体用法参见如下代码:

package comrongjidemo;

import javasql;

public class dataDemo {

  public dataDemo() {

  }

 

  public static void main(String[] args) {

 

    try {

      ClassforName("oraclejdbcdriverOracleDriver");

      //建立连接

      //第二步是用适当的驱动程序连接到DBMS,看下面的代码[自行修改您所连接的数据库相关信息]:

      String url = "jdbc:oracle:thin:@192168445:1521:oemrep";

      String username = "ums";

      String password = "rongji";

//用url创建连接

      Connection con = DriverManagergetConnection(url, username, password);

      Statement sta = concreateStatement();

      String sql = "select  from rbac_application ";

      ResultSet resultSet = staexecuteQuery(sql);

      while (resultSetnext()) {

        int int_value = resultSetgetInt(1);

        String string_value = resultSetgetString(2);

        String a = resultSetgetString(3);

        String b = resultSetgetString(4);

//从数据库中以两种不同的方式取得数据。

        Systemoutprintln(int_value + "  " + string_value + "  " + a + "   " +

                           b);

//将检索结果在用户浏览器上输出。

      }

      //获取结果集信息

      ResultSetMetaData resultSetMD = resultSetgetMetaData();

      Systemoutprintln("ColumnCount:" + resultSetMDgetColumnCount());

      for (int i = 1; i < resultSetMDgetColumnCount(); i++) {

        Systemoutprintln("ColumnName:" + resultSetMDgetColumnName(i) + " " +

                           "ColumnTypeName:" +

                           resultSetMDgetColumnTypeName(i));

        Systemoutprintln("isReadOnly:" + resultSetMDisReadOnly(i)

                           + "  isWriteable:" + resultSetMDisWritable(i)

                           + "  isNullable:" + resultSetMDisNullable(i));

        Systemoutprintln("tableName:" + resultSetMDgetTableName(i));

      }

 

      //关闭

      conclose();

    }

    catch (Exception ex) {

      exprintStackTrace();

    }

  }

}

ResultSetMetaData resultSetMD = resultSetgetMetaData();

GetMetaData()方法返回一个ResultSetMetaData类的对象,使用该类的方法,得到许多关于结果集的信息,下面给出几个常用的方法:

(1) getColumnCount()返回一个int值,指出结果集中的列数。

(2) getTableName(int column)返回一个字符串,指出参数中所代表列的表的名称。

(3) getColumnLabel(int column)返回一个String对象,该对象是column所指的列的显示标题。

(4) getColumnName(int column)返回的是该列在数据库中的名称。可以把此方法返回的String对象作为Resultset类的getXXX()方法的参数。不过,并没有太大的实际意义。

(5) getColumnType(int comlumn)返回指定列的SQL数据类型。他的返回值是一个int值。在javasqlTypes类中有关于各种SQL数据类型的定义。

(6) getColumnTypeName(int comlumn)返回指定列的数据类型在数据源中的名称。他的返回值是一个String对象。

(7) isReadOnly(int column) 返回一个boolean值,指出该列是否是只读的。

(8) isWriteable(int column) 返回一个boolean值,指出该列是否可写。

(9) isNullable(int column)返回一个boolean值,指出该列是否允许存入一个NULL 值。

以上就是关于JAVA-JDBC连接数据库一个问题:我采用通过事务提交添加属性值,为什么没有虽然没有添加,但是ID自动增加全部的内容,包括:JAVA-JDBC连接数据库一个问题:我采用通过事务提交添加属性值,为什么没有虽然没有添加,但是ID自动增加、java 用 jdbc 插入一条信息返回当前信息的主键id 怎样写 oracle的数据库 主键序列自增、怎样用jdbc的rs得到一行数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/10188211.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存