当前位置:   article > 正文

数据库框架设计与实现(一)_本地数据库框架设计

本地数据库框架设计

一、设计目标

1. 对上层提供统一、唯一的接口,不仅支持关系型数据库,还要支持非关系型数据库。

2. 以基于ORM思想,泛型为实现的方法进行数据库操作进行封装。

3. 实现数据库可配置,可替换。

二、框架图

框架核心采用了工厂模式+简单工厂模式,本来应该由BaseDao去实现Query来构成工厂模式,但为了最大程度解耦,在创建Query时又采用了简单工厂去关联IQuery接口。UserDao则是客户端调用者,同样采用简单工厂来与IDataBaseDao关联。IPageModel、ITreeModel则分别是为分页、树形结构服务的。(这里一说到简单工厂,实际上是交由spring的IOC来完成的)最终使得任何类都是基于接口实现,从而达到整体框架灵活性。

三、代码实现

1. IDataBaseDao

  1. package com.core.dao;
  2. import java.io.Serializable;
  3. import java.util.Collection;
  4. import java.util.List;
  5. /**
  6. * 数据库访问操作对象
  7. * @author Wang
  8. * @param <T> 实体类
  9. * @param <PK> 主键类型
  10. */
  11. public interface IDataBaseDao<T extends Serializable, PK extends Serializable> {
  12. /**
  13. * 设置实体类
  14. * @param entityClass 实体类class
  15. */
  16. void setEntityClass(Class<T> entityClass);
  17. /**
  18. * 新建一个查询对象
  19. * @return
  20. */
  21. IQuery createQuery();
  22. /**
  23. * 获取数据
  24. * @param id 主键
  25. * @return
  26. */
  27. T get(PK id);
  28. /**
  29. * 加载数据
  30. * @param id 主键
  31. * @return
  32. */
  33. T load(PK id);
  34. /**
  35. * 加载全部数据
  36. * @return
  37. */
  38. List<T> loadAll();
  39. /**
  40. * 查询数据
  41. * @param query 查询对象
  42. * @return
  43. */
  44. List<T> find(IQuery query);
  45. /**
  46. * 保存数据
  47. * @param entity 实体类
  48. * @return
  49. */
  50. PK save(T entity);
  51. /**
  52. * 更新数据
  53. * @param entity 实体类
  54. */
  55. void update(T entity);
  56. /**
  57. * 保存或更新数据
  58. * @param entity 实体类
  59. */
  60. void saveOrUpdate(T entity);
  61. /**
  62. * 保存或更新全部数据
  63. * @param entities 实体类集合
  64. */
  65. void saveOrUpdateAll(Collection<T> entities);
  66. /**
  67. * 删除数据
  68. * @param entity 实体类
  69. */
  70. void delete(T entity);
  71. /**
  72. * 依据主键删除数据
  73. * @param id 主键
  74. */
  75. void deleteByKey(PK id);
  76. /**
  77. * 删除全部数据
  78. * @param entities 实体类集合
  79. */
  80. void deleteAll(Collection<T> entities);
  81. }

说明:

该接口是本系统数据库框架对外提供服务的核心接口,也是各个数据库实现框架(hibernate、ibatis、)的抽象接口,使本系统不局限于某种数据库实现框架,支持各种常见数据库实现框架。

系统其它框架都要统一调用接口,不可直接调用实现类。

支持泛型。第一个T为返回对象类型,第二个PK为主键类型。

 

2. IQuery

  1. package com.core.dao;
  2. import java.util.List;
  3. /**
  4. * 查询操作对象
  5. * @author Wang
  6. */
  7. public interface IQuery {
  8. /**
  9. * 获取对象查询语句
  10. * @return
  11. */
  12. String getQueryString();
  13. /**
  14. * 获取sql查询语句
  15. * @return
  16. */
  17. String getSQLString();
  18. /**
  19. * 获取查询参数集合
  20. * @return
  21. */
  22. Object[] getParamValues();
  23. /**
  24. * 获取查询数据的起始位号,用于分页
  25. * @return
  26. */
  27. int getFirstResult();
  28. /**
  29. * 获取查询数据的最大长度,用于分页
  30. * @return
  31. */
  32. int getMaxResults();
  33. /**
  34. * 设置表的实体类集合
  35. * @param entityClasses 实体类class集合
  36. */
  37. @SuppressWarnings("rawtypes")
  38. void setEntityClass(Class[] entityClasses);
  39. /**
  40. * 设置对象查询语句
  41. * @param queryStr 对象查询语句字符串
  42. */
  43. void setQueryString(String queryStr);
  44. /**
  45. * 设置sql查询语句
  46. * @param sql sql查询语句字符串
  47. */
  48. void setSQLString(String sql);
  49. /**
  50. * 设置查询参数集合
  51. * @param values 参数值集合
  52. */
  53. void setParamValues(Object[] values);
  54. /**
  55. * 设置查询数据的起始值,用于分页
  56. * @param value 起始值
  57. */
  58. void setFirstResult(int value);
  59. /**
  60. * 设置查询数据的最大长度,用于分页
  61. * @param value 最大值
  62. */
  63. void setMaxResults(int value);
  64. /**
  65. * 执行查询
  66. * @return
  67. */
  68. @SuppressWarnings("rawtypes")
  69. List execute();
  70. }

