四、基于Hibernate对CRUD操作的封装
通过系统模块划分,分为三层:数据访问层、业务层、表现层。在数据访问层采用Hibernate,并实现了DAO模式;项目的业务逻辑比较简单,所以这块分量最小;表现层采用
managed bean。
- 封装DAO操作
public interface BaseDao {
public Object findById(Class clazz, Serializable id) throws BaseException;
public Serializable insert(Object vo) throws BaseException; // vo对象为ORM映射后与数据库表对应的纯javabean对象
public void update(Object vo) throws BaseException;
public void delete(Object vo) throws BaseException;
public void delete(String id) throws BaseException; // 按主键删除记录
public List findEntities(Object cond) throws BaseException; // 按条件查询
public List findEntities(Object cond, int startRow, int pageSize) throws BaseException; // 按条件查询并分页
public int countEntities(Object cond, int startRow, int pageSize) throws BaseException; // 按条件查询并统计总记录数
}
实现BaseDao接口的hibernate抽象类
public abstract class AbstractHibernateDao implements BaseDao {
// ...
}
- 封装BaseBean
public interface BaseBean {
public DataModel getDataModel(); // 得到数据模型
public String queryAction(); // 查询事件
public String addAction(); // 添加记录事件
public String editAction(); // 编辑记录事件
public String insertAction(); // 插入记录事件
public String updateAction(); // 更新记录事件
public String deleteAction(); // 删除记录事件
}
- 使用beanutils包进行Bean和POJO对象的类属性对拷(属性同名之间值对拷)
Hibernate的DAO查询数据库后返回的是POJO对象(即VO值对象),在jsf前台显示时应该提供managed bean。同样,前台jsf页面返回到业务逻辑层是bean对象,而交给DAO对象
去与数据库交互(如增删改操作)的必须是VO对象。因此可以采用BeanUtils工具实现这两种对象之间的对拷,但前提是属性必须同名。
public class BeanBuilder {
// 根据参照对象ref,创建对象(类型由clazz参数指定)
public static Object createObject(Class clazz, Object ref)
throws BaseException {
Object obj = null;
try {
obj = Class.forName(clazz.getName()).newInstance(); // 动态装载类
BeanUtils.copyProperties(obj, ref);
} catch (Exception e) {
logger.debug(e);
throw new BaseException(e);
}
return obj;
}
// 根据参照对象ref,进行对象赋值(同名属性对拷)
public static void assignObject(Object obj, Object ref)
throws BaseException {
try {
BeanUtils.copyProperties(obj, ref);
} catch (Exception e) {
logger.debug(e);
}
}
}
思考:增加bean之间的对拷对性能会产生多大的损失?