论坛首页 入门技术论坛

关于数据库表的无重复随机ID的生成讨论(附代码)

浏览 3424 次
该帖已经被评为新手帖
作者 正文
   发表时间:2007-08-13  
本人编码经验不多,所以拿出自己(异想天开)的代码给大家批评下,让批评指正来的更猛烈些吧
大家有什么更好的实现方法也可以给小弟共享下,谢谢; 

作用:业务层 传一个 POJO对象 给 DAO

DAO 直接将其插入数据库;

1.IdFactory 类生成 随机无重复ID
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class IdFactory {

	private static List<Integer> idList = new ArrayList();

	private static int idIndex = 0;

	// 每次生成id数
	private int ID_CREATE_NUMBER;

	// id的位数
	private int ID_Max_POINT;
	
	private ObjectId objectId;
	
	private Random random;
	public IdFactory(ObjectId objectId){
		this.objectId = objectId;
		init();
	}

	private void init() {
		this.ID_CREATE_NUMBER = objectId.ID_CREATE_NUMBER;
		this.ID_Max_POINT = (int) Math.pow(10,objectId.ID_POSITION + 1);
		
		this.idList = objectId.getIdList();
		this.idIndex = objectId.getIdIndex();
	}

	public String getId() {
		if (idList.size() <= idIndex) {
			createId(ID_CREATE_NUMBER);
		}
		return idList.get(idIndex ++).toString();
	}

	private void createId(int number) {
		random = new Random();
		int size = idList.size();

		int id = 0;

		for (int i = 0; i < ID_CREATE_NUMBER; i++) {
			id = random.nextInt(ID_Max_POINT);
			while (idList.contains(id)) {
				id = random.nextInt(ID_Max_POINT);
			}
			idList.add(id);
		}
	}
	
	public List getIdList(){
		return this.idList;
	}
	
	public static void main(String[] args){
		MessageId message = new MessageId();
		UserId user = new UserId();
		
		message.ID_POSITION = 3;
		
		IdFactory factory1 = new IdFactory(message);
		IdFactory factory2 = new IdFactory(user);
		
		System.out.println(factory1.getId());
		System.out.println(factory2.getId());
	}
}


2.ID对象的父类
import java.util.ArrayList;
import java.util.List;

public class ObjectId {

	private static List<Integer> idList = new ArrayList();

	private static int idIndex = 0;

	// 每次生成id数
	public final int ID_CREATE_NUMBER = 100;

	// id的位数
	public  int ID_POSITION = 6;

	public static int getIdIndex() {
		return idIndex;
	}

	public static void setIdIndex(int idIndex) {
		ObjectId.idIndex = idIndex;
	}

	public static List<Integer> getIdList() {
		return idList;
	}

	public static void setIdList(List<Integer> idList) {
		ObjectId.idList = idList;
	}
	
}


3.具体ID对象类(用户表User)
public class UserId extends ObjectId {
	
}


4.具体方法得到ID(这里是UserId)
UserId user = new UserId();		
user.ID_POSITION = 3;
IdFactory factory = new IdFactory(message);
   发表时间:2007-08-13  
Why not use GUID?
0 请登录后投票
   发表时间:2007-08-13  
1.GUID的过于复杂,不适合做ID(不会采用分布式数据库)
2.本人关键想知道,如果在 POJO 中差入一个 ID 的话,应该怎么实现才合理
3.上面的代码有一个问题的问题,父类的静态变量会给所有的子类共享;
0 请登录后投票
   发表时间:2007-08-14  
感觉 入门讨论 没有什么人气,都要被气死了。。。
0 请登录后投票
   发表时间:2007-08-14  
说实话,不知道你要干什么。

先说说你为什么这样做,这样做有什么好处。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics