A. 求助大神,要求用java代码写一个序列生成器
importjava.util.HashMap;
importjava.security.KeyException;
importjava.sql.Connection;
importjava.sql.PreparedStatement;
importjava.sql.ResultSet;
importjava.sql.SQLException;
/**
*类<code>Key</code>是一个数据库主键生成器,用序列号的方式来产生数据库中需要的主键值。
*<p>
*<code>Key</code>目前支持的数据库包括Oracle的所有版本、MySql的3.x以上的版本
*以及所有支持max()函数的数据库,支持字段类型仅为数字类型的主键,对于字符及其它类型的主键尚不提供支持。
*<p>
*在使用时只需提供表名、字段名(主键)以及到数据库的JDBC连接,如果想要获得message表的id字段的下一个主键值时:
*<p>
*<blockquote>
*
*<pre>
*java.sql.Connectionconn=...;
*org.shaoye.common.sql.Keykey=org.shaoye.common.sql.Key.getInstance();
*intkeyValue=key.getNextKey("message","id",conn);
*Stringsql="insertintomessage(id,...)values("+keyValue+",...)";
*//执行插入操作...
*</pre>
*
*</blockquote>
*<p>
*
*@author令少爷([email protected])
*@sincemagic0.1
*/
publicfinalclassKey{
/**
*key的最大值,默认为9223372036854775807,即long类型的最大值
*/
privatelongmax=9223372036854775807L;
/**
*key的最小值,默认为1
**/
privatelongmin=1L;
/**
*Key的唯一实例,通过getInstance()方法获得
**/
privatestaticKeykeygen=newKey();
/**
*KeyInfo类的实例列表,默认容量为5个
**/
privateHashMap<String,KeyInfo>keyList=newHashMap<String,KeyInfo>(5);//keyInfo
//列表
/**
*私有的默认构造方法,防止外部构造类的实例
**/
privateKey(){
}
/**
*获得Key的唯一实例
**/
publicstaticKeygetInstance(){
returnkeygen;
}
/**
*用指定的表和字段获得key的下一个值,主键的值不得超过2147483647
*
*@paramtableName
*数据库中的表名,表中必须有一个数字主键
*@paramkeyName
*表(tableName)中的字段名
*@paramconn
*JDBC连接,如果欲获得的key是第一次取值,则必须保证conn能连接到数据库
*@returnkey的下一个主键的int值
*@throws<code>KeyException</code>
*如果表名或字段名不存在、访问数据库错误或key的值大于2147483647时抛出
*/
publicintgetNextKey(StringtableName,StringkeyName,Connectionconn)
throwsKeyException{
longvalue=getNextKeyLong(tableName,keyName,conn);
if(value>2147483647L){
thrownewKeyException(
"Key'svaluetoobig,!");
}
return(newLong(value)).intValue();
}
/**
*用指定的表和字段获得key的下一个值,最大为9223372036854775807
*@paramtableName数据库中的表名,表中必须有一个数字主键
*@paramkeyName表(tableName)中的字段名
*@paramconnJDBC连接,如果欲获得的key是第一次取值,则必须保证conn能连接到数据库
*@returnkey的下一个主键的long值
*@throws<code>KeyException</code>如果表名或字段名不存在或访问数据库错误时抛出
*/
publiclonggetNextKeyLong(StringtableName,StringkeyName,Connectionconn)
throwsKeyException{
KeyInfokeyinfo;
Stringitem=tableName+"."+keyName;
try{
if(keyList.containsKey(item)){
keyinfo=(KeyInfo)keyList.get(item);
}else{
keyinfo=newKeyInfo(tableName,keyName,conn);
keyList.put(item,keyinfo);
}
returnkeyinfo.getNextKey();
}catch(SQLExceptionsqle){
thrownewKeyException(sqle);
}
}
/**
*用指定的"表<code>.</code>字段"形式的字符串获得key的下一个值,主键的值不得超过2147483647
*@paramtableDotField"表.字段"形式的字符串,如:message.id
*@paramconnJDBC连接,如果欲获得的key是第一次取值,则必须保证conn能连接到数据库
*@returnkey的下一个主键的int值
*@throws<code>KeyException</code>如果表名或字段名不存在、访问数据库错误或key的值大于2147483647时抛出
*/
publicintgetNextKey(StringtableDotField,Connectionconn)
throwsKeyException{
longvalue=getNextKeyLong(tableDotField,conn);
if(value>2147483647L){
thrownewKeyException(
"Key'svaluetoobig,!");
}
return(newLong(value)).intValue();
}
/**
*用指定的"表<code>.</code>字段"形式的字符串获得key的下一个值,最大为9223372036854775807
*@paramtableDotField"表.字段"形式的字符串,如:message.id
*@paramconnJDBC连接,如果欲获得的key是第一次取值,则必须保证conn能连接到数据库
*@returnkey的下一个主键的int值
*@throws<code>KeyException</code>如果表名或字段名不存在或访问数据库错误时抛出
*/
publiclonggetNextKeyLong(StringtableDotField,Connectionconn)
throwsKeyException{
intdot_index=tableDotField.indexOf(".");
if(tableDotField.indexOf(".")<1){
thrownewKeyException("UnknownKey'"+tableDotField+"'!");
}
Stringtab=tableDotField.substring(0,dot_index);
Stringkey=tableDotField.substring(dot_index);
returngetNextKeyLong(tab,key,conn);
}
/**
*用指定的表和字段获得key的当前值,主键的值不得超过2147483647
*@paramtableName数据库中的表名,表中必须有一个数字主键
*@paramkeyName表(tableName)中的字段名
*@paramconnJDBC连接,如果欲获得的key是第一次取值,则必须保证conn能连接到数据库
*@returnkey的当前int值
*@throws<code>KeyException</code>
*如果表名或字段名不存在、访问数据库错误或key的值大于2147483647时抛出
*/
publicintgetCurrentKey(StringtableName,StringkeyName,Connectionconn)
throwsKeyException{
longvalue=getCurrentKeyLong(tableName,keyName,conn);
if(value>2147483647L){
thrownewKeyException(
"Key'svaluetoobig,!");
}
return(newLong(value)).intValue();
}
/**
*用指定的表和字段获得key的当前值,最大为9223372036854775807
*
*@paramtableName
*数据库中的表名,表中必须有一个数字主键
*@paramkeyName
*表(tableName)中的字段名
*@paramconn
*JDBC连接,如果欲获得的key是第一次取值,则必须保证conn能连接到数据库
*@returnkey的当前long值
*@throws<code>KeyException</code>如果表名或字段名不存在或访问数据库错误时抛出
*/
publiclonggetCurrentKeyLong(StringtableName,StringkeyName,
Connectionconn)throwsKeyException{
KeyInfokeyinfo;
Stringitem=tableName+"."+keyName;
try{
synchronized(keyList){
if(keyList.containsKey(item)){
keyinfo=(KeyInfo)keyList.get(item);
}else{
keyinfo=newKeyInfo(tableName,keyName,conn);
keyList.put(item,keyinfo);
}
}
returnkeyinfo.getCurrentKey();
}catch(SQLExceptionsqle){
thrownewKeyException(sqle);
}
}
/**
*用指定的"表<code>.</code>字段"形式的字符串获得key的当前值,主键的值不得超过2147483647
*
*@paramtableDotField
*"表.字段"形式的字符串,如:message.id
*@paramconn
*JDBC连接,如果欲获得的key是第一次取值,则必须保证conn能连接到数据库
*@returnkey的当前int值
*@throws<code>KeyException</code>如果表名或字段名不存在、访问数据库错误或key的值
*大于2147483647时抛出
*/
publicintgetCurrentKey(StringtableDotField,Connectionconn)
throwsKeyException{
longvalue=getCurrentKeyLong(tableDotField,conn);
if(value>2147483647L){
thrownewKeyException(
"Key'svaluetoobig,!");
}
return(newLong(value)).intValue();
}
/**
*用指定的"表<code>.</code>字段"形式的字符串获得key的当前值,最大为9223372036854775807
*
*@paramtableDotField
*"表.字段"形式的字符串,如:message.id
*@paramconn
*JDBC连接,如果欲获得的key是第一次取值,则必须保证conn能连接到数据库
*@returnkey的当前int值
*@throws<code>KeyException</code>如果表名或字段名不存在或访问数据库错误时抛出
*/
publiclonggetCurrentKeyLong(StringtableDotField,Connectionconn)
throwsKeyException{
intdot_index=tableDotField.indexOf(".");
if(tableDotField.indexOf(".")<1){
thrownewKeyException("UnknownKey'"+tableDotField+"'!");
}
Stringtab=tableDotField.substring(0,dot_index);
Stringkey=tableDotField.substring(dot_index);
returngetCurrentKeyLong(tab,key,conn);
}
}
/**
*内部类,用来存储主键信息
**/
classKeyInfo{
privatelongmax=9223372036854775807L;
privatelongmin=1L;
privatelongnextKey;
privateStringtableName;
privateStringkeyName;
privateConnectionconn=null;
/**
*keyInfo对象初始化
*
*@throwsKeyException
*/
KeyInfo(StringtableName,StringkeyName,Connection_conn)
throwsSQLException,KeyException{
this.tableName=tableName;
this.keyName=keyName;
this.conn=_conn;
retrieveFromDB();
}
intgetMax(){
return(newLong(max)).intValue();
}
longgetMaxLong(){
returnmax;
}
intgetMin(){
return(newLong(min)).intValue();
}
longgetMinLong(){
returnmin;
}
/**
*取下一键值
*/
intgetNextKey(){
return(newLong(getNextKeyLong())).intValue();
}
/**
*取下一键值
*/
(){
nextKey++;
returnnextKey;
}
/**
*取当前键值
*/
synchronizedintgetCurrentKey(){
return(newLong(nextKey)).intValue();
}
/**
*取当前键值
*/
(){
returnnextKey;
}
/**
*从数据库中取当前最大值
*
*@throwsKeyException
*/
voidretrieveFromDB()throwsSQLException,KeyException{
PreparedStatementpstmt=null;
ResultSetrs=null;
Stringsql="selectmax("+keyName+")from"+tableName;
try{
pstmt=conn.prepareStatement(sql);
}catch(Exceptionex){
thrownewKeyException("Can'tconnectDataBase!");
}
try{
rs=pstmt.executeQuery();
}catch(SQLExceptionsqle){
if(pstmt!=null)
pstmt.close();
thrownewKeyException("'"+keyName+"'or'"+tableName
+"'isn'texistinDataBase!",sqle);
}
try{
if(rs.next()){
nextKey=rs.getLong(1);
if(nextKey<min){
nextKey=min;
}
}else{
nextKey=min;
}
}catch(SQLExceptionsqle){
throw(sqle);
}finally{
if(rs!=null)
rs.close();
if(pstmt!=null)
pstmt.close();
}
}
}
B. java里注册时候邀请码是按什么算法生成的,还有邀请码只用一次怎么限制
存放数据库啊,有A B 和验证码,不就是一一对应了吗,邀请吗用一次查一下数据库,有就不能使用
C. java怎么设计查找快要到期的优惠券
Date d1 = new Date();//当前的时间,java.util.Date类
System.out.println(d1.getHours());
d1.setTime(d1.getTime()+60*60l*1000);//这个是给你演示如何加1个小时,你进行比较的时候,将两个都getTime,得专出属的是毫秒,你相减自然就知道是否快到期了
System.out.println(d1.getHours());
D. 用java写出商品打折程序
尝试解答一下,这个里面还有老年和教师的判断就省略,主要是打折的代码
importjava.util.Scanner;
classTest{
publicstaticvoidmain(String[]args){
Scannersc=newScanner(System.in);
System.out.println("请输入消费的金额:");
doubleoldprice=sc.nextDouble();
doublenewprice;
if(oldprice>=2000){
newprice=oldprice*0.85;
}elseif(oldprice>=1000&&oldprice<2000){
newprice=oldprice*0.9;
}else
newprice=oldprice;
Judgejud=newJudge();
if(jud.isTeacher()||jud.isOldman())
newprice=newprice*0.95;
System.out.println("打折后的价格是:"+newprice);
System.out.println("折扣的程度是:"+newprice/oldprice);
}
}
classJudge{
publicbooleanisTeacher(){
booleanisTeacher=false;
returnisTeacher;
}
publicbooleanisOldman(){
booleanisOld=false;
returnisOld;
}
}
E. 怎么批量生成优惠券的编码
用软件
F. java打折程序,有几个不明白,能帮忙写下源代码吗
import java.util.*;
public class dazhe{
static void main(String[] arg0){
Scanner in=new Scanner(System.in);
String huiyuan;double jiner;
System.out.println("***************打折系统**************:");
System.out.println("请输入是否是会员:是(y)/否(其他字符)");
huiyuan=in.next();
System.out.println("请输入购物金额");
jiner=in.nextDouble();
System.out.println((int)jiner);
if(huiyuan=="y")
{
if(jiner>=100&jiner<=200)
{ jiner=jiner*0.8;
System.out.println("实付金额:");
System.out.println((int)jiner);}
else if(jiner>200)
{
jiner=jiner*0.75;
System.out.println("实付金额:");
System.out.println((int)jiner);
}
else if(jiner>=100)
{
jiner=jiner*0.85;
System.out.println("实付金额:");
System.out.println(jiner);}
}
else {System.out.println("实付金额:");
System.out.println(jiner);}
}
}
G. java 生成十位数奖品兑换码,该怎么处理
//生成十位数奖品兑换码
publicstaticvoidtest13()throwsException{
intcount=10;
Stringstr="";
StringBuildersb=newStringBuilder();
Randomr=newRandom(System.currentTimeMillis());
for(inti=0;i<count;i++){
intd=r.nextInt(62);
sb.append(str.charAt(d));
}
System.out.println(sb.toString());
}
H. 团购网生成优惠券/优惠码的算法是什么
我观察就是随即生成。
因为这种优惠券造假成分不是很大,所以没有必要在这方面下功夫
I. 淘宝优惠券代码怎么生成
这个优惠券是提取不了的,只能再次购买时可以附加上去
这样就可以优惠的