Java主键序列生成,需求如下.

Java主键序列生成,需求如下.,第1张

思路:

序列生成方法入参必须有上级菜单序列、菜单级别;如果是一级菜单上级菜单序列为空

引入数据库或者文件保存已生成的菜单,两个方法,一个读,一个写,注意并发 *** 作(加同步锁)

每次调用序列生成方法时根据上级菜单序列创建其他菜单,,如果上级菜单序列为空时读取文件取最大上级菜单序列再加1,否则直接递增子菜单再写入文件

import javautilHashMap;

import javasecurityKeyException;

import javasqlConnection;

import javasqlPreparedStatement;

import javasqlResultSet;

import javasqlSQLException;

/

  类<code>Key</code>是一个数据库主键生成器,用序列号的方式来产生数据库中需要的主键值。

  <p>

  <code>Key</code>目前支持的数据库包括Oracle的所有版本、MySql的3x以上的版本

  以及所有支持max()函数的数据库,支持字段类型仅为数字类型的主键,对于字符及其它类型的主键尚不提供支持。

  <p>

  在使用时只需提供表名、字段名(主键)以及到数据库的JDBC连接,如果想要获得message表的id字段的下一个 主键值时:

  <p>

  <blockquote>

  

  <pre>

      javasqlConnection conn = ;

      orgshaoyecommonsqlKey key = orgshaoyecommonsqlKeygetInstance();

      int keyValue = keygetNextKey("message", "id", conn);

      String sql = "insert into message (id,) values (" + keyValue + ",)";

      //执行插入 *** 作

  </pre>

  

  </blockquote>

  <p>

  

  @author 令少爷(shaoye@vipsinacom)

  @since magic 01

 /

public final class Key {

/

  key的最大值,默认为9223372036854775807,即long类型的最大值

 /

private long max = 9223372036854775807L;

/

  key的最小值,默认为1

  /

private long min = 1L;

/

  Key的唯一实例,通过getInstance()方法获得

  /

private static Key keygen = new Key();

/

  KeyInfo类的实例列表,默认容量为5个

  /

private HashMap<String, KeyInfo> keyList = new HashMap<String, KeyInfo>(5); // keyInfo

// 列表

/

  私有的默认构造方法,防止外部构造类的实例

  /

private Key() {

}

/

  获得Key的唯一实例

  /

public static Key getInstance() {

return keygen;

}

/

  用指定的表和字段获得key的下一个值,主键的值不得超过2147483647

  

  @param tableName

             数据库中的表名,表中必须有一个数字主键

  @param keyName

             表(tableName)中的字段名

  @param conn

             JDBC连接,如果欲获得的key是第一次取值,则必须保证conn能连接到数据库

  @return key的下一个主键的int值

  @throws <code>KeyException</code>

          如果表名或字段名不存在、访问数据库错误或key的值大于2147483647时抛出

 /

public int getNextKey(String tableName, String keyName, Connection conn)

throws KeyException {

long value = getNextKeyLong(tableName, keyName, conn);

if (value > 2147483647L) {

throw new KeyException(

"Key's value too big,please call getNextKeyLong method!");

}

return (new Long(value))intValue();

}

/

  用指定的表和字段获得key的下一个值,最大为9223372036854775807

  @param tableName 数据库中的表名,表中必须有一个数字主键

  @param keyName 表(tableName)中的字段名

  @param conn JDBC连接,如果欲获得的key是第一次取值,则必须保证conn能连接到数据库

  @return key的下一个主键的long值

  @throws <code>KeyException</code> 如果表名或字段名不存在或访问数据库错误时抛出

 /

public long getNextKeyLong(String tableName, String keyName, Connection conn)

throws KeyException {

KeyInfo keyinfo;

String item = tableName + "" + keyName;

try {

if (keyListcontainsKey(item)) {

keyinfo = (KeyInfo) keyListget(item);

} else {

keyinfo = new KeyInfo(tableName, keyName, conn);

keyListput(item, keyinfo);

}

return keyinfogetNextKey();

} catch (SQLException sqle) {

throw new KeyException(sqle);

}

}

/

