eclipse 生成 dao 的分析,以及百度知道的问题

来源:互联网 发布:豚鼠实验 知乎 编辑:程序博客网 时间:2024/06/15 13:46

package dao;

/**

 * 很简单引入你要用的包

 */

import java.util.List;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.hibernate.LockMode;

import org.hibernate.Query;

import org.hibernate.criterion.Example;

 

/**

 * 类UsertableDAO继承了BaseHibernateDAO

 */

public class UsertableDAO extends BaseHibernateDAO {

 

 private static final Log log = LogFactory.getLog(UsertableDAO.class);

 

 public static final String NAME = "name";

 

 public static final String AGE = "age";

/**

 * save()方法提供了向数据库中添加数据的功能,但只能添加,这个DAO没有生成Update()的方法

 * 但你可以简单的八save()方法改称具有Update功能:将getSession().save

 * (transientInstance);这句改成

 * getSession().merge(transientInstance);或者getSession().saveOrUpdate

 *   (transientInstance);

 */

 public void save(Usertable transientInstance) {

   log.debug("saving Usertable instance");

  try {

    getSession().save(transientInstance);

    log.debug("save successful");

   } catch (RuntimeException re) {

    log.error("save failed", re);

   throw re;

   }

 }

/**

 * delete()方法看名知意是用来删除的.

 */

 public void delete(Usertable persistentInstance) {

   log.debug("deleting Usertable instance");

  try {

    getSession().delete(persistentInstance);

    log.debug("delete successful");

   } catch (RuntimeException re) {

    log.error("delete failed", re);

   throw re;

   }

 }

/**

 * findById()方法实现了按ID查询数据.

 */

 public Usertable findById(java.lang.Integer id) {

   log.debug("getting Usertable instance with id: " + id);

  try {

    Usertable instance = (Usertable) getSession().get("dao.Usertable",

      id);

   return instance;

   } catch (RuntimeException re) {

    log.error("get failed", re);

   throw re;

   }

 }

/**

 * findByExample()方法实现的功能相当于"select * from Usertable"实现的功能就是查询所有 

 * 数据.

 */

 public List findByExample(Usertable instance) {

   log.debug("finding Usertable instance by example");

  try {

    List results = getSession().createCriteria("dao.Usertable").add(

      Example.create(instance)).list();

    log.debug("find by example successful, result size: "

     + results.size());

   return results;

   } catch (RuntimeException re) {

    log.error("find by example failed", re);

   throw re;

   }

 }

 

**

 * findByExample()方法实现的功能相当于"select * from Usertable"实现的功能就是查询所有 

 * 数据.

 */

 public List findByExample(Usertable instance) {

   log.debug("finding Usertable instance by example");

  try {

    List results = getSession().createCriteria("dao.Usertable").add(

      Example.create(instance)).list();

    log.debug("find by example successful, result size: "

     + results.size());

   return results;

   } catch (RuntimeException re) {

    log.error("find by example failed", re);

   throw re;

   }

 }

/**

 * findByProperty()方法用来灵活的提供一种按条件查询的方法,你可以自己定义要按什么样的方

 * 式查询.

 */

 public List findByProperty(String propertyName, Object value) {

   log.debug("finding Usertable instance with property: " + propertyName

    + ", value: " + value);

  try {

    String queryString = "from Usertable as model where model."

     + propertyName + "= ?";

    Query queryObject = getSession().createQuery(queryString);

    queryObject.setParameter(0, value);

   return queryObject.list();

   } catch (RuntimeException re) {

    log.error("find by property name failed", re);

   throw re;

   }

 }

/**

 * findByName()和findByAge()方法就是调用了findByProperty()方法的实现按名字和年龄查询

 * 的功能

 */

 public List findByName(Object name) {

  return findByProperty(NAME, name);

 }

 

 public List findByAge(Object age) {

  return findByProperty(AGE, age);

 }

}

/** 

 * 将传入的detached状态的对象的属性复制到持久化对象中,并返回该持久化对象 

 * 如果该session中没有关联的持久化对象,加载一个,如果传入对象未保存,保存一个副本并作

 

为持久对象返回,传入对象依然保持detached状态。 

 * @see com.CodeDepts 

 */ 

 public CodeDepts merge(CodeDepts detachedInstance) { 

 log.debug("merging CodeDepts instance"); 

 try { 

 CodeDepts result = (CodeDepts) getSession() 

 .merge(detachedInstance); 

 log.debug("merge successful"); 

 return result; 

 } catch (RuntimeException re) { 

 log.error("merge failed", re); 

 throw re; 

 } 

 } 

 

 /** 

 * 将传入的对象持久化并保存。 

 * 如果对象未保存(Transient状态),调用save方法保存。如果对象已保存(Detached状态),

 

调用update方法将对象与Session重新关联。 

 

 * @see com.CodeDepts 

 */ 

 

 public void attachDirty(CodeDepts instance) { 

 log.debug("attaching dirty CodeDepts instance"); 

 try { 

 getSession().saveOrUpdate(instance); 

 log.debug("attach successful"); 

 } catch (RuntimeException re) { 

 log.error("attach failed", re); 

 throw re; 

 } 

 } 

 

 

 

