用enum轮换简单字典服务

用enum替换简单字典服务
   很多应用中会用到字典服务,每次构建一个新应用的时候,整理字典是必不可少的工作,然后字典的录入更是一个费力的差事,大的字典也就无妨了,因为录入一次以后基本上就可以反复重用了,比如省市区三级数据联动。

    在一些小的字典应用中,可以考虑使用enum来替代,enum的使用我不多介绍,我们定义一个enum肯定是要在程序中随处引用,但是最终的数据都是要持久化的,比如产品的状态(productState),然后页面端的form也要使用可选择值的控件<select><radio>等,这里讲一下如何把前后台的枚举联系起来。


假设我们有一个很简单的项目就是把产品类入库,然后按照不同状态查询出来:

1.定义一个枚举
public enum ProductState {
	
	未审核(0), 
	已审核(1),
	下架(2),
	交易完毕(3);
	
	private Integer state;

	HouseState(Integer state) {
		this.state = state;
	}
	
	/**
	 * 此方法用于在dao里面使用查询
	 */
	public static ProductState valueOf(Integer i) {
		switch(i){
			case 0 : 
				return ProductState.未审核;
			case 1 :
				return ProductState.已审核;
			case 2 : 
				return ProductState.下架;
			case 3 : 
				return ProductState.交易完毕;
			default : 
				return null;
		}
	}
}


2.定义pojo,这里我使用hibernate的annotation
@Entity
@Table(name="t_product")
public class Product {

	private Long id;
	private String name;
	
	private ProductState state;
	......

	@Id
	@GeneratedValue(generator="h-native")
    	@GenericGenerator(name="h-native", strategy="native")
	public Long getId() {
		return id;
	}
	
	@Enumerated()
	public HouseState getState() {
		return state;
	}
}


这里需要注意:t_product表中的state字段需要定义为integer,要和你的枚举类里的构造函数参数类型相同
3.定义dao
简单的crud

4.junit中调用
public void testDao(){
         Product p= new Product();
	p.setState(ProductState.已审核);
	dao.add(p);
}

查下数据库,已经有一条记录插入进去了,state的值为1

5.按状态查询,返回中文枚举

在hibernate内返回满足某一个枚举等于一个给定值的实体类也很方便。我这里用Criteria,在dao里面定义查询方法:
return (List<Product>) this.getHibernateTemplate().execute(new HibernateCallback(){
	public Object doInHibernate(Session session) throws HibernateException, SQLException {
	Criteria ca = session.createCriteria(Product.class);
	ca.add(Expression.eq("state",ProductState .valueOf(1))); 
	return ca.list();
	}
});


上面的1就可以使用参数传递进来了,或者构建自己的抽象查询对象,返回的product对象就可以按照house.getState()直接返回“已审核”的中文值了,剩下的就是页面端的事情了。

对于页面端得显示,直接调用${porduct.state}就可以看到对应的中文的值了,如果需要更新操作的话,我的办法是把enum转换成map,这样key和value都有了!这种方法在对应大的字典集或者父子字典集的时候并不会减少工作量,要谨慎使用!