Spring + Hibernate开发

来源:互联网 发布:2016java程序员薪资 编辑:程序博客网 时间:2024/05/17 00:56

加入支持的顺序是先Spring,再加入Hibernate。

Spring中加入的支持包与Spring + JDBC开发时完全相同。


支持包还是只加入单独加入Hibernate时的支持包。



选择使用Spring配置文件来完成数据库连接的管理。


Spring准备好了Hibernate的SessionFactory类的<bean>配置。


Spring自动生成了一个id为dataSource的<bean>。


取消掉建立HibernateSessionFactory的功能,因为Spring已经建立好了这个类。

<?xmlversion="1.0"encoding="UTF-8"?>

<beansxmlns="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">

 

 

    <beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource">

       <propertyname="driverClassName"value="oracle.jdbc.OracleDriver">

       </property>

       <propertyname="url"value="jdbc:oracle:thin:@localhost:1521:ORCL">

       </property>

       <propertyname="username"value="sunxun"></property>

       <propertyname="password"value="123"></property>

    </bean>

    <beanid="sessionFactory"

       class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

       <propertyname="dataSource">

           <refbean="dataSource"/>

       </property>

       <propertyname="hibernateProperties">

           <props>

              <propkey="hibernate.dialect">

                  org.hibernate.dialect.Oracle9Dialect

              </prop>

              <propkey="hibernate.show_sql">

                  true

              </prop>

              <propkey="hibernate.format_sql">

                  true

              </prop>

           </props>

       </property>

    </bean>

</beans>

可以在里面配置show_sql等属性。

下面自动生成pojo映射,可以使用一对多等关系。

这里还是完成新闻和新闻类型的管理功能。



实现新闻的数据库操作,接口与之前没有区别:

public interface INewsDAO extends IDAO<Integer, News> {

 

}

Spring + JDBC时数据库操作使用的对象是JdbcTemplate,Spring +HIbernate开发时,同样不再使用Hibernate原有的对象进行数据库处理,改为使用HibernateTemplate来完成数据库操作。

建立实现类,继承一个HibernateDaoSupport类。

public class NewsDAOImpl extends HibernateDaoSupportimplements INewsDAO {

 

    public void doCreate(News vo) throws Exception {

       super.getHibernateTemplate().save(vo);

    }

 

    public void doRemove(Integer id) throws Exception {

       super.getHibernateTemplate().delete(findById(id));

    }

 

    public void doUpdate(News vo) throws Exception {

       super.getHibernateTemplate().update(vo);

    }

 

    public List<News> findAll()throws Exception {

       return super.getHibernateTemplate().loadAll(News.class);

    }

 

    public List<News> findAll(finalint pageNo,finalint pageSize,final String keyword,

           final String column)throws Exception {

       // Spring没有封装HQL版本的分页查询方法.

       // 1、使用Criteria来完成分页查询

       DetachedCriteria c = DetachedCriteria.forClass(News.class);

       // 加入模糊查询的条件

       c.add(Restrictions.like(column,"%" + keyword + "%"));

 

       List all = super.getHibernateTemplate().findByCriteria(c,

              (pageNo - 1) * pageSize, pageSize);

 

       // 2、使用Spring的扩展接口,通过匿名内部类的形式来扩展Spring原有的方法

       // List all = super.getHibernateTemplate().executeFind(

       // new HibernateCallback() {

       // public Object doInHibernate(Session session)

       // throws HibernateException, SQLException {

        // // 这里就是封装好的Hibernate中的操作。

       // // 内部类要使用外部类的属性,必须为属性加入final关键字

       // String hql = "FROM News AS n WHERE n." + column + " LIKE ?";

       // Query query = session.createQuery(hql);

       // query.setString(0, "%"+keyword+"%");

       // query.setFirstResult((pageNo - 1) * pageSize);

       // query.setMaxResults(pageSize);

       //                  

       // return query.list();

       // }

       // });

 

       returnall;

    }

 

    public News findById(Integer id)throws Exception {

       return super.getHibernateTemplate().get(News.class, id);

    }

 

    public int getAllCount(String keyword, String column) throws Exception {

       String hql = "SELECT COUNT(n) FROM News AS n WHERE n." + column

              + " LIKE ?";

       List all = super.getHibernateTemplate().find(hql,"%" + keyword + "%");

       return ((Long) all.get(0)).intValue();

    }

 

}

总结HibernateTemplate的操作方法:

1)  继承自Session的方法:save(),update(),delete(),get/load(),saveOrUpdate()

2)  扩展了Session的方法:loadAll(),deleteAll(Collection)(删除一组数据),saveOrUpdateAll(Collection)(添加或修改一组数据)

3)  HQL的操作方法:find(HQL,参数),返回List集合

4)  Criteria的操作方法:findByCriteria(Criteria,firstResult,MaxResults),可以实现分页处理功能

5)  扩展方法:executeFind或execute,可以自行建立一个匿名内部类的HibernateCallback,并覆写doInHibernate方法,自行扩展数据库操作方法,可以实现HQL形式的分页功能。

 

配置:

    <beanid="hibernateTemplate"class="org.springframework.orm.hibernate3.HibernateTemplate">

       <propertyname="sessionFactory">

           <refbean="sessionFactory"/>

       </property>

    </bean>

 

    <beanid="newsDAOImpl"class="org.liky.dao.impl.NewsDAOImpl">

       <propertyname="hibernateTemplate">

           <refbean="hibernateTemplate"/>

       </property>

    </bean>

下面实现Service操作,与之前基本没有区别。

因此这里可以参考前面Spring + JDBC的部分来完成。

但要注意,AOP部分有一点区别:

    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

       <property name="sessionFactory">

           <ref bean="sessionFactory"/>

       </property>

    </bean>

 

    <beanid="transactionInterceptor"

        class="org.springframework.transaction.interceptor.TransactionInterceptor">

       <propertyname="transactionManager">

           <refbean="transactionManager"/>

       </property>

       <!--

           设置事务处理的方式,可以选择以下几种之一:

           PROPAGATION_REQUIRED:如果之前有事务,则将当前操作合并到事务中,如果之前没有事务,则开始一个新的事务。

           PROPAGATION_REQUIRED_NEW:无论之前是否有事务,都开始一个新的事务。

           PROPAGATION_REQUIRED_NEVER:不使用事务处理,自动提交。

       -->

       <propertyname="transactionAttributes">

           <props>

              <propkey="*">PROPAGATION_REQUIRED</prop>

           </props>

       </property>

    </bean>

 

    <bean

        class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">

       <propertyname="beanNames">

           <list>

              <value>*ServiceImpl</value>

           </list>

       </property>

       <propertyname="interceptorNames">

           <list>

              <value>transactionInterceptor</value>

           </list>

       </property>

    </bean>

transactionManager改变为Hibernate形式的事务处理对象。















0 0