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()); } }
相关文章: