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());
}
}