[精品]基于ssh的中小企业在线资产管理系统设计与开发内容摘要:

ER图 销售明细实体映射的数据表为 tb_selldetail,资产对象及操作用户的多对一关联关系,映射后的数据表结构如 表 : 表 销售明细实体数据表 属性 类型 是否为空 自动生成 描述 id Integer Not null Auto 主键 sellName Varchar Not null 产品名称 sellPrice Double Not null 销售单价 sellCount Integer Not null 销售数量 sellTime Datetime Not null 销售时间 medid Integer 资产 id userid Integer 用户 id 用户实体用于封装管理员的基本信息,如登录的用户名、密码等属性, 用户实体ER图如图 : 图 用户实体 ER图 用户实体所映射的数据表为 tb_user,其结构如表 : 表 用户实体数据表 属性 类型 是否为空 自动生成 描述 id Integer Not null Auto 主键 username Varchar Not null 用户名 销售明细 单价 用户 id 销售时间 编号 销售数量 资产 id 产品名称 用户 编号 密码 创建时间 用户名 password Varchar Not null 密码 createTime Datetime 创建时间 系统中各 实体之间也有相应的关系, 资产信息与资产类别为多对一的关联关系,一个类别中包含多个资产对象;资产信息与销售明细为一对多关联关系,多个销售明细对应一个 资产 对象;销售明细与用户之间为多对多关联关系,多个销售 明细信息对应多个用户。 实体对象之间的关系如图 : 多对一 一对多 多对一 图 实体对象之间的关系 公共类设计 面向对象的开发模式中可以简化程序中的代码,提高程序的可读性。 在此系统开发过程中,某些功能被反复调用,故将该功能 抽取出来封装为一个类作为公共类,在需要此功能时通过此类进行实现, 公共类的实质是代码的重用的一种方式。 Hibernate 过滤器 在 Web项目中,以普通方式使用 Hibernate 将无法解决 Hibernate 延迟加载。 当有一个业务请求查询数据时,首先要开启 Session对象 [12],然后 Hibernate 对数据进行查询,再关闭 Session对象,最后通过 JSP 页面来显示数据。 在这一过程中,如果查询数据时使用了延迟加载,当 JSP 页面显示数据信息时, Hibernate 将抛出异常信息,因为此时Session已经关闭, Hibernate 不能再对数据进行操作。 通过过滤器管理 Hibernate 的 Session对象则可以避免此问题。 在 Web容器启动时,过滤器被初始化,它将执行 init()方法,在后续的操作中不会再次被执行;而当容器关闭时,过滤器将执行 destroy()方法。 这两个方法恰好符合 SessionFactory对象的生命周期,在运行期间只执行一次操作,可用于实例化及销毁 SessionFactory对象。 对于 Session对象的关闭操作,可以在业务逻辑处理结束后、 response请求转发到 View 层 (JSP页面 )之前进行。 此代码将其封装在 HibernateFilter 类 [13]中,此类继承了 Filter 类,它是一个过滤器。 为了保证线程安全,将 Session对象存放于 ThreadLocal 对象中,当用到一个 Session对象时,首先从 ThreadLocal 中获取。 在无法获取的情况下才会开启一个新的 Session对象。 同时,为了保证 Session 对象能在 response 请求转发到 View 层之前被关闭,采取try… catch语句对 session进行关闭。 其关键代码如下: public class HibernateFilter implements Filter{ private static ThreadLocal threadLocal = new ThreadLocal()。 private static SessionFactory factory = null。 …… 资产类别 资产信息 销售明细 用 户 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { try { (request, response)。 } finally{ Session session = (Session)()。 if(session != null){ if(()){ ()。 } ()。 } } } public void init(FilterConfig arg0) throws ServletException { //初始化 SessionFactory try { Configuration cfg = new Configuration().configure()。 factory = ()。 } catch (Exception e) { ()。 } } public static Session getSession() { Session session = (Session)()。 if (session == null) { session = ()。 (session)。 } return session。 } } SuperDao类 SuperDao类为此系统中所有数据库操作类的父类,此类中封装了数据库操作的常用方法,在此类中,由于 Hibernate 对数据库的操作都需要用到 Session接口,类中定义了一个 protected类型的 Session对象 ,为其子类提供方便。 save()方法及 saveOrUpdate()方法都用于保存一个对象,其入口参数均为 Object类型。 其中 saveOrUpdate()方法比 save()方法更智能一些,可以根据实体对象的标识值来判断 保存还是更新操作。 SuperDao类中使用这两个方法对实体对象进行保存及更新操作,其关键代码如下: public class SupperDao { protected Session session = null。 public void save(Object obj){ try { session = ()。 ()。 (obj)。 ().mit()。 } catch (Exception e) { ()。 ().rollback()。 } } public void saveOrUpdate(Object obj){ try { session = ()。 ()。 (obj)。 ().mit()。 、 } catch (Exception e) { …… } } 删除操作的方法为 delete(),入口参数为 Object()类型,此方法通过 Session 接口的delete()方法进行实现,其关键代码如下: public void delete(Object obj){ try { session = ()。 ()。 (obj)。 ().mit()。 } catch (Exception e) { …… } } Hibernate 的 HQL 查询语言提供了更为灵活的查询方式,在这个超类之中应该加入 HQL的操作方法,其中 findByHQL()方法用于根据指定的 HQL查询语句查询结果集,deleteByHQL()方法用于根据指定的 HQL查询语句进行删除操作。 关键代码如下: public List findByHQL(String hql){ List list = null。 try { session = ()。 ()。 list = (hql) .list()。 ().mit()。 } catch (Exception e) { …… } return list。 } public void deleteByHQL(String hql){ try { session = ()。 ()。 (hql) .executeUpdate()。 ().mit()。 } catch (Exception e) { …… } } Hibernate单值检索在查询后返回单个对象,当返回的结果包含多条数据时, Hibernate将抛出异常。 此种操作可用于查询单条数据,在 SupperDao 类中,单值检索的方法为uniqueResult(),此方法的入口参数为 HQL 查询 [14]语句及查询条件,其中查询条件为Object[]数组类型,用于装载查询语句中的参数。 比如 HQL语句“ from Property m where =?” ,此时即可通过参数 where 对其进行动态赋值。 public Object uniqueResult(String hql,Object[] where){ Object obj = null。 try { session = ()。 ()。 Query query = (hql)。 if(where != null amp。 amp。 0){ for (int i = 0。 i。 i++) { if(where[i] != null){ query = (i, where[i])。 } } } obj = ()。 ().mit()。 } catch (Exception e) { …… } return obj。 } findPaging()方法用于分页查询,此方法的入口参数有 4个,其中参数 hql 为 HQL查询语句,它允许传入参数中带有占位符“ ?” 的 HQL语句;参数 offset为查询结果集的起始位置;参数 length为查询结果集的偏移量,也就是返回数据的条目数;参数 where为查询条件,属于 Object[]数组类型,用于装载 HQL语句中的参数。 关键代码如下: public List findPaging(String hql,int offset,int length,Object[] where){ List list = null。 try { session = ()。 ()。 Query query = (hql)。 if(where != null amp。 amp。 0){ for (int i = 0。 i。 i++) { if(where[i] != null){ query = (i, where[i])。 } } } list = (offset).setMaxResults(length) .list()。 ().mit()。 } catch (Exception e) { …… } return list。 } }\ BaseAction类 BaseAction 类是业务层,有一个超类对象,继承了 Struts 的 DispatchAction 类 [15],同时还为子类对象提供公用方法。 DispatchAction类继承了 Action类,此类在处理请求时首先要执行 execute()方法,然后通过控制器再转发到相应的方法进行业务处理。 此类。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。