必须先加 Spring ,再加Hibernate。
与Spring + JDBC开发时,相同,加入5个支持类库
再加入Hibernate支持。
自动生成一个SessionFactory的bean,该bean的功能相当于之前单独使用hibernate时的HibernateSessionfactory类。
不需要再手工建立HibernateSessionfactory
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="org.gjt.mm.mysql.Driver"> </property> <property name="url" value="jdbc:mysql://localhost:3306/test"></property> <property name="username" value="root"></property> <property name="password" value="mysqladmin"></property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> //sessionFactory注入datasource,这点与spring+jdbc不一样.........中间多了个hibernate自己的sessionFactory <ref bean="dataSource"></ref> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </prop> <prop key="hibernate.show_sql"> true </prop> <prop key="hibernate.format_sql"> true </prop> </props> </property> </bean> </beans> |
可以手工添加属性,注意属性必须以hiberate.开头
配置好后,可以生成映射。
与单独使用hibernate没有区别。
完成接口与实现类。
注意实现类必须继承HibernateDaoSupport
package cn.mldn.hibernate.dao.impl;
import java.io.Serializable; import java.sql.SQLException; import java.util.List;
import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import cn.mldn.hibernate.dao.NewsDAO; import cn.mldn.hibernate.pojo.News;
publicclass NewsDAOImpl extends HibernateDaoSupport implements NewsDAO {
publicboolean doCreate(News vo) throws Exception { this.getHibernateTemplate().save(vo); returntrue; }
publicboolean doRemove(Object id) throws Exception { // this.getHibernateTemplate().delete(this.findById(id)); String hql = "DELETE FROM News AS n WHERE n.id = ?"; if (this.getHibernateTemplate().bulkUpdate(hql, id) > 0) { 删除操作 returntrue; } returnfalse; }
publicboolean doUpdate(News vo) throws Exception { this.getHibernateTemplate().update(vo); returntrue; }
public List<News> findAll(String kw) throws Exception { String hql = "FROM News AS n WHERE n.keyword LIKE ?"; List all = this.getHibernateTemplate().find(hql, "%" + kw + "%"); return all; }
public List<News> findAll(finalint cp, finalint ls, final String kw) throws Exception { // 在hibernateTemplate中,缺少分页的查询方法,需要手工进行扩展 List all = this.getHibernateTemplate().executeFind( new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { String hql = "FROM News AS n WHERE n.keyword LIKE ?"; Query query = session.createQuery(hql); // 内部类调用外部类的属性,要求属性必须是final的,因此将传入的参数加入final关键 query.setString(0, "%" + kw + "%"); query.setFirstResult((cp - 1) * ls); query.setMaxResults(ls); return query.list(); } }); return all; }
public News findById(Object id) throws Exception { returnthis.getHibernateTemplate().get(News.class, (Serializable) id); }
publicint getCount(String kw) throws Exception { String hql = "SELECT count(n) FROM News AS n WHERE n.keyword LIKE ?"; List all = this.getHibernateTemplate().find(hql, "%" + kw + "%"); int count = ((Long) all.get(0)).intValue(); return count; }
}
|
使用到了hibernateTemplate,包含以下方法:
1) 继承自Session的方法:save(),update(),delete(),get(),load(),saveOrUpdate()
2) 对Session方法进行的扩展:saveOrUpdateAll(Collection all),deleteAll(Collection all),loadAll(Class clazz)
3) 对Query包装的方法:bulkUpdate()执行修改或删除的HQL语句,find()执行查询的HQL语句
4) 可扩展方法:executeFind() ,需要传入一个编写好的HibernsateCallback类,可以使用匿名内部类,用来完成分页功能。
将hibernateTemplate配置到spring配置文件中,要将sessionFactory注入进去
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">//此部与spring+jdbc不一样,jdbcTemplate直接注入数据源datasource,而hibernateTemplate注入的是自己的sessionFactory,而sessionFactory注入的是datasource,因为hibernate是对jdbc基础上再封装了一层到sessionFactory <property name="sessionFactory"> <ref bean="sessionFactory"></ref> </property> </bean>
<bean id="newsdaoimpl" class="cn.mldn.hibernate.dao.impl.NewsDAOImpl"> <property name="hibernateTemplate"> <ref bean="hibernateTemplate"></ref> </property> </bean> //说明下,NewsDAOImpl是没有hibernateTemplate属性的,但确依赖注入了,因为此类继承了HibernateDaoSupport,而HibernateDaoSupport有hibernateTemplate属性 |
编写服务类,而服务类不需要修改,只需要将dao实现类注入即可。
<bean id="newsserviceimpl" class="cn.mldn.hibernate.service.impl.NewsServiceImpl"> <property name="newsdao"> <ref bean="newsdaoimpl"></ref> </property> </bean> |