一个简单的数据库持久方案

来源:互联网 发布:kitti数据集介绍 编辑:程序博客网 时间:2024/04/29 11:28
 业务系统中,对DBMS的常见操作为:

   1、select 查询语句,可能返回一个数据集(ResultSet),或单一数据类型

   2、insert、delete、update更新数据语句,没有返回集。

   3、存储过程,可能有返回集。

JAVA O/R持久方案,即将JAVA对象与DBMS的二维数据进行关联映射,主要也依赖上述三种操作来同步二维数据。

现在行内持久方案有多种持久方案,其中Hibernate、Ibatis较为著名。我曾用过这两个框架,可能并不很深入,如下面有误,请指教。

   Hibernate建立了一整套对应关系,包括HBM对应、VO、SessionFactory + DAO。业务开发人员可以只关注JAVA层,而无耍太多数据库技能。

   Ibatis 则拥抱SQL,为开发人员提供更多更方便的SQL支持。开发人员必须有相关SQL经验,并需手写SQL操作语句,对VO、DAO也相对较灵活,同时提供了SQL语句可配置(个人很喜欢这点)。

   Hibernate对实现了二维数据到VO(或Map)的select映射支持,Hibernate同时还实现了insert、update、delete的自动代码。两者都有Cache支持。

   个人认为,Hibernate封装了太多东西,并不方便控制,而且由于VO必须与数据库表对应,对于复杂的SQL操作实现很麻烦。而且SQL/HQL硬编码在代码中,不方便维护。Ibatis比Hibernate来说灵活多了,但由于很多过程被封装了,开发人员想对中间步骤进行控制比较麻烦,比如我想在DAO层AOP控制通用分面和通用数据权限。

 

   由于这些问题,我综合了上述框架的优缺点,完成了一个简单的持久方案。先介绍一下相关的知识:

  •     java.sql.ResultSetMetaData    数据集元数据,其中可得到此操作结果集的列信息。
  •     org.apache.commons.beanutils.BeanUtils和org.apache.commons.beanutils.RowSetDynaClass apache组织Beanutils包提供的一些工具类,BeanUtils实现了对JavaBean的常用操作工具。
  •     org.springframework.jdbc.core.JdbcTemplate Spring框架简化SQL操作的一个工具类。
  •     数据库系统字典表,根据DBMS会有所不同(我用过的都有:ORACLER的user_*,SqlServer的sysobjects等,DB2的sys*,应规定接口并对各DBMS单独实现),根据这些表可得到数据库表、表字段、约束、存储过程的相关信息。   

    我需要完成以下内容:

   1、将数据库结果集映射成JavaBean VO或Map。通过使用BeanUtils、ResultSetMetaData和RowSetDynaClass即可完成,并在相关处提供AOP关注点方便以扣扩展。

    2、将JAVA对象持久化到数据库中,这需要用到DBMS系统字典表和JAVA类反射,根据在系统表中查询要操作的表信息,得到主键,字段名称类型等信息,在JAVA中动态拼装一个update/insert/delete的SQL语句及Where条件。然后执行。

       这可能大伙认为,每次操作均访问一次系统表字典会影响性能,实际上这在引入了CACHE后,性能影响很小。

    3、对存储过程及单一类据查询(如select count(*) from table)的支持,单一数据类型支持JdbcTemplate已经实现了,这直接代理调用JdbcTemplate即可。存储过程支持,由于各数据库调用方式不一致,所以需在相关的DbmsUtils中实现一些内容。通过读取系统数据字典可得到过程的调用规范(入参及出差等),通过类反射和数据字典可拼装出过程调用SQL。加入AOP关注点,执行过程,并循环对所有出参进行处理(游标采用数据集方式处理)。

    4、将SQL配置化,将所有操作的SQL均配置到XML文件中,这一块Ibatis做得相当不错,直接阅读Ibatis源程序,将相关内容偷过来即可。

    5、以前面的AOP注入点中加入分页实现(需与前台相配合),加入数据权限实现(目前还未做到通用,谁有啥好方法,欢迎共享下)。

原创粉丝点击