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/
- eclipse 生成 dao 的分析,以及百度知道的问题
- 做百度知道营销不可忽视的问题
- mybatis-generator生成相对应的po、dao以及mapper
- 看不懂代码怎么办的百度知道,以及uml的介绍
- EXTJS的百度知道
- 百度地图的两个问题以及解决方案
- 百度知道出现了比较严重的丢贴问题
- 网友问题回答_百度知道的搜索结果采集
- 怎么查看自己匿名在百度知道提问的问题?
- 关于学连锁经营管理专业的问题_百度知道
- HibernateSynchronizer的安装与使用 eclipse hibernate 生成dao的插件使用方法
- 解决关于eclipse无法自动生成r文件以及不能创建虚拟设备的问题
- 百度知道的喷饭回答
- 百度知道的喷饭回答
- 百度知道的推广方式
- 关于百度知道的知识
- 百度知道的php爬虫
- mybatis如何自动生成实体类,映射文件以及对应的dao层
- (Spring -ssh)避免循环依赖 (AOP)
- 开源绘图软件MyPaint 0.9
- 在VC++中读写INI文件
- 今天把自己的诺基亚5530XpressMusic软格了一下
- 802.1ad中的S-vlan C-Vlan
- eclipse 生成 dao 的分析,以及百度知道的问题
- sqlserver2008与myeclipse的连接
- ubuntu 安装 eclips cdt
- iPhone 开发相关
- 动态规划--01背包问题
- linux编程的108种奇淫巧计-7(Lock-free实验)
- Google 发布Apache自动优化模块
- 浅析Linux内存映射: mmap ( 一)
- 各种排序算法的优劣