用Java语言编写一个方法,这个方法用来生成入库单编号
入库单编号格式为:KM20100926001分三部分:第一部分是KM为开头标记
第二部分是当天日期
第三部分是001开头,按顺序往下排,比如002、003...我数据库有入库单编号demoId这个字段。麻烦各位高手了!
入库单编号格式为:KM20100926001分三部分:第一部分是KM为开头标记
第二部分是当天日期
第三部分是001开头,按顺序往下排,比如002、003...我数据库有入库单编号demoId这个字段。麻烦各位高手了!
如果有数据,则select max(demoId) from table,得到最大的Id后截取后3位转成int,加1,再字符串拼接产生KMyyyyMMdd,加上整型....OK~
对对对...我赞同,还是要看LZ具体的需求了,但是无论怎样都是字符串操作...LZ多思考思考就行了...
如果有数据,则select max(demoId) from table where demoId like ‘%yyyyMMdd%’,
得到最大的Id后截取后3位转成int,加1,再字符串拼接产生KMyyyyMMdd,
不够三位前面补00的方法
String str ="00"+num;
str.subString(str.length-3);
String value = "KM";
SimpleDateFormat dateFm = new SimpleDateFormat("yyMMddHHmmss");
String dateTime = dateFm.format(new java.util.Date());
value += dateTime;//这部分产生前面字符串
//应该要有个时间的字段(插入记录的时间,因为要统计这单是今天的第几单了)createTime
//我假设操作这个表的方法封装在CodeDao里面
CodeDao codeDao = new CodeDaoImpl();//或者你是用spring的IOC注入就不是这么写,我想你懂的
//codeDao.getCreateTimeCount这个办法是封装“select count(*) from 表 where createTime = getdate()”
codeDao.getCreateTimeCount
if(codeDao.getCreateTimeCount!=0)
Integer num = getCreateTimeCount + 1;
String num_ = num.toString();
value += joint(num_,'0',false,3);
return value;
}
//自己做项目用的一个方法,用于拼接的,第一个参数是源字符串,第二个参数是需要补的字符,第三个是补在哪一边,第四个是补完总长度是多少
//比方说joint("asdf",'0',false,10)的返回值就是000000asdf
public static String joint(String string, Character letter, boolean rightSide, int totalLength) {
if (string.length() >= totalLength) {
return string;
}
int range = totalLength - string.length();
String temp = "";
for (int i = 0; i < range; i++) {
temp += letter;
}
return rightSide == true ? string + temp : temp + string;
}
1. demoId是字符串,里面包含不固定的日期,无法取max。当然这个是小问题,可以用函数取max(最后3位),也可以在表中加个sequence字段(类似ID列)解决,取max(sequence)取代max(demoId)。
2. 关键:如果查询出来003最大,你就生成004?如果这时候其它操作已经插入004了呢?就出现重复编号了。正确方法是:
1. 能用数据库的sequence就用它,如6L所说。
2. 用代码模拟sequence。 private static long INIT_SEQ = 0l;
//这个就是用于生成编号的sequence
private static long seq = INIT_SEQ;
/**
* 获取sequence。
*/
public synchronized static long getSeq() {
if (seq == INIT_SEQ) {
seq = getSequence();//此方法从数据库中获取当前最大的seq,系统启动后的第一次会去取,只有就不会再用了。
}
return ++_seq;
}
由于方法是同步的,所以不会出现重复。