搭建java代码框架
引入辅助类和基类
PKgen为 PK 生成器
package net.sw.util;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
*
* 用来生成唯一的PK
* 该 PK 生成器生成 19 位的唯一 long 值,精确到万分之一秒,
* 最后一位为尾数,用来在集群环境下保证PK的唯一性。
*
* 该PK生成虽然依赖于时间,但是在运行过程中改变时间不会影响PK,
* 但是如果将系统时间后调,然后重新启动,有可能造成PK重复。
*
* 该 PK 生成器不依赖于数据库,相比依赖数据表的PK生成器,速度快,而且值可读
*
* @author <a href="mailto:yang_y@sysnet.com.cn">Young Yang</a>
*/
public class PKgen {
/**
* PK生成锁,用来限定同一时刻只有一个线程进入PK生成计算
*/
private final Lock LOCK = new ReentrantLock();
/**
* 初始化时的毫秒数,因为该时间会随系统时间的改变而改变,
* 所以计算方法为该时间加上通过 nanoTime 计算出来的时间差
*/
private final static Long startMilli = System.currentTimeMillis();
/**
* 初始化时的纳秒数,用来计量时间差,nanoTime不会随着系统时间的修改而改变
*/
private final static long startNano = System.nanoTime();
/**
* 记录上一次生成 的 PK,如果新生成的PK和上次相等,则需要再次生成
*/
private volatile long lastPK = -1;
//private final static SimpleDateFormat dateFormat = new SimpleDateFormat(
// "yyyyMMddHHmmssSSS");
private final static SimpleDateFormat dateFormat = new SimpleDateFormat(
"yyMMddHHmmssSSS");
/**
* 返回的long PK的尾数,尾数可以用来在集群环境中判断该PK由哪一个节点产生
* 尾数通过配置设定
*/
private int suffix = 0;
private static final Map<Integer, PKgen> instanceMap = new HashMap<Integer, PKgen>();
// 必须提供正确的参数,以保证 suffix 在机群环境的唯一性
private PKgen(int suffix) {
this.suffix = suffix;
}
public synchronized static PKgen getInstance() {
return getInstance(0);
}
/**
* 单机环境下,应该保证用相同的 suffix
* 在集群环境中,不同的机器必须提供不同的 suffix 来保证生成的ID的唯一性
* @param suffix
* 唯一标识好
*/
public synchronized static PKgen getInstance(int suffix) {
PKgen pkgen;
if (!instanceMap.containsKey(suffix)) {
pkgen = new PKgen(suffix);
instanceMap.put(suffix, pkgen);
}
else {
pkgen = instanceMap.get(suffix);
}
return pkgen;
}
/**
* 返回下一个 long 型 PK, format: 2006111423361344491 <br>
* yyyyMMddHHmmssSSS + Macro Seconds + suffix
* @return long PK
*/
public long nextPK() {
LOCK.lock();
try {
long newPK;
do {
long pastNano = System.nanoTime() - startNano; // 纳秒时间差
long milliTime = pastNano / 1000000; // 取得毫秒差
long macroTime = (pastNano / 100000) % 10; // 取得微秒第一位,
// 计算出来的long PK,精度到万分之一秒(百微妙),加上尾数,一共19位,这是 Long.MAX_VALUE的最大位数了
newPK = Long.parseLong(dateFormat.format(new Date(startMilli
+ milliTime))
+ macroTime + suffix);
}
while (lastPK == newPK); // 如果生成的相同,则再次计算
lastPK = newPK; // 设置 lastPK
return newPK;
}
finally {
LOCK.unlock();
}
}
public static void main(String[] args) throws Exception {
PKgen pkg = PKgen.getInstance(0);
int i = 0;
long now = System.currentTimeMillis();
while (i++ < 10) {
System.out.println(pkg.nextPK());
}
System.out.println("Time: " + (System.currentTimeMillis() - now));
}
}
如注释所述该 PK 生成器生成 19 位的long值,java中的Long在Flex中将转换为Number。Flex的Nubmer类型能精确处理的数据只有17位,所以注意43到46行,我在此处做了一点改动屏蔽了年的前两位,这样生成的 PK 实际上位17位。
BaseDomain
package net.sw.base.domain;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
/**
* 领域对象基类
*
* @author vyyv
*
*/
@SuppressWarnings("serial")
@MappedSuperclass
public abstract class BaseDomain implements java.io.Serializable {
public BaseDomain() {
// 对象有可能是在客户端由flex生成,不会执行这个构造方法,所以不能在此处添加ID
// this.id = PKgen.getInstance(0).nextPK();
this.id=new Long(0);
}
/**
* 领域对象编码
*/
@Id
@Column
Long id;
/**
* 领域对象名称
*/
@Column
String name;
/**
* 领域对象描述
*/
@Column
String description;
/**
* 领域对象创建时间
*/
@Column
Date createtime;
(setter getter 略)
........... ............
}
GenericDao
package net.sw.base.dao;
import java.io.Serializable;
import java.util.List;
/**
*
* @author vyyv
* @param <T>
* a type variable
* @param <PK>
* the primary key for that type
*/
public interface GenericDao<T, PK extends Serializable> {
/**
* 获取所有对象实例
* @return 由所有对象实例组成的List
*/
List<T> getAll();
/**
* 获取一个对象实例
* 如果不存在抛出ObjectRetrievalFailureException
* @param id 对象ID
* @return 一个对象实例
* @see org.springframework.orm.ObjectRetrievalFailureException
*/
T get(PK id);
/**
* 判断对象实例是否存在
*@param id 对象ID
* @return - 存在返回true,不存在返回false
*/
boolean exists(PK id);
/**
* 保存对象实例 - 新建或更新
* @param object 需要保存的对象
* @return 保存之后的对象(保存的动作可能会修改对象,例如:ID,createtime)
*/
T save(T object);
/**
* 删除对象实例
* @param id
*/
void remove(PK id);
}
GenericManager
package net.sw.base.service;
import java.io.Serializable;
import java.util.List;
/**
*
* @author vyyv</a>
* @param <T>
* a type variable
* @param <PK>
* the primary key for that type
*/
public interface GenericManager<T, PK extends Serializable> {
/**
* 获取所有对象实例
* @return 由所有对象实例组成的List
*/
List<T> getAll();
/**
* 根据ID获取一个对象实例
* @param id 对象ID
* @return 一个对象实例
*/
T get(PK id);
/**
* 判断对象实例是否存在
*@param id 对象ID
* @return - 存在返回true,不存在返回false
*/
boolean exists(PK id);
/**
* 保存对象实例 - 新建或更新
* @param object 需要保存的对象
* @return 保存之后的对象(保存的动作可能会修改对象,例如:ID,createtime)
*/
T save(T object);
/**
* 删除对象实例
* @param id
*/
void remove(PK id);
}
- 大小: 18.5 KB
- 大小: 28.4 KB
分享到:
相关推荐
《构建电子相册系统:Spring、Hibernate、Servlet与jQuery的深度整合》 在现代互联网应用中,电子相册系统已经成为用户存储、分享个人照片的重要平台。本系统利用Java技术栈,结合Spring、Hibernate、Servlet和...
Struts 2、Hibernate 和 Spring 是Java开发中的三大框架,它们在企业级应用开发中扮演着重要的角色。Struts 2 提供了MVC(Model-View-Controller)设计模式的实现,帮助开发者构建可维护性和扩展性良好的Web应用程序...
SSH框架,全称Struts2+Spring+Hibernate,是Java开发中常用的一种企业级应用开发框架组合。它整合了三大框架的优势,为开发者提供了一种高效、灵活且稳定的开发环境。在这个“个人网络相册_ssh框架”项目中,我们将...
这个压缩包文件"ASP网站实例开发源码——会员功能强大的图片储存网络相册SQL版本.rar"包含了一个使用ASP技术构建的网络相册应用,它集成了SQL数据库来存储和管理用户上传的图片。 1. **ASP基础概念**:ASP是...
在当今互联网技术日新月异的时代,Web应用程序的开发框架不断涌现,其中Struts、Hibernate和Spring组成的SSH(Struts2+Hibernate3+Spring3)框架因其强大的功能和灵活的架构,成为企业级应用开发的热门选择。...
Iphone开发系列源码——Image图片缩放随着手指Iphone开发系列源码——Image图片缩放随着手指Iphone开发系列源码——Image图片缩放随着手指Iphone开发系列源码——Image图片缩放随着手指Iphone开发系列源码——Image...
基于韩顺平.2011版校园网项目视频采用新的框架重构,并且完善了功能, (使用springMvc + spring +hibernate重构),支持用户登录,注册,头像的更改,个人信息更改,相册照片上传,增删改查,日志增删改查,发表日志...
它不仅支持C++语言,还包含了MFC(Microsoft Foundation Classes)库,这是一个强大的Windows应用程序开发框架。MFC简化了窗口、对话框、控件等Windows组件的创建,使得开发者能够更专注于业务逻辑的实现。 在个人...
主要功能说明: 管理员角色包含以下功能:管理员登陆,用户信息... 用户角色包含以下功能:用户登陆,个人信息管理,相册管理,上传照片等功能。 用了技术框架: HTML+CSS+JavaScript+jsp+mysql+Spring+hibernate+Struts 2
(JavaWeb基于SSM框架的毕业设计)讯友网络相册.zip(JavaWeb基于SSM框架的毕业设计)讯友网络相册.zip(JavaWeb基于SSM框架的毕业设计)讯友网络相册.zip(JavaWeb基于SSM框架的毕业设计)讯友网络相册.zip(JavaWeb基于SSM...
电子相册管理系统——软件工程课程设.doc
2、不要回拨 网络安全知识手册——生活篇全文共3页,当前为第3页。网络安全知识手册——生活篇全文共3页,当前为第3页。陌生信息提供的联系方式,不要致电联系。 网络安全知识手册——生活篇全文共3页,当前为第3页...
本文将深入探讨如何利用Spring Boot框架构建一个高效、稳定的网络相册系统。Spring Boot以其便捷的配置、强大的依赖管理和灵活的扩展性,成为现代Java开发的首选框架之一。 一、Spring Boot基础知识 Spring Boot是...
这是一个基于ASP技术的网站实例开发源码,专为创建一个具有强大图片存储功能的网络相册而设计。这个项目使用了SQL数据库来管理和存储用户上传的图片,提供了丰富的会员功能,使得用户可以方便地上传、修改和查看他们...
这个"ASP实例开发网站源码——测试完整无错的个人网络相册带后台管理.zip"压缩包包含了实现一个功能完备、无错误的个人网络相册的全部源代码,适合初学者学习和开发者参考。 首先,让我们深入了解一下ASP的关键概念...
**相册框架——百度图片JS框架详解** 在互联网应用中,图片展示往往占据了重要的地位,尤其是在社交媒体、电子商务、个人博客等场景。为了提供良好的用户体验,高效、美观且功能丰富的图片展示框架应运而生。其中,...
JavaEE企业开发框架,JEEFW,是一种专为快速构建B/S系统而设计的框架,其特点是采用流行的前端技术Bootstrap,使得开发人员可以快速适应并实现跨设备兼容性,适用于各种项目类型,如网站、OA、ERP、CRM及APP后台等。...
在这篇论文中,我们将使用 Java 语言和 Spring Boot 框架来设计和实现一个网络相册系统。 Spring Boot 框架的主要特点是简化了 Java 企业级应用程序的开发,使得开发者可以快速构建生产级别的应用程序。Spring ...