- 浏览: 1635369 次
- 性别:
- 来自: 长春
文章分类
- 全部博客 (309)
- ext (19)
- web (13)
- PHP (19)
- 互联网新闻 (3)
- oracle (3)
- Mootools (1)
- FLEX (3)
- 人在职场 (2)
- hibernate (24)
- spring2 (1)
- J2SE (24)
- WEB_UI (14)
- 其它 (11)
- Log4J (1)
- iText (10)
- SQL (11)
- 设计模式 (3)
- lucene (6)
- 开源项目 (2)
- javascript (20)
- 软件&破解补丁 (48)
- Quartz (2)
- 解决方案 (1)
- 工作存档 (2)
- JAVA对文件操作 (2)
- C&C#&VC (1)
- struts2 (3)
- 版本控制 (2)
- 软考基础 (23)
- JBPM (2)
- velocity (4)
- javamail (3)
- HttpClient (9)
- 虚拟化技术 (2)
- 报表 (3)
- ibatis (5)
- Spring (4)
- 信用卡 (0)
- 芒果钱包 (0)
- 养卡 (0)
最新评论
-
a601962168:
...
通过JAVA与串口(RS232)通信实例 -
olive009:
...
Adobe Acrobat 9 Pro & Pro Extended 中文版/英文版 下载及破解补丁 -
overshit:
api更新了,一加filter就Callback filter ...
深入浅出CGlib-打造无入侵的类代理 -
u010778233:
写得很不错,已经用起来了,谢谢
将jdbc结果集转换成对象列表 -
924060929:
我想找就是要这个功能!!!!!!!!
velocity基础教程--2自定义ResourceLoader实现字符模板
这个东西是一年前弄的,不过一直没用到,里面有些东西已经记不太清了,还好注释应该可以看懂。
目的是希望设计一个基于hibernate的泛型Dao框架
推荐一个J2EE的群:46176507
首先创建一个java项目GenericDao
我们创建一个包com.hb.generic.dao
该包用来作为我们的基础dao包
首先我们创建一个针对单个实体操作的泛型EntityDao<T>接口。
用于定义针对单个实体的CRUD操作。
接着我们在定义一个接口类HibernateCallback,定义一个回调接口。
接下来我们定义一个com.hb.generic.dao.utils包,
该包的目的是用于防治一些常用方法的抽取,该包中的一些类是我平时的收集和积累。
我们这里只对关键类进行说明
BeanUtils :工具类,通过反射机制对对象进行存取值
GenericUtils:工具类,取得类中的泛型类型
里面基本上都有都有注释
我们在com.hb.generic.dao.support包下创建一个分页类(不做具体介绍,基本上分页都差不多)
我们需要在com.hb.generic.dao包下创建HibernateDaoHandler接口
在用户使用的时候需要实现该接口获取session
接下来我们会创建HibernateDaoSupport类
Dao的基类: 提供分页函数和若干便捷查询方法,并对返回值作了泛型类型转换.
HibernateGenericDao:最终面向用户使用的类。
现在我们的dao泛型框架已经完成,我们进行测试一下
我现在数据库中创建表Person
我们创建person.test包
我们创建实体bean
我们设置Person.hbm.xml映射文件
接下来我们配置hibernate.cfg.xml
接下来我们创建SessionFactory
这个会话工厂是由工具生成的这里不做详细介绍。
接下来我们创造PersonManager所有的Person操作都由他完成,神奇吧只需继承我们之前的HibernateGenericDao并实现getSession就可以。
下面我们写一个main方法进行测试。
目的是希望设计一个基于hibernate的泛型Dao框架
推荐一个J2EE的群:46176507
首先创建一个java项目GenericDao
我们创建一个包com.hb.generic.dao
该包用来作为我们的基础dao包
首先我们创建一个针对单个实体操作的泛型EntityDao<T>接口。
/** * @author llying * @company qm */ public interface EntityDao<T> { T get(Serializable id); List<T> getAll(); void save(T newInstance); void remove(T transientObject); void removeById(Serializable id); String getIdName(Class clazz); }
用于定义针对单个实体的CRUD操作。
接着我们在定义一个接口类HibernateCallback,定义一个回调接口。
import org.hibernate.Session; /** * @author llying * @company qm */ public interface HibernateCallback { Object doInHibernate(Session session); }
接下来我们定义一个com.hb.generic.dao.utils包,
该包的目的是用于防治一些常用方法的抽取,该包中的一些类是我平时的收集和积累。
我们这里只对关键类进行说明
BeanUtils :工具类,通过反射机制对对象进行存取值
GenericUtils:工具类,取得类中的泛型类型
里面基本上都有都有注释
我们在com.hb.generic.dao.support包下创建一个分页类(不做具体介绍,基本上分页都差不多)
我们需要在com.hb.generic.dao包下创建HibernateDaoHandler接口
import org.hibernate.Session; /** * @author llying * @company qm */ public interface HibernateDaoHandler { Session getSession(); }
在用户使用的时候需要实现该接口获取session
接下来我们会创建HibernateDaoSupport类
Dao的基类: 提供分页函数和若干便捷查询方法,并对返回值作了泛型类型转换.
package com.hb.generic.dao; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.criterion.CriteriaSpecification; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Order; import org.hibernate.criterion.Projection; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.hibernate.impl.CriteriaImpl; import org.hibernate.impl.CriteriaImpl.OrderEntry; import com.hb.generic.dao.support.Page; import com.hb.generic.dao.utils.Assert; import com.hb.generic.dao.utils.BeanUtils; /** * Dao的基类. * * 提供分页函数和若干便捷查询方法,并对返回值作了泛型类型转换. * @author llying * @company qm */ public abstract class HibernateDaoSupport<T> implements HibernateDaoHandler { private static final Log log = LogFactory.getLog(HibernateDaoSupport.class); public Object execute(HibernateCallback action){ Assert.notNull(action, "Callback object 对象不能为 Null "); Session session = getSession(); Transaction tr = session.beginTransaction(); Object result = action.doInHibernate(session); tr.commit(); session.close(); return result; } /** * 获取全部的对象 * @param <T> * @param entityClass 对象类型 * @return */ @SuppressWarnings("unchecked") public <T>List<T> getAll(final Class<T> entityClass) { return (List<T>)execute(new HibernateCallback(){ public Object doInHibernate(Session session) { Criteria criteria = session.createCriteria(entityClass); return criteria.list(); } }); } /** * 获取全部对象,带排序功能 * @param <T> * @param entityClass 实体对象 * @param orderBy 排序字段 * @param isAsc 升序或降序 * @return */ @SuppressWarnings({ "hiding", "hiding", "unchecked" }) public <T> List <T> getAll(final Class<T> entityClass,final String orderBy,final boolean isAsc){ Assert.hasText(orderBy); return (List<T>) execute(new HibernateCallback(){ public Object doInHibernate(Session session) { if (isAsc) return session.createCriteria(entityClass).addOrder(Order.asc(orderBy)).list(); return session.createCriteria(entityClass).addOrder(Order.desc(orderBy)).list(); } }); } /** * 保存对象 * @param newInstance */ @SuppressWarnings("unused") public void saveOrUpdate(final T newInstance){ execute(new HibernateCallback(){ public Object doInHibernate(Session session) { session.saveOrUpdate(newInstance); return null; } }); } /** * 删除对象 * @param transientObject */ public void remove(final T transientObject) { execute(new HibernateCallback(){ public Object doInHibernate(Session session) { session.delete(transientObject); return null; } }); } /** * * @param entityClass * @param id */ public void removeById(Class<T> entityClass, Serializable id) { remove( get(entityClass, id)); } /** * 根据Id获取对象。 * @param <T> * @param entityClass * @param id 实体Id * @return 实体对象 */ @SuppressWarnings({ "hiding", "unchecked" }) public <T> T get(final Class<T> entityClass,final Serializable id) { return (T) execute(new HibernateCallback(){ public Object doInHibernate(Session session) { return session.get(entityClass, id); } }); } /** * 创建一个Query对象。 * @param hql * @param values * @return */ public Query createQuery(String hql,Object...values){ Assert.hasText(hql); Query query = getSession().createQuery(hql); for(int i = 0;i<values.length;i++){ query.setParameter(i, values[i]); } return query; } /** * 创建Criteria对象。 * @param <T> * @param entityClass * @param criterions * @return */ public <T>Criteria createCriteria(Class<T> entityClass,Criterion...criterions){ Criteria criteria = getSession().createCriteria(entityClass); for(Criterion c:criterions){ criteria.add(c); } return criteria; } /** * 创建Criteria对象,有排序功能。 * @param <T> * @param entityClass * @param orderBy * @param isAsc * @param criterions * @return */ public <T>Criteria createCriteria(Class<T> entityClass,String orderBy,boolean isAsc,Criterion...criterions){ Assert.hasText(orderBy); Criteria criteria = createCriteria(entityClass,criterions); if(isAsc){ criteria.addOrder(Order.asc(orderBy)); }else{ criteria.addOrder(Order.desc(orderBy)); } return criteria; } /** * 根据hql查询 * @param hql * @param values * @return */ public List find(final String hql,final Object...values){ Assert.hasText(hql); return createQuery(hql, values).list(); /* return (List) execute(new HibernateCallback(){ public Object doInHibernate(Session session) { Query query = session.createQuery(hql); for(int i = 0;i<values.length;i++){ query.setParameter(i, values[i]); } return query.list(); } });*/ } /** * 根据属性名和属性值查询. * * @return */ public <T>List<T> findBy(Class<T> entityClass,String propertyName,Object value){ Assert.hasText(propertyName); return createCriteria(entityClass, Restrictions.eq(propertyName, value)).list(); } /** * 根据属性名和属性值查询. 有排序 * @param <T> * @param entityClass * @param propertyName * @param value * @param orderBy * @param isAsc * @return */ public <T>List<T> findBy(Class<T> entityClass,String propertyName,Object value,String orderBy,boolean isAsc){ Assert.hasText(propertyName); Assert.hasText(orderBy); return createCriteria(entityClass, orderBy, isAsc, Restrictions.eq(propertyName, value)).list(); } /** * 根据属性名和属性值 查询 且要求对象唯一. * * @return 符合条件的唯一对象. */ public <T>T findUniqueBy(Class<T> entityClass,String propertyName,Object value){ Assert.hasText(propertyName); return (T)createCriteria(entityClass, Restrictions.eq(propertyName, value)).uniqueResult(); } /** * 分页 通过hql进行 * @param hql * @param pageNo * @param pageSize * @param values * @return */ public Page pagedQuery(String hql,int pageNo,int pageSize,Object...values){ Assert.hasText(hql); Assert.isTrue(pageNo>=1); String countQueryString = "select count(*)" + removeSelect(removeOrders(hql)); System.out.println(countQueryString); List countList = find(countQueryString, values); long totalCount = (Long) countList.get(0); System.out.println(totalCount); if(totalCount<1){ return new Page(); } int startIndex = Page.getStartOfPage(pageNo, pageSize); Query query = createQuery(hql,values); List list = query.setFirstResult(startIndex).setMaxResults(pageSize).list(); return new Page(startIndex,totalCount,pageSize,list); } /** * 分页 通过criteria * @param criteria * @param pageNo * @param pageSize * @return */ public Page pagedQuery(Criteria criteria,int pageNo,int pageSize){ Assert.notNull(criteria); Assert.isTrue(pageNo>=1); CriteriaImpl criteriaImpl = (CriteriaImpl) criteria; //先把Projection和OrderBy条件取出来,清空两者来执行Count操作 Projection projection = criteriaImpl.getProjection(); List<CriteriaImpl.OrderEntry> orderEntitys = null; try { orderEntitys=(List<OrderEntry>) BeanUtils.forceGetProperty(criteriaImpl, "orderEntries"); BeanUtils.forceSetProperty(criteriaImpl, "orderEntries", new ArrayList()); } catch (NoSuchFieldException e) { e.printStackTrace(); } //取得总的数据数 long totalCount = (Long) criteria.setProjection(Projections.rowCount()).uniqueResult(); //将之前的Projection和OrderBy条件重新设回去 criteria.setProjection(projection); if (projection == null) { criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY); } try { BeanUtils.forceSetProperty(criteriaImpl, "orderEntries", orderEntitys); } catch (NoSuchFieldException e) { e.printStackTrace(); } if(totalCount<1) return new Page(); int startIndex = Page.getStartOfPage(pageNo, pageSize); List data = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list(); return new Page( startIndex, totalCount, pageSize, data); } /** * 分页查询函数 * @param entityClass * @param pageNo * @param pageSize * @param criterions * @return */ public Page pagedQuery(Class<T> entityClass,int pageNo,int pageSize,Criterion...criterions){ Criteria criteria = createCriteria(entityClass, criterions); return pagedQuery(criteria, pageNo, pageSize); } /** * 分页查询带排序 * @param entityClass * @param pageNo * @param pageSize * @param orderBy * @param isAsc * @param criterions * @return */ public Page pagedQuery(Class<T> entityClass,int pageNo,int pageSize,String orderBy,boolean isAsc,Criterion...criterions){ Criteria criteria = createCriteria(entityClass, orderBy, isAsc, criterions); return pagedQuery(criteria, pageNo, pageSize); } /** * 去除hql的select子句。 * @param hql * @return * @see #pagedQuery(String,int,int,Object[]) */ private static String removeSelect(String hql){ Assert.hasText(hql); int beginPos = hql.toLowerCase().indexOf("from"); Assert.isTrue(beginPos!=-1,hql); return hql.substring(beginPos); } /** * 去除hql的orderBy子句。 * @param hql * @return * @see #pagedQuery(String,int,int,Object[]) */ private static String removeOrders(String hql) { Assert.hasText(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(); } }
HibernateGenericDao:最终面向用户使用的类。
/** * * @author llying * @company qm */ @SuppressWarnings("unchecked") public abstract class HibernateGenericDao<T> extends HibernateDaoSupport<T> implements EntityDao<T>{ protected Class<T> entityClass; public HibernateGenericDao(){ /** * this.getClass()的目的是返回当前对象运行时的类 * 通过工具类GenericUtils返回泛型T的实际类对象 */ entityClass = GenericUtils.getSuperClassGenericType(getClass()); } public T get(Serializable id) { return get(entityClass,id); } public List<T> getAll() { return getAll(entityClass); } public String getIdName(Class clazz) { return null; } public void removeById(Serializable id) { removeById(entityClass,id); } public void save(T newInstance) { saveOrUpdate(newInstance); } /** * 查询全部,带排序 * @param orderBy * @param isAsc * @return */ public List<T> getAllByOrder(String orderBy,boolean isAsc){ return getAll(entityClass,orderBy,isAsc); } /** * 根据属性名和属性值查询对象 * @param propertyName * @param value * @return */ public List<T> findBy(String propertyName,Object value){ return findBy(entityClass, propertyName, value); } /** * 根据属性名和属性值进行查询对象,带排序 * @param propertyName * @param value * @param isAsc * @param orderBy * @return */ public List<T> findBy(String propertyName,Object value,boolean isAsc,String orderBy){ return findBy(entityClass, propertyName, value, orderBy, isAsc); } /** * 根据属性名和属性值进行查询对象,返回符合条件的唯一对象。 * 如果对象不唯一将抛出异常 * @param <T> * @param propertyName * @param value * @return */ public <T> T findUniqueBy(String propertyName,Object value){ return (T) findUniqueBy(entityClass, propertyName, value); } }
现在我们的dao泛型框架已经完成,我们进行测试一下
我现在数据库中创建表Person
CREATE TABLE `person` ( `p_id` int(11) NOT NULL auto_increment, `p_name` varchar(255) NOT NULL, `p_age` int(11) NOT NULL, PRIMARY KEY (`p_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我们创建person.test包
我们创建实体bean
package person.test; import java.io.Serializable; public class Person implements Serializable{ private Integer id; private String name; private Integer age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
我们设置Person.hbm.xml映射文件
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="person.test.Person" table="person"> <id name="id" type="java.lang.Integer"> <column name="p_id"></column> <generator class="native"></generator> </id> <property name="name" type="java.lang.String"> <column name="p_name" length="255" not-null="true"></column> </property> <property name="age" type="java.lang.Integer"> <column name="p_age" not-null="true"></column> </property> </class> </hibernate-mapping>
接下来我们配置hibernate.cfg.xml
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="connection.username">root</property> <property name="connection.url"> jdbc:mysql://localhost:3306/genericdao </property> <property name="dialect"> org.hibernate.dialect.MySQLDialect </property> <property name="myeclipse.connection.profile">mysql</property> <property name="connection.driver_class"> com.mysql.jdbc.Driver </property> <mapping resource="person/test/Person.hbm.xml" /> </session-factory> </hibernate-configuration>
接下来我们创建SessionFactory
这个会话工厂是由工具生成的这里不做详细介绍。
接下来我们创造PersonManager所有的Person操作都由他完成,神奇吧只需继承我们之前的HibernateGenericDao并实现getSession就可以。
package person.test; import org.hibernate.Session; import com.hb.generic.dao.HibernateGenericDao; public class PersonManager extends HibernateGenericDao<Person> { @Override public Session getSession() { // TODO Auto-generated method stub return HibernateSessionFactory.getSession(); } }
下面我们写一个main方法进行测试。
/** * 1.测试save方法 */ public void testSave(){ for(int i=1;i<100;i++){ Person p = new Person(); p.setName("pname"+i); p.setAge(i); pm.save(p); } } /** * 2.测试getAll方法 */ public void testGetAll(){ List<Person> list = pm.getAll(); System.out.println(list.size()); for(Person p: list){ System.out.println("------------------------"); System.out.println("id :" + p.getId()); System.out.println("name :" + p.getName()); System.out.println("age :" + p.getAge()); } } /** * 3.测试get方法 */ public void testGet(){ Person p = pm.get(new Integer(20)); System.out.println("id :" + p.getId()); System.out.println("name :" + p.getName()); System.out.println("age :" + p.getAge()); } /** * 4.测试排序方法 getAllByOrder */ public void testGetAllByOrder(){ List<Person> list = pm.getAllByOrder("age", true); System.out.println("-- Asc --"); for(Person p: list){ System.out.println(p.getId()); System.out.println(p.getName()); System.out.println(p.getAge()); } System.out.println("-- Desc --"); list = pm.getAllByOrder("age", false); for(Person p: list){ System.out.println(p.getId()); System.out.println(p.getName()); System.out.println(p.getAge()); } } /** * 5.测试find方法 即hql查询 */ public void testFind(){ List<Person>list = pm.find("from Person p where p.age = ?", 50); for(Person p: list){ System.out.println(p.getId()); System.out.println(p.getName()); System.out.println(p.getAge()); } list = pm.find("from Person p where p.age > ? and p.age < ?",30,50); for(Person p: list){ System.out.println(p.getId()); System.out.println(p.getName()); System.out.println(p.getAge()); } } /** * 6.测试findBy方法 即简单查询 */ public void testFindBy(){ List<Person>list = pm.findBy("age", 11); for(Person p: list){ System.out.println(p.getId()); System.out.println(p.getName()); System.out.println(p.getAge()); } //如果多个按name字段排序 list = pm.findBy("age", 15, false, "name"); for(Person p: list){ System.out.println(p.getId()); System.out.println(p.getName()); System.out.println(p.getAge()); } } /** * 7.findUniqueBy查询 仅返回单个对象 */ public void testFindUniqueBy(){ Person p = pm.findUniqueBy("age", 16); System.out.println("id :" + p.getId()); System.out.println("name :" + p.getName()); System.out.println("age :" + p.getAge()); } /** * 8.分页查询测试 pageQuery */ public void testPagedQuery(){ Page page = pm.pagedQuery("from Person p where p.age > ?", 1, 20, 11); System.out.println("currentPageNo " + page.getCurrentPageNo()); System.out.println("totalCount " + page.getTotalCount()); List<Person> list = (List<Person>) page.getResult(); for(Person p: list){ System.out.println("id :" + p.getId()); System.out.println("name :" + p.getName()); System.out.println("age :" + p.getAge()); } } /** * 9.更新方法 测试saveOrUpdate */ public void testUpdate(){ Person p = pm.findUniqueBy("age", 16); p.setName("16per"); pm.saveOrUpdate(p); p = pm.findUniqueBy("age", 16); System.out.println(p.getName()); } /** * 10.测试通过id删除方法 removeById */ public void testRemoveById(){ pm.removeById(23); Person p = pm.get(new Integer(23)); System.out.println(p==null); } /** * 11.测试通过对象删除 remove */ public void testRemove(){ Person p = pm.get(new Integer(24)); pm.remove(p); p = pm.get(new Integer(24)); System.out.println(p==null); }
- GenericDao.zip (6.6 MB)
- 下载次数: 800
评论
7 楼
kowen
2015-12-15
HibernateDaoSupport的execute方法中会关闭session, 导致在service层的懒加载爆出session close错误,这个怎么改?
6 楼
dongyongcool
2014-09-17
public synchronized T get(Object... cList) {
Criteria criteria = getSession().createCriteria(entityClass);
for(Object c : cList) {
criteria.add((Criterion)c);
}
List resultList = criteria.list();
if(resultList.size()==0) {
return null;
} else {
return (T)resultList.get(0);
}
}
这个方法有没有问题,现在程序出现:A/B同时请求该方法,遍历之后A数据出现在B数据中,导致查询不到结果,求解决
Criteria criteria = getSession().createCriteria(entityClass);
for(Object c : cList) {
criteria.add((Criterion)c);
}
List resultList = criteria.list();
if(resultList.size()==0) {
return null;
} else {
return (T)resultList.get(0);
}
}
这个方法有没有问题,现在程序出现:A/B同时请求该方法,遍历之后A数据出现在B数据中,导致查询不到结果,求解决
5 楼
WeMe_Jun
2014-04-04
我喜欢这样的文章
4 楼
leexiaodong2009
2013-04-05
写的很好啊 我也转载了
3 楼
gmfxbde
2012-12-06
太棒了,很给力!!!!
2 楼
oceandeep
2011-01-19
写的很好啊 我也转载了
1 楼
明天的昨天
2009-09-24
大佬 好文章 我转载了 谢谢你
发表评论
-
Hibernate + EhCache 实现数据缓存的处理
2009-10-16 15:35 2649大家都了解对于信息的展示应用中解决对数据库的频繁访问主要有两种 ... -
hibernate的session.flush
2008-07-30 21:32 1677测试session.flush 1、session在什么情况 ... -
hibernate在单端关联上的lazy策略
2008-07-30 21:30 1443hibernate在单端关联上的lazy策略,<one- ... -
hibernate在集合上的lazy策略
2008-07-30 21:29 1337hibernate在集合上的lazy策略,可以取值true/f ... -
hibernate的lazy策略forClass
2008-07-30 21:26 1353lazy策略可以用在: * <class>标签上 ... -
hibernate多对多关联映射(双项关联)
2008-07-30 21:24 1514hibernate多对多关联映射(双项关联)user<- ... -
基本映射说明
2008-07-28 22:28 1461基本映射 类-->数据库表 普通属性-->表字 ... -
hibernate多对多关联映射(单项关联)
2008-07-28 22:27 1990hibernate多对多关联映射(单项关联)user---&g ... -
hibernate一对多关联映射(双向关联)
2008-07-28 22:25 4838hibernate一对多关联映射(双向关联)Classes&l ... -
hibernate一对多关联映射(单向关联)
2008-07-28 22:23 2164hibernate一对多关联映射(单向关联)Classes-- ... -
hibernate一对一唯一外键关联映射(双向关联)
2008-07-28 22:21 3977hibernate一对一唯一外键关联映射(双向关联)Perso ... -
hibernate一对一唯一外键关联映射(单项关联)
2008-07-28 22:19 2773hibernate一对一唯一外键关联映射(单项关联)Perso ... -
hibernate一对一主键关联映射(双项关联)
2008-07-28 22:17 1720hibernate一对一主键关联映射(双项关联)Person& ... -
hibernate一对一主键关联映射(单项关联)
2008-07-28 22:16 2780hibernate一对一主键关联映射(单项关联)Person- ... -
hibernate多对一关联映射
2008-07-28 22:14 1364关联映射的本质:将关联关系映射到数据库,关联关系在对象模型域中 ... -
测试实体对象的生命周期
2008-07-28 22:12 1372测试实体对象的生命周期 junit简介: *编写测试类xx ... -
hibernate_simple
2008-07-28 22:09 1427第一个hibernate项目 1.新建一个java项目 2 ... -
hibernate存入mysql乱码
2008-07-22 06:45 2826mysql数据库GBK,数据库中的表GBK,hibernate ... -
解决HIbernate分页问题获取表总行数的小Bug
2008-04-14 15:28 5675bug源 return (PageSupport) get ... -
通过hibernate去调用存储过程
2008-03-25 20:53 13931之前一直误以为用了hibernate之后就不可以使用存储过程了 ...
相关推荐
【标题】"Hibernate泛型Dao"是针对Java开发中的数据持久化框架Hibernate的一个高级应用,主要目的是为了提高代码的复用性和简洁性。在传统的Hibernate使用中,针对每个实体类,我们都需要创建一个对应的Dao(Data ...
至于`Dao经典泛型.doc`文件,可能是更深入的关于Hibernate泛型DAO的文档,可能包含了如何配置Spring、如何处理复杂查询以及如何优化泛型DAO的更多细节。阅读这份文档将进一步提升你对泛型DAO的理解和应用能力。 ...
本篇将详细介绍"Hibernate泛型DAO接口,大部分通用都已包括"这一主题。 首先,让我们看看DAO的概念。DAO是软件设计模式中的一种,它的主要职责是封装对数据源的访问,以提供业务逻辑层与数据存储层之间的解耦。通过...
总结起来,"Spring Hibernate 泛型DAO"的主题涵盖了Spring框架的IoC容器与Hibernate的ORM能力,通过泛型和Criteria查询,我们可以实现更加高效、可复用的DAO层代码。这样的设计使得项目结构更加清晰,减少了代码冗余...
而`Hibernate泛型DAO`则是为了减少代码重复性,提高代码复用性和可维护性的一种设计模式。本文将深入探讨`Hibernate泛型DAO`的实现及其使用方法。 首先,DAO(Data Access Object)模式是一种设计模式,它的主要...
而泛型DAO(Data Access Object)则是基于Hibernate进一步抽象出来的一个设计模式,用于提供更通用的数据操作方法。本文档主要探讨了如何在Spring+Hibernate环境中创建和使用泛型DAO。 首先,我们来看一下泛型DAO...
《Hibernate泛型DAO及使用方法借鉴》 在Java开发中,特别是使用Spring+Hibernate框架时,泛型DAO(Data Access Object)是常见的设计模式,它提供了对数据库操作的一般化接口,以提高代码的重用性和可维护性。本文...
本文将深入探讨一种在SSH(Struts+Spring+Hibernate)框架中广泛应用的经典泛型DAO层实现方式,旨在展示其简洁性、高效性和灵活性。 #### 泛型DAO层:概念与优势 泛型DAO层通过利用Java的泛型机制,提供了一种类型...
本文将深入探讨如何实现一个简单的Hibernate泛型DAO(数据访问对象),以提高代码的可重用性和可维护性。 首先,我们来看`AbstractHibernateGenericDao`类,这是一个抽象类,它通常会包含一些基本的CRUD(创建、...
1. 耦合性低:泛型Dao接口可以与不同的持久层框架集成,例如 Hibernate、JPA 等。 2. 灵活性高:泛型Dao接口可以适应不同的业务需求,例如不同的数据库、不同的数据类型等。 3. 代码重用性高:泛型Dao接口可以在不同...
这尤其适用于那些基于ORM(对象关系映射)框架,如Hibernate或MyBatis的项目,它们提供了与数据库交互的基础设施,我们可以直接在泛型DAO上构建。 在实际应用中,我们可能还需要考虑一些额外的细节,如事务管理、...
6. **泛型Dao**:在Java开发中,泛型Dao(Generic Dao)是一种设计模式,用于减少重复的数据库操作代码。通过定义一个通用的Dao接口,可以实现对不同类型的实体对象进行CRUD操作,提高了代码的复用性和可维护性。...
总结来说,"Struts2+hibernate+spring整合泛型DAO"是一种常见的Java Web开发模式,它利用三大框架的优势,结合泛型设计,提高了代码复用,降低了维护成本,使得开发者能更专注于业务逻辑,而不是基础架构。
泛型DAO模式是基于Java泛型技术的一种设计模式,它在数据访问层提供了一种更为通用且灵活的方式来操作数据库。 传统的DAO模式通常需要为每一种数据实体类创建一个对应的DAO接口和实现类,这样会导致大量重复的代码...
接下来,我们可以使用Hibernate或MyBatis等持久层框架实现这个泛型DAO。以Hibernate为例,一个简单的实现可能如下: ```java public class HibernateGenericDAO, ID extends Serializable> implements GenericDAO, ...
这个压缩包文件的标题"SSH 泛型DAO分页"表明它提供了一个实现SSH框架整合的示例,特别关注了泛型DAO(Data Access Object)以及分页功能。下面将详细介绍SSH框架及其分页和泛型DAO的概念。 1. **Struts2**: Struts2...
BaseHibernateDAO是基于Hibernate框架的一个基类,它封装了常见的数据库操作,如增删查改(CRUD)。通过继承这个基类,开发者可以快速创建自定义的DAO实现,避免重复编写相似的代码。BaseHibernateDAO通常会包含以下...
在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库,而无需关心底层SQL语句的编写。然而,为了提高代码的复用性和可维护性,通常会设计一个通用DAO...