说明:

该接口是专门针对于查询数据库设计的,不同数据库,其查询语言都不太一样,而增删改操作则都较为简单。任何涉及到查询数据库的操作都要统一采用此接口的方式实现。

提供对原生SQL的支持,即getSQLString、setSQLString,同时该方法并不仅仅用于SQL语句,同样适用于非关系数据库的一些特殊的查询语句(如Mongodb),而getQueryString、setQueryString则是针对面向对象的查询语句而独自提供的方法。

为了防止一些查询语句无法彻底封装,提供了一个excute方法来完成查询。

提供getFirstResult等方法来对分页查询提供支持。

 

3. IPageModel

  1. package com.core.dao;
  2. import java.io.Serializable;
  3. import java.util.List;
  4. /**
  5. * 分页操作对象
  6. * @author Wang
  7. * @param <T> 数据对象类型
  8. */
  9. public interface IPageModel<T extends Serializable> {
  10. /**
  11. * 获取一页显示多少条数据的值
  12. * @return
  13. */
  14. int getPageSize();
  15. /**
  16. * 获取总页数的值
  17. * @return
  18. */
  19. int getTotalPages();
  20. /**
  21. * 获取当前页号
  22. * @return
  23. */
  24. int getPageNumber();
  25. /**
  26. * 获取该页第一条数据的行号
  27. * @return
  28. */
  29. int getFirstResult();
  30. /**
  31. * 获取该页数据
  32. * @return
  33. */
  34. List<T> getDataResult();
  35. /**
  36. * 是否是首页
  37. * @return
  38. */
  39. boolean isFirstPage();
  40. /**
  41. * 是否是尾页
  42. * @return
  43. */
  44. boolean isLastPage();
  45. /**
  46. * 设置一页显示多少条数据
  47. * @param value
  48. */
  49. void setPageSize(int value);
  50. /**
  51. * 设置总页数
  52. * @param value
  53. */
  54. void setTotalPages(int value);
  55. /**
  56. * 设置当前页号
  57. * @param value
  58. */
  59. void setPageNumber(int value);
  60. /**
  61. * 设置该页第一条数据的行号
  62. * @param value
  63. */
  64. void setFirstResult(int value);
  65. /**
  66. * 设置该页数据
  67. * @param data
  68. */
  69. void setDataResult(List<T> data);
  70. }

说明:

该接口用于分页功能,任何分页的实现都必须用该接口。

 

4. ITreeModel

  1. package com.core.dao;
  2. import java.io.Serializable;
  3. public interface ITreeModel<PK extends Serializable> {
  4. PK getNodeId();
  5. PK getNodePid();
  6. String getNodeName();
  7. int getNodeOrder();
  8. String getNodeImage();
  9. int getNodeLevel();
  10. void setNodeId(PK nodeId);
  11. void setNodePid(PK nodePid);
  12. void setNodeName(String nodeName);
  13. void setNodeOrder(PK nodeOrder);
  14. void setNodeImage(String nodeImage);
  15. void setNodeLevel(int nodelLevel);
  16. }

说明:

该接口用于树形功能。任何树形的实现都必须用该接口。

 

