`
vyyv
  • 浏览: 17601 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

网络相册开发(2)——Spring,SPA,Hibernate框架

    博客分类:
  • Flex
阅读更多

搭建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

    《构建电子相册系统:Spring、Hibernate、Servlet与jQuery的深度整合》 在现代互联网应用中,电子相册系统已经成为用户存储、分享个人照片的重要平台。本系统利用Java技术栈,结合Spring、Hibernate、Servlet和...

    Struts 2+Hibernate+Spring整合开发技术详解随书源码

    Struts 2、Hibernate 和 Spring 是Java开发中的三大框架,它们在企业级应用开发中扮演着重要的角色。Struts 2 提供了MVC(Model-View-Controller)设计模式的实现,帮助开发者构建可维护性和扩展性良好的Web应用程序...

    个人网络相册_ssh框架

    SSH框架,全称Struts2+Spring+Hibernate,是Java开发中常用的一种企业级应用开发框架组合。它整合了三大框架的优势,为开发者提供了一种高效、灵活且稳定的开发环境。在这个“个人网络相册_ssh框架”项目中,我们将...

    ASP网站实例开发源码——会员功能强大的图片储存网络相册SQL版本.rar

    这个压缩包文件"ASP网站实例开发源码——会员功能强大的图片储存网络相册SQL版本.rar"包含了一个使用ASP技术构建的网络相册应用,它集成了SQL数据库来存储和管理用户上传的图片。 1. **ASP基础概念**:ASP是...

    struts-hibernate-spring网络电子相册

    在当今互联网技术日新月异的时代,Web应用程序的开发框架不断涌现,其中Struts、Hibernate和Spring组成的SSH(Struts2+Hibernate3+Spring3)框架因其强大的功能和灵活的架构,成为企业级应用开发的热门选择。...

    Iphone开发系列源码——Image图片缩放随着手指

    Iphone开发系列源码——Image图片缩放随着手指Iphone开发系列源码——Image图片缩放随着手指Iphone开发系列源码——Image图片缩放随着手指Iphone开发系列源码——Image图片缩放随着手指Iphone开发系列源码——Image...

    校园网项目(使用springMvc + spring +hibernate重构)

    基于韩顺平.2011版校园网项目视频采用新的框架重构,并且完善了功能, (使用springMvc + spring +hibernate重构),支持用户登录,注册,头像的更改,个人信息更改,相册照片上传,增删改查,日志增删改查,发表日志...

    个人相册管理系统————VC++

    它不仅支持C++语言,还包含了MFC(Microsoft Foundation Classes)库,这是一个强大的Windows应用程序开发框架。MFC简化了窗口、对话框、控件等Windows组件的创建,使得开发者能够更专注于业务逻辑的实现。 在个人...

    基于jsp+mysql+Spring+hibernate+Struts 2的SSH电子相册管理系统

    主要功能说明: 管理员角色包含以下功能:管理员登陆,用户信息... 用户角色包含以下功能:用户登陆,个人信息管理,相册管理,上传照片等功能。 用了技术框架: HTML+CSS+JavaScript+jsp+mysql+Spring+hibernate+Struts 2

    (JavaWeb基于SSM框架的毕业设计)讯友网络相册.zip

    (JavaWeb基于SSM框架的毕业设计)讯友网络相册.zip(JavaWeb基于SSM框架的毕业设计)讯友网络相册.zip(JavaWeb基于SSM框架的毕业设计)讯友网络相册.zip(JavaWeb基于SSM框架的毕业设计)讯友网络相册.zip(JavaWeb基于SSM...

    电子相册管理系统——软件工程课程设.doc

    电子相册管理系统——软件工程课程设.doc

    网络安全知识手册——生活篇.docx

    2、不要回拨 网络安全知识手册——生活篇全文共3页,当前为第3页。网络安全知识手册——生活篇全文共3页,当前为第3页。陌生信息提供的联系方式,不要致电联系。 网络安全知识手册——生活篇全文共3页,当前为第3页...

    基于Spring Boot网络相册设计与实现lw+ppt.rar

    本文将深入探讨如何利用Spring Boot框架构建一个高效、稳定的网络相册系统。Spring Boot以其便捷的配置、强大的依赖管理和灵活的扩展性,成为现代Java开发的首选框架之一。 一、Spring Boot基础知识 Spring Boot是...

    ASP网站实例开发源码——会员功能强大的图片储存网络相册SQL版本.zip

    这是一个基于ASP技术的网站实例开发源码,专为创建一个具有强大图片存储功能的网络相册而设计。这个项目使用了SQL数据库来管理和存储用户上传的图片,提供了丰富的会员功能,使得用户可以方便地上传、修改和查看他们...

    ASP实例开发网站源码——测试完整无错的个人网络相册带后台管理.zip

    这个"ASP实例开发网站源码——测试完整无错的个人网络相册带后台管理.zip"压缩包包含了实现一个功能完备、无错误的个人网络相册的全部源代码,适合初学者学习和开发者参考。 首先,让我们深入了解一下ASP的关键概念...

    相册框架--百度图片JS框架

    **相册框架——百度图片JS框架详解** 在互联网应用中,图片展示往往占据了重要的地位,尤其是在社交媒体、电子商务、个人博客等场景。为了提供良好的用户体验,高效、美观且功能丰富的图片展示框架应运而生。其中,...

    Java框架Bootstrap、HTML5、jQuery、Spring MVC、Hibernate、向导、验证、UI组件、日历、相册、时间轴

    JavaEE企业开发框架,JEEFW,是一种专为快速构建B/S系统而设计的框架,其特点是采用流行的前端技术Bootstrap,使得开发人员可以快速适应并实现跨设备兼容性,适用于各种项目类型,如网站、OA、ERP、CRM及APP后台等。...

    java+vue基于Spring Boot网络相册设计与实现毕业论文.docx

    在这篇论文中,我们将使用 Java 语言和 Spring Boot 框架来设计和实现一个网络相册系统。 Spring Boot 框架的主要特点是简化了 Java 企业级应用程序的开发,使得开发者可以快速构建生产级别的应用程序。Spring ...

Global site tag (gtag.js) - Google Analytics