package com.lcsssh.dao.base;
import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.hibernate.HibernateException;
import org.hibernate.LockMode;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.lcsssh.bo.PageInfo;
public class HibernateBaseDAO extends HibernateDaoSupport implements BaseDao {
/**
* 根据主键ID查询对象
*
* @param c
* @param id
* @return Object
*/
public Object getById(Class c, Serializable id) {
return this.getHibernateTemplate().get(c, id);
}
/**
* 查询一个类的所有对象
*
* @param c
* @return List
*/
public List getAll(Class c) {
return this.getHibernateTemplate().loadAll(c);
}
/**
* 保存或者更新一个对象 当对象为临时状态时就保存对象 当对象为持久化或者游离状态时就更新对象
*
* @param o
*/
public void saveOrUpdate(Object o) {
this.getHibernateTemplate().saveOrUpdate(o);
}
/**
* 移除一个对象
*
* @param o
*/
public void delete(Object o) {
this.getHibernateTemplate().delete(o);
}
/**
* 使用给定的HQL字符串查询
*
* @param strHQL
* @return List
*/
public List findByHQL(final String strHQL) {
return this.getSession().createQuery(strHQL).list();
}
/**
* 根据给定的HQL语句与映射条件查询 用于复杂的查询语句 我们在代入查询参数的时候, 建议使用 name里面放的是HQL语句 eg: "from
* Courses where name = :name" map里面放的是你想绑定的参数实现集 eg: Map map = new
* HashMap(); map.put("name", "Tom"); 最后得到的结果就是 from Courses where name =
* Tom
*
* @param strHQL
* @param mapping
* @return List
*/
public List findByHQL(final String strHQL, final Map mappings) {
HibernateCallback hibernateCallback = new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Query query = session.createQuery(strHQL);
// 如果映射条件中不为空,则取出各条件拼接HQL语句
if (mappings != null || !mappings.isEmpty()) {
Iterator it = mappings.entrySet().iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
setParameterValues(query, (String) entry.getKey(),
entry.getValue());
}
}
List list = query.list();
return list;
}
};
return (List) this.getHibernateTemplate().execute(hibernateCallback);
}
/**
* 得到分页查询的记录
*
* @param hql
* @param values
* @param qEntity
* @return List
* @throws DataAccessException
*/
public List getQueryResult(final String strHQL, final Map mappings,
final PageInfo pageInfo) throws DataAccessException {
HibernateCallback hibernateCallback = new HibernateCallback() {
public Object doInHibernate(Session s) throws HibernateException,
SQLException {
String q = strHQL;
Query query = s.createQuery(q);
// 调用此方法向query对象中绑定查询参数
if (mappings != null && mappings.size() > 0) {
for (Iterator i = mappings.entrySet().iterator(); i.hasNext();) {
Map.Entry entry = (Map.Entry) i.next();
setParameterValues(query, (String) entry.getKey(), entry
.getValue());
}
}
// 分页控制 (根据当前的页数来得到要现在的记录集)
query.setFirstResult((pageInfo.getCurrentPage() - 1)
* pageInfo.getPerPageRows());
query.setMaxResults(pageInfo.getPerPageRows());
List list = query.list();
return list;
}
};
return this.getHibernateTemplate().executeFind(hibernateCallback);
}
/**
* 根据传入的查询语句的到记录的条数
*
* @param hql
* @param values
* @return int
* @throws DataAccessException
*/
public int getQueryCount(final String strHQL, final Map mappings)
throws DataAccessException {
HibernateCallback hibernateCallback = new HibernateCallback() {
public Object doInHibernate(Session s) throws HibernateException,
SQLException {
int fromIndex = strHQL.indexOf("from");
String q = "select count(*) " + strHQL.substring(fromIndex);
Query query = s.createQuery(q);
// 设置参数
if (mappings != null && mappings.size() > 0) {
for (Iterator i = mappings.entrySet().iterator(); i
.hasNext();) {
Map.Entry entry = (Map.Entry) i.next();
setParameterValues(query, (String) entry.getKey(),
entry.getValue());
}
}
Integer queryCount = (Integer) query.uniqueResult();
return queryCount;
}
};
return ((Integer) this.getHibernateTemplate().execute(hibernateCallback)).intValue();
}
/**
* 自动匹配数据类型
*
* @param query
* @param key
* @param value
*/
private void setParameterValues(Query query, String key, Object value) {
if (null == key || null == value) {
return;
} else if (value instanceof Boolean) {
query.setBoolean(key, ((Boolean) value).booleanValue());
} else if (value instanceof String) {
query.setString(key, (String) value);
} else if (value instanceof Integer) {
query.setInteger(key, ((Integer) value).intValue());
} else if (value instanceof Long) {
query.setLong(key, ((Long) value).longValue());
} else if (value instanceof Float) {
query.setFloat(key, ((Float) value).floatValue());
} else if (value instanceof Double) {
query.setDouble(key, ((Double) value).doubleValue());
} else if (value instanceof BigDecimal) {
query.setBigDecimal(key, (BigDecimal) value);
} else if (value instanceof Byte) {
query.setByte(key, ((Byte) value).byteValue());
} else if (value instanceof Calendar) {
query.setCalendar(key, (Calendar) value);
} else if (value instanceof Character) {
query.setCharacter(key, ((Character) value).charValue());
} else if (value instanceof Timestamp) {
query.setTimestamp(key, (Timestamp) value);
} else if (value instanceof Date) {
query.setDate(key, (Date) value);
} else if (value instanceof Short) {
query.setShort(key, ((Short) value).shortValue());
}
}
public List getAll(String strHQL) {
// TODO Auto-generated method stub
return null;
}
}
分享到:
相关推荐
这两个文件可能包含了非泛型版本的基础DAO接口和实现,可能是为了兼容没有使用泛型的旧代码或者提供一个基础的非泛型实现,以便于开发者根据需求进行扩展。 总结来说,"hibernate basedao(泛型版本)"是一个高效的...
1. **基础设计**:创建一个基类,如`HibernateBaseDAO<T>`,其中`T`为实体类的类型参数。这个基类应包含Hibernate SessionFactory的初始化,以及基本的保存(Save)、删除(Delete)、更新(Update)和查询...
`SimpleHibernateDao.java`这个名字暗示了这是一个简化版的Hibernate数据访问类,可能是基于`HibernateBaseDao`进一步封装的,目的是让开发者能够更快速、更直观地使用Hibernate功能。这个类可能会包含一些常用的...
Hibernate 是一个流行的基于 Java 的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到关系数据库中。然而,在将大量数据插入到数据库时,Hibernate 经常会出现性能和内存溢出问题。本文将讨论使用 ...
本篇文章将深入探讨一个使用Spring注解和Hibernate实现的泛型DAO设计,以提高代码的复用性和可维护性。 首先,`HibernateBaseDao.java`是基础的Hibernate DAO类,它提供了对Hibernate操作的基本封装。这个类通常会...
这里定义了两个数据源,一个是主数据源(primary),另一个是次级数据源(secondary)。 接下来,我们引入Hibernate的相关依赖,以便在项目中使用Hibernate作为ORM框架。在`pom.xml`中添加如下依赖: ```xml ...
5. 响应一个请求的分层结构约定,列举几个示例(常规调用、Ajax调用、WebService调用、提供WebService暴露、硬件设备接口调用); 6. 验证代码质量的约定,如JUnit、EMMA、FindBugs、CheckStyle、PMD的使用;Hudson...
然后,我们定义了一个DAO基类`HibernateBaseDao<T>`,该基类继承自`HibernateDaoSupport`,并实现了`BaseDao<T>`接口。在这个基类中,我们使用反射机制来获取泛型对应的实体类的类型,并提供了基本的CRUD操作。 在...
首先,在数据库里创建了一个jc_mycontent的表,其中有id,title,content三个字段 其次,创建了一个实体类 public class MyContent { private static final long serialVersionUID = 1L; private Integer id; ...