首先说明,这个东西最开始是我从网上找到的,但是不记得在那里找到的了。只是觉得非常有用,所以就根据我的需要做了修改,放在了这里,当作一个备忘录吧。
这个是接口:
java 代码
-
-
-
-
- public interface BaseDao\<T\><t></t><t></t> {
-
-
-
-
-
-
- public T findById(Long id);
-
-
-
-
- public List<t></t><t></t> listAll();
-
-
-
-
-
-
-
-
-
-
- public List<t></t><t></t> listAndSort(int startPos, int amount, Map conditions, String sortableProperty, boolean asc);
-
-
-
-
- public Long countTotalAmount();
-
-
-
-
-
-
- public T save(T entity);
-
-
-
-
-
- public void delete(T entity);
-
-
-
-
-
-
- public T update(T entity);
-
-
-
-
- public String getDeleteToken();
- }
然后是其实现类:
java 代码
-
-
-
-
-
-
- public class BaseDaoImpl<t class="keyword"></t>extends Model> extends HibernateDaoSupport implements BaseDao<t></t><t></t> {
-
- private Class<t></t> persistentClass;
-
- protected static final String DEFAULT_INDEIRECTLY_DELETE_TOKEN = "disused";
-
-
-
-
- public Class<t></t> getPersistentClass() {
- return this.persistentClass;
- }
-
-
-
-
- @SuppressWarnings("unchecked")
- public BaseDaoImpl() {
- this.persistentClass = (Class<t></t>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
- }
-
- @SuppressWarnings("unchecked")
- public T findById(Long id) {
- return (T) this.getHibernateTemplate().get(this.getPersistentClass(), id);
- }
-
- public List<t></t><t></t> listAll() {
- return this.findByCriteria();
- }
-
- @Override
- public List<t></t><t></t> listAndSort(int startPos, int amount, Map conditions, String sortableProperty,
- boolean asc) {
- return this.listAndSort(this.getPersistentClass(), startPos, amount, conditions, sortableProperty, asc, false);
- }
-
- @Override
- public Long countTotalAmount() {
- StringBuilder hql = new StringBuilder()
- .append("select count(obj.id) from ")
- .append(BaseDaoImpl.this.getPersistentClass().getSimpleName())
- .append(" obj ");
- if (BaseDaoImpl.this.getDeleteToken() != null) {
- hql.append("where obj.")
- .append(BaseDaoImpl.this.getDeleteToken())
- .append(" = false");
- }
- final String hqlString = hql.toString();
- return (Long) this.getHibernateTemplate().execute(new HibernateCallback() {
- @Override
- public Object doInHibernate(Session session) throws HibernateException, SQLException {
- Query query = session.createQuery(hqlString.toString());
- return query.uniqueResult();
- }
- });
- }
-
- public T save(T entity) {
- this.getHibernateTemplate().saveOrUpdate(entity);
- return entity;
- }
-
- public T update(T entity) {
- this.getHibernateTemplate().update(entity);
- return entity;
- }
-
- public void delete(T entity) {
- this.getHibernateTemplate().delete(entity);
- }
-
- @SuppressWarnings("unchecked")
- protected List<t></t><t></t> findByCriteria(Criterion... criterion) {
- DetachedCriteria detachedCrit = DetachedCriteria
- .forClass(getPersistentClass());
- for (Criterion c : criterion) {
- detachedCrit.add(c);
- }
- return getHibernateTemplate().findByCriteria(detachedCrit);
- }
-
-
-
-
-
-
-
-
-
-
-
- @SuppressWarnings("unchecked")
- protected List<t></t><t></t> listAndSort(Class<t></t> clazz, final int startPos, final int amount,
- final Map conditions, String sortableProperty, boolean asc, boolean getDisused) {
-
- boolean hasCondition = false;
-
- StringBuilder hql = new StringBuilder().append("from ").append(clazz.getSimpleName()).append(" obj ");
-
-
- if (this.getDeleteToken() != null) {
- hasCondition = true;
- hql.append("where obj.")
- .append(this.getDeleteToken())
- .append(" ");
- if (getDisused) {
- hql.append("is true ");
- } else {
- hql.append("is false ");
- }
- }
-
-
- boolean needsAnd = false;
- if (!conditions.isEmpty()) {
- if (!hasCondition) {
- hql.append("where ");
- } else {
- needsAnd = true;
- }
- }
- for (String property : conditions.keySet()) {
- if (needsAnd) {
- hql.append("and ");
- }
- hql.append("obj.").append(property).append(" = :").append(property).append(" ");
- }
-
-
- hql.append("order by ").append(" obj.").append(sortableProperty).append(" ");
- if (asc) {
- hql.append("asc");
- } else {
- hql.append("desc");
- }
-
-
- final String hqlString = hql.toString();
- return (List<t></t>) this.getHibernateTemplate().execute(new HibernateCallback() {
- @Override
- public Object doInHibernate(Session session) throws HibernateException, SQLException {
- Query query = session.createQuery(hqlString);
- query.setFirstResult(startPos);
- query.setMaxResults(amount);
-
-
- for (String property : conditions.keySet()) {
- query.setParameter(property, conditions.get(property));
- }
-
- return query.list();
- }
- });
- }
-
- @Override
- public String getDeleteToken() {
- return null;
- }
- }
最后,你的实际使用的Dao就可以继承这个基本的Dao实现,只需要添加在实际中需要的特定方法就可以了,对在基本的Dao实现中提供的方法可以直接使用,而且不用考虑类型问题。比如:
我有一个UserDao,是作对用户对象的操作的:
接口如下:
java 代码
-
-
-
-
- public interface UserDao extends BaseDao<user></user><user></user> {
-
-
-
-
- public User find(String userId);
- }
实现类如下:
java 代码
-
-
-
-
- public class UserDaoImpl extends BaseDaoImpl<user></user><user></user> implements UserDao {
-
- @SuppressWarnings("unchecked")
- public User find(final String userId) {
- return (User) this.getHibernateTemplate().execute(new HibernateCallback() {
- @Override
- public Object doInHibernate(Session session)
- throws HibernateException, SQLException {
- String hql = "from User user where user.userId = :userId";
- Query query = session.createQuery(hql);
- query.setString("userId", userId);
- return query.uniqueResult();
- }
- });
- }
-
- @Override
- public String getDeleteToken() {
- return "expired";
- }
- }
我们的这个UserDaoImpl没有提供对
java 代码
- public User findById(Long id);
这样的方法的实现,但是通过
java 代码
- public class UserDaoImpl extends BaseDaoImpl<user></user> implements UserDao {
- ......
- }
这样的继承,我们的UserDaoImpl一样拥有了这样的方法。
分享到:
相关推荐
在示例中,我们创建了两个容器,一个Set用于存储字符串,另一个List用于存储整数。通过调用add()方法添加元素,然后使用size()方法获取容器中元素的数量,最后通过System.out.println()打印出容器内容。 在遍历容器...
这本书的核心主题是C++中的泛型编程,它是C++编程中一个极其重要的概念,能够实现代码的高效复用和抽象化。 C++的范型(Template)是其强大的特性之一,它允许开发者创建泛化的类和函数,这些实体能够在编译时根据...
《范型程序设计与 STL》是一本深入探讨C++编程中的关键概念和技术的书籍,主要聚焦于范型(Generic Programming)和标准模板库(Standard Template Library,简称STL)。范型编程是一种强大的软件开发方法,它允许...
消息传递范型是计算机科学中的一个基本概念,用于描述进程间通信的方式。在这范型中,数据通过消息形式在发送者(sender)和接收者(receiver)之间进行交换。消息传递机制的优点在于它的异步性质,能够支持分布式...
2. 类模板:类模板则允许我们创建一个可以适用于多种数据类型的类。例如,`template, typename Value> class HashMap` 定义了一个哈希映射类,其中键和值可以是任何类型。类模板创建的实例称为模板特例化,每个不同...
在本文中,我们将深入探讨如何使用Java的Socket编程来实现一个简单的基于P2P(Peer-to-Peer)范型的即时聊天系统。P2P网络架构允许每个节点既是客户端也是服务器,这种模式使得数据传输更加分散,提高了系统的可扩展...
Java范型是Java编程语言中的一个重要特性,它允许在类、接口和方法中使用类型参数,从而提高了代码的重用性和安全性。范型在Java中引入的主要目标是增强类型安全,减少强制类型转换,并帮助开发者编写更清晰、更易于...
Java 范型Java 范型
《分布式系统原理与范型》作为一本系统介绍分布式系统基本原理与实践应用的书籍,涵盖了分布式系统设计与实现的核心理念。分布式系统指的是由多个可以独立运行的计算单元构成的系统,这些计算单元通过通信网络相互...
《分布式系统原理与范型》是分布式系统中的经典教材,全书分为两部分:原理和范型。第一部分详细讨论了分布式系统的原理、概念和技术,其中包括通信、进程、命名、同步、一致性和复制、容错以及安全。第二部分给出了...
标题中的“C++多范型设计”指的是C++编程语言中的多范型(Multimodality)特性,这是C++的一个关键概念,它允许程序员在不同的抽象级别上编写代码,以适应不同场景的需求。C++的多范型主要包括模板(Templates)、...
C++多范型设计是C++编程语言中的一个重要概念,它允许程序员在不指定具体类型的情况下编写代码,从而实现代码的通用性和复用性。这种设计模式极大地提升了软件的灵活性和可扩展性,使得程序能够适应不同的数据类型,...
2. **函数模板**:函数模板允许定义一个通用的函数,该函数可以处理多种数据类型。例如,`swap()`函数模板可以交换任意类型的数据,只需编译器在运行时自动推断数据类型即可。 3. **类模板**:类模板是用于创建具有...
分布式系统原理与范型是计算机科学中的一个重要领域,它涵盖了多台计算机如何通过网络协同工作,以实现一个共同的目标。《分布式系统原理与范型(第二版)》这本书深入浅出地介绍了这一主题,旨在帮助读者理解分布式...
类模板定义了一个通用的类骨架,用户可以通过不同的类型参数来实例化这些类,以满足不同需求。 多范型设计还涉及到模板特化(template specialization)。在某些情况下,我们可能希望为特定的数据类型提供定制的...
书名:C++多范型设计 作者:[美]James O.Coplien 译者: 出版社:中国电力出版社 本书详细地介绍了从“应用领域”到“方案领域”的C++设计实现方法,以及开发者在设计思考和设计实践过程中需要用到的记法、图表和设计...