请教高手们一个java算法问题 我现在有这样一个需求,数据库中有一个字段 是需要累加的例如:这个字段有一个值是001 下次我需要这个字段的值是002 再取下一个就是003这样递归的增长 最大值到999 这个用java怎么实现呀?急用谢谢了! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你的意思是每次取出时加一,是不?你要在数据库中设置一下这个字段的check值,使其最大为 999然后取出值照样,但取出之后加个update tb set x = x+1 where .....;你再想想 就是 假设 数据库现在有 一条记录 A 他的一个字段值是001 我再添加一条记录 B 就需要取 A 记录的 001值在这个值的基础上 加一 就是002 这个用java怎么实现 自增长主键?在数据库层面可以设置用java做干嘛?并不好做。 这个字段的例子应该是这样的 TEXT2008HAW-027 每次必须取出来 把后面的 027 加一然后生成 TEXT2008HAW-028 因为前以部分是不变的 我现在截取字符串后剩下 027 现在怎么实现这一部分的递增, 因为业务关系不能用那个那个实现 需要用java去实现 这个字段的例子应该是这样的 TEXT2008HAW-027 每次必须取出来 把后面的 027 加一然后生成 TEXT2008HAW-028 因为前以部分是不变的 我现在截取字符串后剩下 027 现在怎么实现这一部分的递增, 假设你的表名为:MAXKEY、最大号记录字段为:MAXVALUE你写一个主键生成类,在该类中按照取得主键调用顺序加入以下几个方法://首先在你的数据源上开始事务,下面整个过程全部是一个事务://其次锁定你的表记录行:private void lock(Connection connection, String tableName, String 其他条件) throws Exception { String updateStr = " UPDATE MAXKEY SET MAXVALUE=MAXVALUE WHERE tableName=? AND 其他条件=?";//行级锁 PreparedStatement stmt = connection.prepareStatement(updateStr); stmt.setString(1, tableName);//用这个表名为区分可以为多个表保存最大主键 stmt.setString(2, 其他条件); stmt.execute(); stmt.close();}//然后:String query = "SELECT MAXVALUE FROM MAXKEY WHERE tableName=? AND 其他条件=?"; PreparedStatement stmt = connection.prepareStatement(query); stmt.setString(1, tableName); stmt.setString(2, 其他条件); ResultSet result = stmt.executeQuery();//最后插入或者更新最大号字段: if(!result.next()){//如果最大号表没有该表的最大号则插入... //生成001并插入: this.insert(connection, "001"...);//这个就不写了... }else{//如果最大号表有该表的最大号则更新... //从result中取到MAXVALUE并转换为数值、加一、然后更新、就不写了... } stmt.close();//提交整个事务...至于你最大号的限制你可以写个保存参数的接口静态成员保存或者别的... 还剩insert和update方法,最简单的插入更新,楼主根据你表结构自己写即可。总之这些方法都在一个事务内顺序调用,保障你表中的最大号不会出现脏数据或者跳号。至于从数据库查询出字符串、转换为数值、加一这个过程很简单的吧。 TEXT2008HAW-027增长为TEXT2008HAW-028 :String key = "TEXT2008HAW-027";String temp = key.split("-")[1];temp = Long.toString(Long.parseLong(temp) + 1);key = key.split("-")[0] + temp; 如果一定要这样的话 就用 select max(...) from ... 取出这个字段的最大值+1 或-1 就自己弄了 关于HttpClient的问题 怎样实现一条直线的对象赋给shape 如何使点击右键产生菜单? 怎样获得一个子组件的绝对位置? 有谁试过用 sslsocket连接代理服务器吗? 在执行JAVA程序时怎样去掉背后的那个DOS界面 java中新建对话框显示问题 哪有java函数中文手册下载? 简单,但是奇怪 在线等待你的佳音!大家近来看看哦! JTextPane插入图片的问题 高分请教,dom4j读取内容乱码问题
然后取出值照样,但取出之后加个update tb set x = x+1 where .....;
你再想想
在这个值的基础上 加一 就是002 这个用java怎么实现
用java做干嘛?并不好做。
然后生成 TEXT2008HAW-028 因为前以部分是不变的 我现在截取字符串后剩下 027 现在怎么实现
这一部分的递增,
这个字段的例子应该是这样的 TEXT2008HAW-027 每次必须取出来 把后面的 027 加一
然后生成 TEXT2008HAW-028 因为前以部分是不变的 我现在截取字符串后剩下 027 现在怎么实现
这一部分的递增,
你写一个主键生成类,在该类中按照取得主键调用顺序加入以下几个方法:
//首先在你的数据源上开始事务,下面整个过程全部是一个事务:
//其次锁定你的表记录行:
private void lock(Connection connection, String tableName, String 其他条件) throws Exception {
String updateStr =
" UPDATE MAXKEY SET MAXVALUE=MAXVALUE WHERE tableName=? AND 其他条件=?";//行级锁
PreparedStatement stmt = connection.prepareStatement(updateStr);
stmt.setString(1, tableName);//用这个表名为区分可以为多个表保存最大主键
stmt.setString(2, 其他条件);
stmt.execute();
stmt.close();
}
//然后:
String query =
"SELECT MAXVALUE FROM MAXKEY WHERE tableName=? AND 其他条件=?";
PreparedStatement stmt = connection.prepareStatement(query);
stmt.setString(1, tableName);
stmt.setString(2, 其他条件);
ResultSet result = stmt.executeQuery();
//最后插入或者更新最大号字段:
if(!result.next()){//如果最大号表没有该表的最大号则插入...
//生成001并插入:
this.insert(connection, "001"...);//这个就不写了...
}else{//如果最大号表有该表的最大号则更新...
//从result中取到MAXVALUE并转换为数值、加一、然后更新、就不写了...
}
stmt.close();
//提交整个事务...至于你最大号的限制你可以写个保存参数的接口静态成员保存或者别的...
总之这些方法都在一个事务内顺序调用,保障你表中的最大号不会出现脏数据或者跳号。
至于从数据库查询出字符串、转换为数值、加一这个过程很简单的吧。
String temp = key.split("-")[1];
temp = Long.toString(Long.parseLong(temp) + 1);
key = key.split("-")[0] + temp;
select max(...) from ...
取出这个字段的最大值
+1 或-1 就自己弄了