【问题标题】:Design pattern for Generic Dao, service layer in Spring without use of HibernateGeneric Dao 的设计模式,Spring 中不使用 Hibernate 的服务层
【发布时间】:2015-03-05 02:58:40
【问题描述】:

我访问了太多网站,并且还在 stackoverflow for reference 上提出了问题,但我无法在下面找到确切的答案。

我想为Generic DAO Pattern 设计一个架构,而不使用hibernate

目前我在开发GenericSpringDAOImpl<DomainObject> java 文件时遇到了麻烦。如何在没有hibernate 或者我说使用jdbctemplatespring 的情况下制作通用getList() 方法(返回DomainObject 对象)?

我的代码如下:

GenericDAO.java

public interface GenericDAO<DomainObject extends Serializable, KeyType extends Serializable> extends Serializable{

/**
 * Give list of all entities of underlying Domain Object. 
 * @return List of all entities.
 */
public List<DomainObject> getList();
/**
 * Returns the total number of Entities that is affected by sql query,.
 * 
 * @param query
 *            the query
 * @return Number of Entities affected By SQL Query.
 */
public int getRecordBySQLQuery(String query);

/**
 * Returns Domain object whose Key-value pair matched.
 * @param keyName Column name 
 * @param keyValue any value that is being matched under Column name.
 * @return DomainObject
 */
public DomainObject getRecordByKeyandValue(String keyName,Object keyValue);

public DomainObject getRecordByKeysAndValues(String[] keyName,Object[] keyValue);

/**
 * Returns list of Domainobjects whose Key-value pair matched.
 * @param colname Column name
 * @param keyValue List of values.
 * @return List<DomainObject> according to the Condition satisfied.
 */
public List<DomainObject> getListByKeyandValue(String colname,List<? extends Object> keyValue);

/**
 * Returns the list of Entities according to the condition applied.
 * @param condition Condition
 * @return List<DomainObject> according to condition satisfied.
 */
public List<DomainObject> getListByCondition(String condition);

/**
 * Find Object based on primary key.
 * @param id Identifier value is passed.
 * @return DomainObject i.e POJO which has the passed id value.
 */
public DomainObject getRecordByPrimaryKey(KeyType id);

/**
 * get the list of primary keys based on the condition.
 * @param condition Condition 
 * @return List<KeyType> of Primary Keys according to the Condition.
 */
public List<KeyType> getPrimaryKeyCollection(String condition);

/**
 * get the list of primary keys based on the condition.
 * @param condition Condition 
 * @return List<KeyType> of Primary Keys according to the Condition.
 */
public List<KeyType> getPrimaryKeyCollection(String condition,final Object... values);

/**
 * Insert the Domain Object that is going to persist into the Database. 
 * @param object Domain Object which is going to persist into the Database
 * @return KeyType Serializable value generated By Hibernate due to session.save().
 */
public KeyType insert(DomainObject object);

/**
 * Update the Domain Object.
 * @param object Domain Object that is being changed/updated.
 * @return 1 if Domain Object is being successfully updated
 *         0 if Exception Generation while updating the Object.
 */
public int update(DomainObject object);


/**
 * Deleting Domain Object.
 * 
 * @param object
 *            Domain Object that is going to be delete.
 * @return the int
 */
public int delete(DomainObject object);

/**
 * Delete Object whose oid(Object Identifier) matched with given Primary Key.
 * @param id Identifier value.
 */
public void deleteById(KeyType id); 


}

GenericSpringDAOImpl.java

public abstract class GenericDAOSpringImpl<DomainObject extends Serializable, KeyType extends Serializable> implements Serializable, GenericDAO<DomainObject, KeyType>{

@Autowired
private NamedParameterJdbcTemplate jdbcTemplate;

RowMapper<DomainObject> rowMapper;

public NamedParameterJdbcTemplate getJdbcTemplate() {
    return jdbcTemplate;
}

public void setJdbcTemplate(NamedParameterJdbcTemplate jdbcTemplate) {
    this.jdbcTemplate = jdbcTemplate;
}

public List<DomainObject> getList(){    
    /*Develop Code which return DomainObjects 
     * One way is pass query to getList() but not good approch 
     */
    return new ArrayList<DomainObject>();
 }

/*
   Other methods also required to implements.
*/
}

这里的域对象是学生、学校、教师等任何对象。

【问题讨论】:

  • getList() 应该返回什么?你必须给它一些参数来获取,比如创建像getDomainObjectBySomeValue(int someValue)这样的方法。
  • @Kayaman getList() 方法返回DomainObject 的所有对象假设我想获取所有学生然后DomainObject 作为学生和getList() 方法返回所有学生。
  • 如果返回所有对象,则执行 SQL 查询并返回对象。为什么您认为需要将查询作为参数传递?
  • @Kayaman List&lt;DomainObject&gt; getList(String query){ List&lt;DomainObject&gt; domainObjects = jdbcTemplate.query(query,rowMapper); return domainObjects; } 这是我可以实现 getList() 方法的一种方式,但我想要其他方式
  • 为了返回所有对象,您将创建一个类似List&lt;DomainObject&gt; getList() { return jdbcTemplate.query("SELECT * FROM DOMAIN_OBJ", rowMapper); } 的方法。但就像我说的,你可能想要限制你获取的内容,所以你需要创建像 getDomainsBySize(int size)getDomainsByLength(int length) 这样的方法。

标签: java spring spring-mvc generics genericdao


【解决方案1】:

您是否正在寻找 Spring Data JPA 提供的实现? http://projects.spring.io/spring-data-jpa/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2011-10-10
    • 1970-01-01
    • 2015-01-26
    • 2012-08-21
    • 1970-01-01
    相关资源
    最近更新 更多