5. BaseDao

  1. package com.core.dao.hibernate;
  2. import java.io.Serializable;
  3. import java.sql.SQLException;
  4. import java.util.Collection;
  5. import java.util.List;
  6. import javax.annotation.Resource;
  7. import org.hibernate.HibernateException;
  8. import org.hibernate.Query;
  9. import org.hibernate.Session;
  10. import org.springframework.orm.hibernate3.HibernateCallback;
  11. import org.springframework.orm.hibernate3.HibernateTemplate;
  12. import com.core.dao.IDataBaseDao;
  13. import com.core.dao.IQuery;
  14. import com.util.BeanUtil;
  15. public class BaseDao<T extends Serializable, PK extends Serializable> implements IDataBaseDao<T, PK> {
  16. @Resource
  17. private HibernateTemplate hibernateTemplate;
  18. @Resource
  19. private IQuery query;
  20. private Class<T> entityClass;
  21. @Override
  22. public void setEntityClass(Class<T> entityClass) {
  23. this.entityClass = entityClass;
  24. }
  25. @Override
  26. public IQuery createQuery() {
  27. return query;
  28. }
  29. @SuppressWarnings("unchecked")
  30. @Override
  31. public T get(PK id) {
  32. return (T) hibernateTemplate.get(entityClass, id);
  33. }
  34. @SuppressWarnings("unchecked")
  35. @Override
  36. public T load(PK id) {
  37. return (T) hibernateTemplate.load(entityClass, id);
  38. }
  39. @SuppressWarnings("unchecked")
  40. @Override
  41. public List<T> loadAll() {
  42. return hibernateTemplate.loadAll(entityClass);
  43. }
  44. @SuppressWarnings("unchecked")
  45. @Override
  46. public List<T> find(IQuery query) {
  47. final String queryString = query.getQueryString();
  48. if (!BeanUtil.isNull(queryString)) {
  49. final Object[] values = query.getParamValues();
  50. final int firstResult = query.getFirstResult();
  51. final int maxResult = query.getMaxResults();
  52. if (!BeanUtil.isNull(values)) {
  53. if (maxResult > 0) {
  54. hibernateTemplate.executeFind(new HibernateCallback() {
  55. @Override
  56. public Object doInHibernate(Session session) throws HibernateException, SQLException {
  57. Query query = session.createQuery(queryString);
  58. query.setFirstResult(firstResult);
  59. query.setMaxResults(maxResult);
  60. for (int i = 0; i < values.length; i++) {
  61. query.setParameter(i + 1, values[i]);
  62. }
  63. return query.list();
  64. }
  65. });
  66. }
  67. return hibernateTemplate.find(queryString, values);
  68. } else {
  69. if (maxResult > 0) {
  70. hibernateTemplate.executeFind(new HibernateCallback() {
  71. @Override
  72. public Object doInHibernate(Session session) throws HibernateException, SQLException {
  73. Query query = session.createQuery(queryString);
  74. query.setFirstResult(firstResult);
  75. query.setMaxResults(maxResult);
  76. return query.list();
  77. }
  78. });
  79. }
  80. return hibernateTemplate.find(queryString);
  81. }
  82. }
  83. String sql = query.getSQLString();
  84. if (!BeanUtil.isNull(sql)) {
  85. return query.execute();
  86. } else {
  87. // 需要抛出异常
  88. return null;
  89. }
  90. }
  91. @SuppressWarnings("unchecked")
  92. @Override
  93. public PK save(T entity) {
  94. return (PK) hibernateTemplate.save(entity);
  95. }
  96. @Override
  97. public void update(T entity) {
  98. hibernateTemplate.update(entity);
  99. }
  100. @Override
  101. public void saveOrUpdate(T entity) {
  102. hibernateTemplate.saveOrUpdate(entity);
  103. }
  104. @Override
  105. public void saveOrUpdateAll(Collection<T> entities) {
  106. hibernateTemplate.saveOrUpdateAll(entities);
  107. }
  108. @Override
  109. public void delete(T entity) {
  110. hibernateTemplate.delete(entity);
  111. }
  112. @Override
  113. public void deleteByKey(PK id) {
  114. T t = this.get(id);
  115. hibernateTemplate.delete(t);
  116. }
  117. @Override
  118. public void deleteAll(Collection<T> entities) {
  119. hibernateTemplate.deleteAll(entities);
  120. }
  121. }

说明:

该类是对IDataBaseDao的实现,也是基于Hibernate框架的实现类。

 

6. Query

  1. package com.core.dao.hibernate;
  2. import java.util.List;
  3. import com.core.dao.IQuery;
  4. public class Query implements IQuery {
  5. private String queryStr;
  6. private String sql;
  7. private Object[] params;
  8. private int firstResult;
  9. private int maxResult;
  10. @SuppressWarnings({ "rawtypes", "unused" })
  11. private Class[] entityClasses;
  12. @Override
  13. public String getQueryString() {
  14. return queryStr;
  15. }
  16. @Override
  17. public String getSQLString() {
  18. return sql;
  19. }
  20. @Override
  21. public Object[] getParamValues() {
  22. return params;
  23. }
  24. @Override
  25. public int getFirstResult() {
  26. return firstResult;
  27. }
  28. @Override
  29. public int getMaxResults() {
  30. return maxResult;
  31. }
  32. @SuppressWarnings("rawtypes")
  33. @Override
  34. public void setEntityClass(Class[] entityClasses) {
  35. this.entityClasses = entityClasses;
  36. }
  37. @Override
  38. public void setQueryString(String queryStr) {
  39. this.queryStr = queryStr;
  40. }
  41. @Override
  42. public void setSQLString(String sql) {
  43. this.sql = sql;
  44. }
  45. @Override
  46. public void setParamValues(Object[] values) {
  47. this.params = values;
  48. }
  49. @Override
  50. public void setFirstResult(int value) {
  51. this.firstResult = value;
  52. }
  53. @Override
  54. public void setMaxResults(int value) {
  55. this.maxResult = value;
  56. }
  57. @SuppressWarnings("rawtypes")
  58. @Override
  59. public List execute() {
  60. return null;
  61. }
  62. }

该类是对IQuery的实现,也是基于Hibernate框架的实现类。

 

6. applicationContext.xml(部分,其他的自己配)

  1. <bean id="baseDao" class="com.core.dao.hibernate.BaseDao"></bean>
  2. <bean id="query" class="com.core.dao.hibernate.Query" scope="prototype"></bean>
  3. <bean name="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
  4. <property name="sessionFactory" ref="sessionFactory" />
  5. </bean>

 

 

四、结语

目前这个框架还处于初期阶段,只实现了对Hibernate的支持,今后我仍会逐步完善(本篇文章会同步更新),后续文章中也会出现连载。

这里也可以看做是给大家一个思路,如果各位有好的想法和建议,清多多留言交流!

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号