generic data access objects
普通数据访问对象,这个是hibernate官方网站上面的一个dao类的设计模式,基于jdk5.0范型支持,文章地址如下:
http://www.hibernate.org/328.html
我下面的代码与hibernate官网上提供的有点不同。
首先定义dao类的接口igenericdao,该接口定义了共同的crud操作:
java 代码
- /**
- * 定义通用的crud操作
- * @author rainlife
- */
- public interface igenericdao 〈t, id extends serializable〉
- {
- // 通过主键标识查找某个对象。
- public t findbyid(id id);
- // 通过主键标识查找某个对象,可以锁定表中对应的记录。
- t findbyid(id id, boolean lock);
- //得到所有的对象。
- list
findall(); - //通过给定的一个对象,查找与其匹配的对象。
- list
findbyexample(t exampleinstance); - //持久化对象。
- t makepersistent(t entity);
- //删除对象。
- void maketransient(t entity);
- }
下面是使用hibernate针对该接口的实现genericdaohibernate:
java 代码
- /**
- * 这是针对igenericdao接口的hibernate实现,完成通用的crud操作。
- * @author rainlife
- * @param
pojo类 - * @param
pojo类的主键标识符 - * @param
针对每一个pojo类的dao类实现 - */
- public abstract class genericdaohibernate 〈t,id extends serializable, daoimpl extends igenericdao〈t,id〉〉
- implements igenericdao〈t,id〉
- {
- private class
persistentclass; - protected session session;
- public genericdaohibernate()
- {
- this.persistentclass = (class
) ((parameterizedtype) getclass() - .getgenericsuperclass()).getactualtypearguments()[0];
- }
- @suppresswarnings("unchecked")
- public daoimpl setsession(session s)
- {
- this.session = s;
- return (daoimpl)this;
- }
- protected session getsession()
- {
- if (session == null)
- throw new illegalstateexception(
- "session has not been set on dao before usage");
- return session;
- }
- public class
getpersistentclass() - {
- return persistentclass;
- }
- @suppresswarnings("unchecked")
- public t findbyid(id id)
- {
- return (t) getsession().load(getpersistentclass(), id);
- }
- @suppresswarnings("unchecked")
- public t findbyid(id id, boolean lock)
- {
- t entity;
- if (lock)
- entity = (t) getsession().load(getpersistentclass(), id, lockmode.upgrade);
- else
- entity = findbyid(id);
- return entity;
- }
- @suppresswarnings("unchecked")
- public list
findall() - {
- return findbycriteria();
- }
- @suppresswarnings("unchecked")
- public list
findbyexample(t exampleinstance) - {
- criteria crit = getsession().createcriteria(getpersistentclass());
- example example = example.create(exampleinstance);
- crit.add(example);
- return crit.list();
- }
- @suppresswarnings("unchecked")
- public list
findbyexample(t exampleinstance, string[] excludeproperty) - {
- criteria crit = getsession().createcriteria(getpersistentclass());
- example example = example.create(exampleinstance);
- for (string exclude : excludeproperty)
- {
- example.excludeproperty(exclude);
- }
- crit.add(example);
- return crit.list();
- }
- @suppresswarnings("unchecked")
- public t makepersistent(t entity)
- {
- getsession().saveorupdate(entity);
- //getsession().save(entity);
- return entity;
- }
- public void maketransient(t entity)
- {
- getsession().delete(entity);
- }
- @suppresswarnings("unchecked")
- protected list
findbycriteria(criterion... criterion) - {
- criteria crit = getsession().createcriteria(getpersistentclass());
- for (criterion c : criterion)
- {
- crit.add(c);
- }
- return crit.list();
- }
- @suppresswarnings("unchecked")
- /**
- * 增加了排序的功能。
- */
- protected list
findbycriteria(order order,criterion... criterion) - {
- criteria crit = getsession().createcriteria(getpersistentclass());
- for (criterion c : criterion)
- {
- crit.add(c);
- }
- if(order!=null)
- crit.addorder(order);
- return crit.list();
- }
- @suppresswarnings("unchecked")
- protected list
findbycriteria( int firstresult,int rowcount,order order,criterion... criterion) - {
- criteria crit = getsession().createcriteria(getpersistentclass());
- for (criterion c : criterion)
- {
- crit.add(c);
- }
- if(order!=null)
- crit.addorder(order);
- crit.setfirstresult(firstresult);
- crit.setmaxresults(rowcount);
- return crit.list();
- }
- }
这样,我们自己所要使用的dao类,就可以直接从这个hibernate的dao类继承:
比如说我们定义一个iuserdao接口,该接口继承igenericdao:
java 代码
- public interface iuserdao extends igenericdao〈user,integer〉
- {
- public user find(string username,string password);
- public user find(string username);
- }
该接口从igenericdao继承,自然也就定义了igenericdao接口所定义的通用crud操作。
再来看一下针对iuserdao 的hibernate实现userdaohibernate:
java 代码
- public class userdaohibernate extends genericdaohibernate〈user,integer,iuserdao〉 implements iuserdao {
- public user find(string username, string password) {
- //此处省略具体代码
- }
- public user find(string username) {
- //此处省略具体代码
- }
- }
userdaohibernate继承genericdaohibernate并实现iuserdao接口,这样,我们的userdaohibernate既拥有通用的crud操作,也实现了针对用户的特定的业务操作。
说明 :由于范型的符号经过在线编辑器发布后,被过滤掉了,所以上面修改后的几个符号,都是我在中文状态下输入的。
闽公网安备 35060202000074号