自己想的几种生成数据库主键的方式

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.Random;
import java.util.UUID;
 
/**
 * 用来测试生成主键不同方式,
 *
 */
public class GenerateKey {
 
    /**
     * 第一种生成32位字符串主键
     * @return
     */
    public String getPrimaryKey() {
        UUID ui = UUID.randomUUID();
        return (ui.toString());
    }
 
    /**
     * 生成10长度的主键,不过这种做法问题可能会比较大,
     * 1.个人不知道会不会产生重复的值(应该会的).
     * 2.产生的值会使数据库中键值编号中间间距会比较大.
     * @return
     */
    public int getIntPrimaryKey() {
        int key;
        Date d = new Date();
        Random r = new Random(d.getTime());
        key = r.nextInt();
        if (key < 0) {
            key = ~ key;
        }
        if (key == 0) {
            getIntPrimaryKey();
        }
        return (key);
    }
 
    /**
     * 第三种方法,得到产生的主键,
     * 从数据库中,得到值,
     * 但这种也会存在性能问题,每次都会查询一次.故另一种做法是
     * 一次取出几十个值,然后绊缓存之,等待后用.
     * @return
     */
    public int getIntKey(String tableName) {
        //String tableName = "t_user";//要查的数据库表
        String sql = "select max(u_id) m from " + tableName;
 
        Connection conn = DBUtils.getConnection();//此处就是连接数据库
        ResultSet rs = null;
        PreparedStatement ptmt  = null;
        int key = 0;
        try {
            ptmt = conn.prepareCall(sql);
            rs = ptmt.executeQuery();
            if (rs.next()) {
                key = rs.getInt("m");
            } else {
                key = 200000;//如果数据库中没有值,则可以自定义从这个值开始
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return (key);
    }
 
    public static void main(String[] args) {
        GenerateKey key = new GenerateKey();
        System.out.println(key.getIntPrimaryKey());
    }
}
posted @ 2012-07-03 10:29  xianyuan  阅读(374)  评论(0编辑  收藏  举报