spring+hibernate

必须先加 Spring ,再加Hibernate

 

Spring + JDBC开发时,相同,加入5个支持类库

再加入Hibernate支持。

自动生成一个SessionFactorybean,该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,HibernateDaoSupporthibernateTemplate属性

 

编写服务类,而服务类不需要修改,只需要将dao实现类注入即可。

    <bean id="newsserviceimpl" class="cn.mldn.hibernate.service.impl.NewsServiceImpl">

        <property name="newsdao">

            <ref bean="newsdaoimpl"></ref>

        </property>

    </bean>

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值