/** 

 * 将传入的对象状态设置为Transisent状态 

 * @see com.CodeDepts 

 */ 

 

public void attachClean(CodeDepts instance) { 

 log.debug("attaching clean CodeDepts instance"); 

 try { 

 getSession().lock(instance, LockMode.NONE); 

 log.debug("attach successful"); 

 } catch (RuntimeException re) { 

 log.error("attach failed", re); 

 throw re; 

 } 

 }

———————————————————————————————————————————

 

—————————————————————

百度知道的问题拿出来说说:

我有2个表生成了Dao:

 

其中一个接口:

public interface IBaseHibernateDAO {

 public Session getSession();

}

一个接口的实现:

public class BaseHibernateDAO implements IBaseHibernateDAO {

 public Session getSession() {

  return HibernateSessionFactory.getSession();

 }

}

还有2个实际操作数据库的类,继承BaseHibernateDAO:

public class NewsinforDAO extends BaseHibernateDAO {

具体实现不重要,略……

}

public class UserinforDAO extends BaseHibernateDAO {

具体实现不重要,略……

}

============

现在我写业务逻辑:

 

public class BaseServiceImpl implements BaseService {

 

}

这里面,怎么调用Hibernate自动生成的Dao?(不要和我说分别new NewsinforDAO和UserinforDAO

 

,每次用还要看new哪个类。要是1000个类不是要找到死?)

 

我要类似接口的解决方式(第一次用工具生成Dao,原来一直手写的。说起来Hibernate自动生成的

 

Dao还真不怎么样……) 

问题补充:

========================================================

谢谢dinggx,我原来就是这样用的。

 

因为一直看到别人说什么工具自动生成,我想看看是什么样子的。

 

不过你貌似偏题了……

 

我想问的是:自动生成的DAO怎么调用?用hibernate工具生成Dao开发的朋友们说说? 

===========================

 

1000个类,我只是打个比方,是说假如类很多的情况。

 

现在的问题归纳起来是父类调用子类的问题:

 

hibernate生成的Dao,如果只有一个类,那么生成一个Dao。

 

这个我可以在业务逻辑BaseServiceImpl里写构造方法,通过自动生成的接口IBaseHibernateDAO

 

调用BaseHibernateDAO,再从BaseHibernateDAO这个父类可以调用一个子类。在业务逻辑

 

BaseServiceImpl里我就能直接用自动生成的接口IBaseHibernateDAO调用Dao实现了。

 

但是现在我现在有2个类,生成了2个Dao文件,现在怎么用父类调用同时多个子类? 

 

================================

dinggx,生成的2个dao文件继承于同一个接口实现类BaseServiceImpl?

 

什么意思?java貌似不能多重继承,就算继承了有什么用啊?

 

感谢shiryu963,给我提供了点思路。

**********************************************************************************

 

**************************

 

最佳答案:

那就用泛型吧,生成的内容都是一样的。如果没有特殊的需求,一个实现类搞定所有的业务操作。

 

有特殊需求,再从这个泛型实现类中继承过来 

-----------

 

哎,工具生成的哪能跟手动写的比呢,它只能用来解决一些通用的操作,如果你真的有1000个类,

 

那就绝对是一个超大型的项目,怎么可能会让它自动生成呢?现在比较流行的做法是Spring配置文

 

件,加上HibernateSupportDao类,dao的初始化由spring容器来做。现在的工具还没有智能到零代

 

码编写程序的地步,话又说回来,如果真的什么都交给工具了,要我们程序员还做什么

 

所以,小的项目、要求不太严的项目用工具帮助快速开发,通过new的方式创建实例也是必须的。大

 

的项目,表格能超过100个的都是大型项目了,手工编码可以更好地解决问题,可以更好地把人的作

 

用体现出来。 

 

~~~~~~~~~~~~~~~~~~~~~

生成的2 个dao文件继承于同一个接口实现类BaseServiceImpl,同样可以使用原来的方式进行子类

 

的调用。但不管怎么用,你总是要给它子类的名称的,

 

如果能再加上泛型的使用就更完美了,采用反射机制进行POJO的调用,这样可以通过

 

BaseServiceImpl类来实现一些通用功能,子类只需完成特殊需求。 

~~~~~~~~~~~~~~~~~~~~~~`

V512工作室的hibernate视频中第5讲是讲如何定义一个泛型DAO,以及如何使用的。你可以下载下

 

来看一下。

http://www.verycd.com/topics/215898/