  用指定的"表<code></code>字段"形式的字符串获得key的下一个值,主键的值不得超过2147483647

  @param tableDotField "表字段"形式的字符串,如:messageid

  @param conn JDBC连接,如果欲获得的key是第一次取值,则必须保证conn能连接到数据库

  @return key的下一个主键的int值

  @throws <code>KeyException</code> 如果表名或字段名不存在、访问数据库错误或key的值 大于2147483647时抛出

 /

public int getNextKey(String tableDotField, Connection conn)

throws KeyException {

long value = getNextKeyLong(tableDotField, conn);

if (value > 2147483647L) {

throw new KeyException(

"Key's value too big,please call getNextKeyLong method!");

}

return (new Long(value))intValue();

}

/

  用指定的"表<code></code>字段"形式的字符串获得key的下一个值,最大为9223372036854775807

  @param tableDotField "表字段"形式的字符串,如:messageid

  @param conn JDBC连接,如果欲获得的key是第一次取值,则必须保证conn能连接到数据库

  @return key的下一个主键的int值

  @throws <code>KeyException</code> 如果表名或字段名不存在或访问数据库错误时抛出

 /

public long getNextKeyLong(String tableDotField, Connection conn)

throws KeyException {

int dot_index = tableDotFieldindexOf("");

if (tableDotFieldindexOf("") < 1) {

throw new KeyException("Unknown Key '" + tableDotField + "'!");

}

String tab = tableDotFieldsubstring(0, dot_index);

String key = tableDotFieldsubstring(dot_index);

return getNextKeyLong(tab, key, conn);

}

/

  用指定的表和字段获得key的当前值,主键的值不得超过2147483647

  @param tableName 数据库中的表名,表中必须有一个数字主键

  @param keyName 表(tableName)中的字段名

  @param conn JDBC连接,如果欲获得的key是第一次取值,则必须保证conn能连接到数据库

  @return key的当前int值

  @throws <code>KeyException</code>

          如果表名或字段名不存在、访问数据库错误或key的值大于2147483647时抛出

 /

public int getCurrentKey(String tableName, String keyName, Connection conn)

throws KeyException {

long value = getCurrentKeyLong(tableName, keyName, conn);

if (value > 2147483647L) {

throw new KeyException(

"Key's value too big,please call getCurrentKeyLong method!");

}

return (new Long(value))intValue();

}

/

  用指定的表和字段获得key的当前值,最大为9223372036854775807

  

  @param tableName

             数据库中的表名,表中必须有一个数字主键

  @param keyName

             表(tableName)中的字段名

  @param conn

             JDBC连接,如果欲获得的key是第一次取值,则必须保证conn能连接到数据库

  @return key的当前long值

  @throws <code>KeyException</code> 如果表名或字段名不存在或访问数据库错误时抛出

 /

public long getCurrentKeyLong(String tableName, String keyName,

Connection conn) throws KeyException {

KeyInfo keyinfo;

String item = tableName + "" + keyName;

try {

synchronized (keyList) {

if (keyListcontainsKey(item)) {

keyinfo = (KeyInfo) keyListget(item);

} else {

keyinfo = new KeyInfo(tableName, keyName, conn);

keyListput(item, keyinfo);

}

}

return keyinfogetCurrentKey();

} catch (SQLException sqle) {

throw new KeyException(sqle);

}

}

/

  用指定的"表<code></code>字段"形式的字符串获得key的当前值,主键的值不得超过2147483647

  

  @param tableDotField

             "表字段"形式的字符串,如:messageid

  @param conn

             JDBC连接,如果欲获得的key是第一次取值,则必须保证conn能连接到数据库

  @return key的当前int值

