- 浏览: 710924 次
- 来自: ...
文章分类
最新评论
-
ranguisheng:
可以加点注释,代码不便于阅读.
用java实现数据库连接池的一个简单示例 -
abcd880129:
这样写的话,还要用专门的下载工具,不然,只能下到一个为空的ex ...
ZK下载文件时,不在服务器生成文件直接下载 -
234369425:
同上,是20
java计算阶乘 -
CodeToMyLaw:
如果目录中含有中文呢?
[^\x00-\xff] 中文的 ...
js验证文件目录格式的正确性 -
yanzhoupuzhang:
加了,还是报那个错误!
org.apache.commons.dbcp.BasicDataSource的解决方法
转载:http://blog.csdn.net/dingx
package sgf4web.dao; import java.io.Serializable; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.hibernate.*; import org.hibernate.criterion.*; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import sgf4web.dao.support.PaginationSupport; import sgf4web.util.GenericsUtils; /** *//** * 泛型Hibernate DAO类 * * @author DigitalSonic */ @SuppressWarnings("unchecked") public class HibernateGenericDao<T, ID extends Serializable> extends HibernateDaoSupport ...{ private Class<T> pojoClass; /** *//** * 初始化DAO,获取POJO类型 */ public HibernateGenericDao() ...{ // this.pojoClass = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0]; this.pojoClass = GenericsUtils.getSuperClassGenricType(getClass()); } /** *//** * 获得该DAO对应的POJO类型 */ public Class<T> getPojoClass() ...{ return this.pojoClass; } /** *//** * 获得该DAO对应的POJO类型名 */ public String getPojoClassName() ...{ return getPojoClass().getName(); } //加载对象 /** *//** * 加载所有的对象 */ public List<T> loadAll() ...{ return (List<T>)getHibernateTemplate().loadAll(getPojoClass()); } /** *//** * 根据hql查询 * * @param values 可变参数 */ public List find(String hql, Object... values) ...{ return getHibernateTemplate().find(hql, values); } /** *//** * 根据条件加载对象 * * @param criteria Criteria实例 */ public List<T> findByCriteria(final Criteria criteria) ...{ List list = criteria.list(); return transformResults(list); } /** *//** * 根据条件加载对象 * @param detachedCriteria DetachedCriteria实例 */ public List<T> findByCriteria(final DetachedCriteria detachedCriteria) ...{ return (List<T>) getHibernateTemplate().execute(new HibernateCallback() ...{ public Object doInHibernate(Session session) throws HibernateException ...{ Criteria criteria = detachedCriteria.getExecutableCriteria(session); List list = criteria.list(); return transformResults(list); } }, true); } /** *//** * 根据给定的实例查找对象 */ public List<T> findByExample(T instance) ...{ List<T> results = (List<T>)getHibernateTemplate().findByExample(instance); return results; } /** *//** * 根据ID查找对象 */ public T findById(ID id) ...{ return (T) getHibernateTemplate().get(getPojoClassName(), id); } /** *//** * 根据某个具体属性进行查找 */ public List<T> findByProperty(String propertyName, Object value) ...{ String queryString = "from " + getPojoClassName() + " as model where model." + propertyName + "= ?"; return (List<T>)getHibernateTemplate().find(queryString, value); } //新建、修改、删除 /** *//** * 新建对象实例化 */ public ID save(T transientInstance) ...{ return (ID)getHibernateTemplate().save(transientInstance); } /** *//** * 更新已存在的对象 */ public void update(T transientInstance) ...{ getHibernateTemplate().update(transientInstance); } /** *//** * 删除指定ID的对象 */ public void delete(ID id) ...{ T instance = findById(id); if (instance != null) getHibernateTemplate().delete(instance); } /** *//** * 删除指定对象 */ public void delete(T persistentInstance) ...{ getHibernateTemplate().delete(persistentInstance); } //分页 /** *//** * 根据Criteria加载分页,指定页大小和起始位置 */ public PaginationSupport findPageByCriteria(final Criteria criteria, final int pageSize, final int startIndex) ...{ int totalCount = getCountByCriteria(criteria); criteria.setProjection(null); List items = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list(); items = transformResults(items); PaginationSupport ps = new PaginationSupport(items, totalCount, pageSize, startIndex); return ps; } /** *//** * 根据Criteria加载分页,默认页大小,从第0条开始 */ public PaginationSupport findPageByCriteria(final Criteria criteria) ...{ return findPageByCriteria(criteria, PaginationSupport.PAGESIZE, 0); } /** *//** * 根据Criteria加载分页,默认页大小,从第startIndex条开始 */ public PaginationSupport findPageByCriteria(final Criteria criteria, final int startIndex) ...{ return findPageByCriteria(criteria, PaginationSupport.PAGESIZE, startIndex); } /** *//** * 根据Criteria统计总数 */ public int getCountByCriteria(final Criteria criteria) ...{ Integer count = (Integer) criteria.setProjection(Projections.rowCount()).uniqueResult(); return count.intValue(); } /** *//** * 根据DetachedCriteria加载分页,指定页大小和起始位置 */ public PaginationSupport findPageByCriteria(final DetachedCriteria detachedCriteria, final int pageSize, final int startIndex) ...{ return (PaginationSupport) getHibernateTemplate().execute(new HibernateCallback() ...{ public Object doInHibernate(Session session) throws HibernateException ...{ Criteria criteria = detachedCriteria.getExecutableCriteria(session); int totalCount = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue(); criteria.setProjection(null); List items = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list(); items = transformResults(items); PaginationSupport ps = new PaginationSupport(items, totalCount, pageSize, startIndex); return ps; } }, true); } /** *//** * 根据DetachedCriteria加载分页,默认页大小,从第0条开始 */ public PaginationSupport findPageByCriteria(final DetachedCriteria detachedCriteria) ...{ return findPageByCriteria(detachedCriteria, PaginationSupport.PAGESIZE, 0); } /** *//** * 根据DetachedCriteria加载分页,默认页大小,从第startIndex条开始 */ public PaginationSupport findPageByCriteria(final DetachedCriteria detachedCriteria, final int startIndex) ...{ return findPageByCriteria(detachedCriteria, PaginationSupport.PAGESIZE, startIndex); } /** *//** * 根据DetachedCriteria统计总数 */ public int getCountByCriteria(final DetachedCriteria detachedCriteria) ...{ Integer count = (Integer) getHibernateTemplate().execute(new HibernateCallback() ...{ public Object doInHibernate(Session session) throws HibernateException ...{ Criteria criteria = detachedCriteria.getExecutableCriteria(session); return criteria.setProjection(Projections.rowCount()).uniqueResult(); } }, true); return count.intValue(); } /** *//** * 根据hql加载分页,指定页大小和起始位置 */ public PaginationSupport findPageByQuery(final String hql, final int pageSize, final int startIndex, Object...values) ...{ int totalCount = getCountByQuery(hql, values); if (totalCount < 1) return new PaginationSupport(new ArrayList(0), 0); Query query = createQuery(hql, values); List items = query.setFirstResult(startIndex).setMaxResults(pageSize).list(); PaginationSupport ps = new PaginationSupport(items, totalCount, pageSize, startIndex); return ps; } /** *//** * 根据hql加载分页,默认页大小,从第0条开始 */ public PaginationSupport findPageByQuery(final String hql, Object...values) ...{ return findPageByQuery(hql, PaginationSupport.PAGESIZE, 0, values); } /** *//** * 根据hql加载分页,默认页大小,从第startIndex条开始 */ public PaginationSupport findPageByQuery(final String hql, final int startIndex, Object...values) ...{ return findPageByQuery(hql, PaginationSupport.PAGESIZE, startIndex, values); } /** *//** * 根据hql统计总数 */ public int getCountByQuery(final String hql, Object...values) ...{ String countQueryString = " select count (*) " + removeSelect(removeOrders(hql)); List countlist = getHibernateTemplate().find(countQueryString, values); return (Integer) countlist.get(0); } //创建Criteria和Query /** *//** * 创建Criteria对象 * * @param criterions 可变的Restrictions条件列表 */ public Criteria createCriteria(Criterion...criterions) ...{ Criteria criteria = getSession().createCriteria(getPojoClass()); for (Criterion c : criterions) criteria.add(c); return criteria; } /** *//** * 创建Criteria对象,带排序字段与升降序字段 */ public Criteria createCriteria(String orderBy, boolean isAsc, Criterion...criterions) ...{ Criteria criteria = createCriteria(criterions); if (isAsc) criteria.addOrder(Order.asc(orderBy)); else criteria.addOrder(Order.desc(orderBy)); return criteria; } /** *//** * 方法取自SpringSide. * 创建Query对象. 对于需要first,max,fetchsize,cache,cacheRegion等诸多设置的函数,可以在返回Query后自行设置. * 留意可以连续设置,如下: * <pre> * dao.getQuery(hql).setMaxResult(100).setCacheable(true).list(); * </pre> * 调用方式如下: * <pre> * dao.createQuery(hql) * dao.createQuery(hql,arg0); * dao.createQuery(hql,arg0,arg1); * dao.createQuery(hql,new Object[arg0,arg1,arg2]) * </pre> * * @param values 可变参数. */ public Query createQuery(String hql, Object... values) ...{ Query query = getSession().createQuery(hql); for (int i = 0; i < values.length; i++) ...{ query.setParameter(i, values); } return query; } /** *//** * 方法取自SpringSide. * 去除hql的select子句,未考虑union的情况 */ private static String removeSelect(String hql) ...{ int beginPos = hql.toLowerCase().indexOf("from"); return hql.substring(beginPos); } /** *//** * 方法取自SpringSide. * 去除hql的orderby子句 */ private static String removeOrders(String hql) ...{ Pattern p = Pattern.compile("order\s*by[\w|\W|\s|\S]*", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(hql); StringBuffer sb = new StringBuffer(); while (m.find()) ...{ m.appendReplacement(sb, ""); } m.appendTail(sb); return sb.toString(); } /** *//** * 将联合查询的结果内容从Map或者Object[]转换为实体类型,如果没有转换必要则直接返回 */ private List transformResults(List items) ...{ if (items.size() > 0) ...{ if (items.get(0) instanceof Map) ...{ ArrayList list = new ArrayList(items.size()); for (int i = 0; i < items.size(); i++) ...{ Map map = (Map)items.get(i); list.add(map.get(CriteriaSpecification.ROOT_ALIAS)); } return list; } else if (items.get(0) instanceof Object[]) ...{ ArrayList list = new ArrayList(items.size()); int pos = 0; for (int i = 0; i < ((Object[])items.get(0)).length; i++) ...{ if (((Object[])items.get(0)).getClass() == getPojoClass()) ...{ pos = i; break; } } for (int i = 0; i < items.size(); i++) ...{ list.add(((Object[])items.get(i))[pos]); } return list; } else return items; } else return items; } } package sgf4web.util; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; /** *//** * 泛型参数辅助类 * * @author DigitalSonic */ @SuppressWarnings("unchecked") public class GenericsUtils ...{ /** *//** * 通过反射,获得定义Class时声明的父类的第一个范型参数的类型。 */ public static Class getSuperClassGenricType(Class clazz) ...{ return getSuperClassGenricType(clazz, 0); } /** *//** * 通过反射,获得定义Class时声明的父类的范型参数的类型。 * 如没有找到符合要求的范型参数,则递归向上直到Object。 * * @param clazz 要进行查询的类 * @param index 如有多个范型声明该索引从0开始 * @return 在index位置的范型参数的类型,如果无法判断则返回<code>Object.class</code> */ public static Class getSuperClassGenricType(Class clazz, int index) ...{ boolean flag = true; Type genType = clazz.getGenericSuperclass(); Type[] params = null; if (!(genType instanceof ParameterizedType)) flag = false; else ...{ params = ((ParameterizedType) genType).getActualTypeArguments(); if (index >= params.length || index < 0) flag = false; if (!(params[index] instanceof Class)) flag = false; } if (!flag) ...{ clazz = clazz.getSuperclass(); if (clazz == Object.class) return Object.class; else return getSuperClassGenricType(clazz, index); } return (Class) params[index]; } } package sgf4web.dao.support; import java.util.List; /** *//** * 分页类,参考自JavaEye及SpringSide */ @SuppressWarnings("unchecked") public class PaginationSupport ...{ public final static int PAGESIZE = 10; private int pageSize = PAGESIZE; private List items; private int totalCount; private int[] indexes = new int[0]; private int startIndex = 0; public PaginationSupport(List items, int totalCount) ...{ setPageSize(PAGESIZE); setTotalCount(totalCount); setItems(items); setStartIndex(0); } public PaginationSupport(List items, int totalCount, int startIndex) ...{ setPageSize(PAGESIZE); setTotalCount(totalCount); setItems(items); setStartIndex(startIndex); } public PaginationSupport(List items, int totalCount, int pageSize, int startIndex) ...{ setPageSize(pageSize); setTotalCount(totalCount); setItems(items); setStartIndex(startIndex); } /** *//** * 将页码转换为列表的startIndex,页大小为默认大小 */ public static int convertFromPageToStartIndex(int pageNo) ...{ return (pageNo - 1) * PAGESIZE; } /** *//** * 将页码转换为列表的startIndex */ public static int convertFromPageToStartIndex(int pageNo, int pageSize) ...{ return (pageNo - 1) * pageSize; } public List getItems() ...{ return items; } public void setItems(List items) ...{ this.items = items; } public int getPageSize() ...{ return pageSize; } public void setPageSize(int pageSize) ...{ this.pageSize = pageSize; } public int getTotalCount() ...{ return totalCount; } /** *//** * 设置数据总数,并计算各页起始位置 */ public void setTotalCount(int totalCount) ...{ if (totalCount > 0) ...{ this.totalCount = totalCount; int count = totalCount / pageSize; if (totalCount % pageSize > 0) count++; indexes = new int[count]; for (int i = 0; i < count; i++) ...{ indexes = pageSize * i; } } else ...{ this.totalCount = 0; } } public int[] getIndexes() ...{ return indexes; } public void setIndexes(int[] indexes) ...{ this.indexes = indexes; } public int getStartIndex() ...{ return startIndex; } /** *//** * 设置当前起始位置 */ public void setStartIndex(int startIndex) ...{ if (totalCount <= 0) this.startIndex = 0; else if (startIndex >= totalCount) this.startIndex = indexes[indexes.length - 1]; else if (startIndex < 0) this.startIndex = 0; else ...{ this.startIndex = indexes[startIndex / pageSize]; } } /** *//** * 获得下页起始位置 */ public int getNextIndex() ...{ int nextIndex = getStartIndex() + pageSize; if (nextIndex >= totalCount) return getStartIndex(); else return nextIndex; } /** *//** * 获得上页起始位置 */ public int getPreviousIndex() ...{ int previousIndex = getStartIndex() - pageSize; if (previousIndex < 0) return 0; else return previousIndex; } /** *//** * 取总页数. */ public long getTotalPageCount() ...{ if (totalCount % pageSize == 0) return totalCount / pageSize; else return totalCount / pageSize + 1; } /** *//** * 取该页当前页码,页码从1开始. */ public long getCurrentPageNo() ...{ return startIndex / pageSize + 1; } /** *//** * 该页是否有下一页. */ public boolean hasNextPage() ...{ return this.getCurrentPageNo() < this.getTotalPageCount() - 1; } /** *//** * 该页是否有上一页. */ public boolean hasPreviousPage() ...{ return this.getCurrentPageNo() > 1; } }
发表评论
-
Hibernate事务与并发问题处理
2013-08-03 17:11 632数据库事务,是指作为单个逻辑工作单元执行的一系列操作。事务处理 ... -
Hibernate数据查询
2009-05-27 17:57 1722转载:http://blog.csdn.net/l ... -
Hibernate中级联操作cascade选项
2009-05-27 17:42 969转载:http://blog.csdn.net/lenotan ... -
Hibernate QBC高级查询
2009-05-27 17:39 1521转载:http://blog.csdn.net/l ... -
hibernate实体N对N映射实例(1)
2009-04-30 17:21 1240转载:http://hi.baidu.com/yuanquan ... -
hibernate中hql简介
2009-04-30 17:17 1243传统的SQL语言采用的是结构化的查询方法,而这种方法对于查询以 ... -
HQL查询及语法
2009-03-31 09:56 1245转载:http://blog.chinaunix.net ... -
Hibernate的主键生成方式
2009-03-26 16:53 905Hibernate中,<id>标签下的可选< ... -
Hibernate3.2对sqlserver2005查询分页的处理
2009-03-26 16:49 1292对Hibernate的查询分页,想必大家都比较熟悉了。setF ... -
Hibernate之---实体映射
2009-03-26 12:17 930转载:http://hi.baidu.com/javajava ... -
Hibernate之---复合主键
2009-03-26 12:16 1360转载:http://hi.baidu.com/javajava ... -
Hibernate过滤器
2009-03-26 12:12 1059import java.io.IOException; ... -
HibernateUtil.java
2009-03-26 12:11 2377import javax.naming.InitialCo ... -
HibernateDAO.java
2009-03-26 12:10 1267import java.util.List; /** ... -
Hibernate配置文件中配置各种数据库的driver、URL
2009-03-26 12:07 8952hibernate.properties ##### ... -
hql的几种常见形式
2009-03-23 18:52 1586session.createQuery(hql); Hibe ... -
Hibernate查询实体对象
2009-03-23 18:51 2225n+1问题:在默认情况下,使用query.iterator() ... -
Hibernate的缓存
2009-03-23 18:49 977转载:http://hi.baidu.com/javajava ... -
Hibernate存取图片示例
2009-03-03 17:29 1482一般网站在处理用户上传图片时通常采用两种策略:一是直接把图片存 ... -
HibernateTemplate相关方法
2009-02-27 17:21 3111转载:http://blog.csdn.net/m ...
相关推荐
泛型DAO是一个通用的DAO实现,它使用Java的泛型特性,可以适用于任何继承自特定基类或者实现特定接口的数据实体类。这样,我们只需要编写一次DAO的通用实现,然后在需要的地方通过指定具体的类型即可。 下面是一个...
而泛型DAO是一个类型安全的,代码精简的设计模式(相对于传统DAO),尤其在DAO组件数量庞大的时候,代码量的减少更加明显。 泛型DAO的核心是定义一个GenericDao接口,声明基本的CRUD操作: 用hibernate作为持久化...
例如,它可能会定义一个Hibernate的SessionFactory或Data Source,这样就可以在泛型DAO中使用这些配置来操作数据库。 总之,泛型DAO是Java开发中一个非常实用的设计模式,它通过泛型提升了代码的复用性,并且与ORM...
3. **Hibernate**:Hibernate是一个对象关系映射(ORM)框架,能够将Java对象与数据库表进行映射,简化数据库操作。在整合中,Hibernate负责数据的持久化,通过配置实体类和映射文件,可以实现对数据库的CRUD操作。 ...
而泛型DAO是DAO模式的一个进阶应用,它通过引入泛型来提高代码的复用性和可维护性。 泛型(Generics)是Java 5引入的一个重要特性,它可以让我们在编译时检查类型安全,并且允许我们创建参数化的类型。在泛型DAO中...
在这个特定的讨论中,我们聚焦于SSH1中的一个关键概念:通用泛型DAO(Data Access Object)以及分页功能的实现。DAO层是模型层和数据访问层之间的桥梁,它的主要职责是处理数据库操作,为业务层提供无状态的数据访问...
描述中提到的“剥离出来的泛型Hibernate”可能是指从一个大型项目中抽取出来的一个独立组件,这个组件专注于泛型DAO的实现,以便在其他项目中复用。博文链接指向的ITEYE博客文章可能详细解释了如何实现这样的泛型DAO...
- `DAO(1).rar`可能包含使用泛型的DAO设计模式示例,展示了如何创建泛型DAO以处理不同类型的数据对象。 综上所述,SSH框架结合泛型能够提升Java应用的开发效率和代码质量。通过学习和理解这些示例,开发者可以更好...
在Java开发领域,SSH(Struts、Spring、Hibernate)是一个常见的企业级应用框架组合,而Spring框架是其中的核心,它负责管理和协调各个组件。在Spring 4版本中,泛型依赖注入是一项重要的特性,它极大地提高了代码的...
DAO(Data Access Object)开发模式是一种常见的软件设计模式,它主要用于隔离业务逻辑层...不过,在没有使用Spring等框架的情况下,可以自行设计一个简单的IOC容器来管理DAO的创建和事务处理,如上述例子中的DAO工厂。
- Hibernate是Java领域的一个ORM(对象关系映射)框架,它允许开发者用面向对象的方式来操作数据库,避免了繁琐的SQL代码编写。 - 在这个例子中,Hibernate用于建立Java对象(Entity)与数据库表之间的映射关系,...
在这个例子中,`BaseDao`是一个抽象基类,它使用了泛型T来表示任何类型的实体。构造函数接收实体类的Class对象,用于获取表名。`insert()`方法使用反射调用`execute()`方法执行SQL,这里省略了具体的JDBC操作细节,...
在这个例子中,`HibernateDaoSupport`是Hibernate提供的一个基类,它提供了与SessionFactory的交互,使得我们可以很方便地进行数据库操作。通过这种方式,我们可以通过泛型来处理不同的实体类,而无需为每个实体类...
BaseDao是一个接口,它定义了一系列通用的数据库操作方法,如查询、保存、更新和删除。这些方法是基于Hibernate或其他ORM框架的API设计的。通过在项目中引入BaseDao接口,开发者可以在具体的DAO实现类中重用这些方法...
在这个例子中,我们使用的是泛型DAO(IGenericDao),它专门用于从数据库中读取和写入对象。 `IGenericDao.read()`方法接受一个Java类(如`Employee.class`)和一个SQL查询,然后根据类名、getter和setter方法自动...
在实际开发中,一个SSH项目会包含各种配置文件(如struts-config.xml、hibernate.cfg.xml)、Java源代码(Action类、DAO类、Service类等)、JSP页面以及数据库脚本等。开发者通常会利用IDE(如Eclipse或IntelliJ ...
使用泛型封装dao、service、controller基类,包含分页,查询条件封装,从而达到快速crud操作 基于hibernate简单查询条件的封装 权限管理——使用框架apache shiro进行系统认证、授权操作(完成) 系统认证、授权操作 ...