思路:
序列生成方法入参必须有上级菜单序列、菜单级别;如果是一级菜单上级菜单序列为空
引入数据库或者文件保存已生成的菜单,两个方法,一个读,一个写,注意并发 *** 作(加同步锁)
每次调用序列生成方法时根据上级菜单序列创建其他菜单,,如果上级菜单序列为空时读取文件取最大上级菜单序列再加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的优势在哪等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)