  @throws <code>KeyException</code> 如果表名或字段名不存在、访问数据库错误或key的值

          大于2147483647时抛出

 /

public int getCurrentKey(String tableDotField, Connection conn)

throws KeyException {

long value = getCurrentKeyLong(tableDotField, conn);

if (value > 2147483647L) {

throw new KeyException(

"Key's value too big,please call getNextKeyLong method!");

}

return (new Long(value))intValue();

}

/

  用指定的"表<code></code>字段"形式的字符串获得key的当前值,最大为9223372036854775807

  

  @param tableDotField

             "表字段"形式的字符串,如:messageid

  @param conn

             JDBC连接,如果欲获得的key是第一次取值,则必须保证conn能连接到数据库

  @return key的当前int值

  @throws <code>KeyException</code> 如果表名或字段名不存在或访问数据库错误时抛出

 /

public long getCurrentKeyLong(String tableDotField, Connection conn)

throws KeyException {

int dot_index = tableDotFieldindexOf("");

if (tableDotFieldindexOf("") < 1) {

throw new KeyException("Unknown Key '" + tableDotField + "'!");

}

String tab = tableDotFieldsubstring(0, dot_index);

String key = tableDotFieldsubstring(dot_index);

return getCurrentKeyLong(tab, key, conn);

}

}

/

  内部类,用来存储主键信息

  /

class KeyInfo {

private long max = 9223372036854775807L;

private long min = 1L;

private long nextKey;

private String tableName;

private String keyName;

private Connection conn = null;

/

  keyInfo 对象初始化

  

  @throws KeyException

 /

KeyInfo(String tableName, String keyName, Connection _conn)

throws SQLException, KeyException {

thistableName = tableName;

thiskeyName = keyName;

thisconn = _conn;

retrieveFromDB();

}

int getMax() {

return (new Long(max))intValue();

}

long getMaxLong() {

return max;

}

int getMin() {

return (new Long(min))intValue();

}

long getMinLong() {

return min;

}

/

  取下一键值

 /

int getNextKey() {

return (new Long(getNextKeyLong()))intValue();

}

/

  取下一键值

 /

synchronized long getNextKeyLong() {

nextKey++;

return nextKey;

}

/

  取当前键值

 /

synchronized int getCurrentKey() {

return (new Long(nextKey))intValue();

}

/

  取当前键值

 /

synchronized long getCurrentKeyLong() {

return nextKey;

}

/

  从数据库中取当前最大值

  

  @throws KeyException

 /

void retrieveFromDB() throws SQLException, KeyException {

PreparedStatement pstmt = null;

ResultSet rs = null;

String sql = "select max(" + keyName + ") from " + tableName;

try {

pstmt = connprepareStatement(sql);

} catch (Exception ex) {

throw new KeyException("Can't connect DataBase!");

}

try {

rs = pstmtexecuteQuery();

} catch (SQLException sqle) {

if (pstmt != null)

pstmtclose();

throw new KeyException("'" + keyName + "' or '" + tableName

+ "' isn't exist in DataBase!", sqle);

}

try {

if (rsnext()) {

nextKey = rsgetLong(1);

if (nextKey < min) {

nextKey = min;

}

} else {

nextKey = min;

}

} catch (SQLException sqle) {

throw (sqle);

} finally {

if (rs != null)

rsclose();

if (pstmt != null)

pstmtclose();

}

}

}

你序列化那个id,作用是Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。

你用到序列化 是想把对象转换成二进制流传输出去?还是想把从内存中恢复对象什么的啊?

你肯定有这方面需求呗!演不然也用不到序列化啊!自个写的代码你问谁啊

以上就是关于Java主键序列生成,需求如下.全部的内容,包括:Java主键序列生成,需求如下.、求助大神,要求用java代码写一个序列生成器、java通过查询一条数据库记录是为什么要用序列化声明id,它比int的优势在哪等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10163989.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存