HibernateTemplate详解

来源:互联网 发布:linux强制退出命令 编辑:程序博客网 时间:2024/05/22 00:16
HibernateTemplate提供非常多的常用方法来完成基本的操作,比如通常的增加、删除、修改、查询等操作,Spring 2.0更增加对命名SQL查询的支持,也增加对分页的支持。大部分情况下,使用Hibernate的常规用法,就可完成大多数DAO对象的CRUD操作。下面是HibernateTemplate的常用方法简介:q void delete(Object entity):删除指定持久化实例q deleteAll(Collection entities):删除集合内全部持久化类实例q find(String queryString):根据HQL查询字符串来返回实例集合q findByNamedQuery(String queryName):根据命名查询返回实例集合q get(Class entityClass, Serializable id):根据主键加载特定持久化类的实例q save(Object entity):保存新的实例q saveOrUpdate(Object entity):根据实例状态,选择保存或者更新q update(Object entity):更新实例的状态,要求entity是持久状态q setMaxResults(int maxResults):设置分页的大小下面是一个完整DAO类的源代码:public class PersonDAOHibernate implements PersonDAO{ //采用log4j来完成调试时的日志功能private static Log log = LogFactory.getLog(NewsDAOHibernate.class); //以私有的成员变量来保存SessionFactory。private SessionFactory sessionFactory;//以私有变量的方式保存HibernateTemplateprivate HibernateTemplate hibernateTemplate = null; //设值注入SessionFactory必需的setter方法 public void setSessionFactory(SessionFactory sessionFactory){ this.sessionFactory = sessionFactory; } //初始化本DAO所需的HibernateTemplatepublic HIbernateTemplate getHibernateTemplate(){ //首先,检查原来的hibernateTemplate实例是否还存在 if ( hibernateTemplate == null) { //如果不存在,新建一个HibernateTemplate实例 hibernateTemplate = new HibernateTemplate(sessionFactory); } return hibernateTemplate;} //返回全部的人的实例 public List getPersons() { //通过HibernateTemplate的find方法返回Person的全部实例 return getHibernateTemplate().find("from Person"); } /** * 根据主键返回特定实例 * @ return 特定主键对应的Person实例 * @ param 主键值 public News getNews(int personid) { return (Person)getHibernateTemplate().get(Person.class, new Integer(personid)); } /** * @ person 需要保存的Person实例 */ public void savePerson(Person person) { getHibernateTemplate().saveOrUpdate(person); } /** * @ param personid 需要删除Person实例的主键 * / public void removePerson(int personid) { //先加载特定实例 Object p = getHibernateTemplate().load(Person.class, new Integer(personid)); //删除特定实例 getHibernateTemplate().delete(p); }}使用HibernateTemplateHibernateTemplate 可将Hibernate 的持久层访问模板化,使用HibernateTemplate 非常简单。创建Hi bernateTemplate 实例后,注入一个SessionFactory 的引用,就可执行持久化操作。SessionFactoyr 对象可通过构造参数传入,或通过设值方式传入。例如://获取Spring 上下文ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");//通过上下文获得SessionFactorySessionFactory sessionFactory = (SessionFactory) ctx.getBean("sessionFactory") ,HibernateTemplate 提供如下三个构造函数:? HibernateTemplateO 。? HibernateTemplate(org.hibernate.SessionFactory sessionFactory)。? HibernateTemplate(org.hibernate.SessionFactory sessionFactory, boolean allowCreate) 。 第一个构造函数:构造一个默认的HibernateTemplate 实例,因此,使用HibernateTemplate实例之前,还必须使用方法setSessionFactory(SessionFactory sessionFactory)来为HibernateTemplate 传入SessionFactory 的引用。第二个构造函数:在构造时已经传入SessionFactory 引用。第三个构造函数:其boolean 型参数表明,如果当前线程己经存在一个非事务性的Session ,是否直接返回此非事务性的Session 。对于在Web 应用中,通常启动时自动加载ApplicationContext , SessionFactory 和DAD对象都处在Spring 上下文管理下。因此无须在代码中显式设置,可采用依赖注入解耦SessionFactory 和DAO. 其依赖关系可通过配置文件来设置 com.mysql.jdbc.Driver jdbc:mysql://wonder:3306/j2ee</ value> <!property> root pass <!--mappingResouces属性用来列出全部映射文件〉 lee/Person.hbm.xml org.hibernate.dialect.MySQLDialect update <!--采用依赖注入来传入SessionFactory的引用〉 在DAO 实现类中,可采用更简单的方式来取得HibemateTemplate的实例。代码如下:public class PersonDaoImpl implements PersonDao{ // 执行持久化操作的HibernateTemplate HibernateTemplate ht; private SessionFactory sessionFactory; //依赖注入Sess工onFactory 的必需的setter 方法 public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } //该方法用于完成HibernateTemplate的初始化 private void setHibernateTemplate() { if (ht ==null){ ht = new HibernateTemplate(sessionFactory); } } /** *加载Person 实例 * @param id 需要加载Person 实例的主键值 * @return 返回加载的Person 实例 */ public Person get(int id){ setHibernateTemplate(); return (Person)ht.get(Person.class , new Integer(id)); } /** *保存Person 实例 * @param person 需要保存的Person 实例 */ public void save(Person person){ setHibernateTemplate() ; ht.save(person) ; } /** *修改Person 实例 * @param person 需要修改的Person 实例 */ public void update(Person person){ setHibernateTemplate(); ht.update(person); } /** *删除Person 实例 * @param id 需要删除的Person id */ public void delete(int id){ setHibernateTemplate(); ht.delete(ht.get(Person.class , new Integer(id))); } /** *删除Person 实例 * @param perso口需要删除的Person 实例 */ public void delete(Person person){ setHibernateTemplate(); ht.delete(person) ; } /** *根据用户名查找Person * @param name 用户名 * @return 用户名对应的全部用户 */ public List findByPerson(String name){ setHibernateTemplate(); return h t. find("from Person p where p.name like ?" , name); } /** *返回全部的Person 实例 * @return 全部的Person 实例 */ public List findAllPerson(){ setHibernateTemplate(); return ht.find("from Person "); }}
原创粉丝点击