ExtJS实战(3)-spring

Spring与Hibernate整合实践
本文介绍如何通过Spring框架整合Hibernate,实现声明式事务管理和数据访问层的开发。具体包括定义数据访问接口及其Hibernate实现,展示如何进行增删改查等操作。
上一篇文章我们看到了hibernate的作用,但是我们并没有贴出具体的数据访问层的代码,这是因为我们既然要使用这么多框架,当然就希望它们能够“黏合”的很好,譬如,我们不想使用代码处理事务,也就是说想使用声明式事务。这当然就是Spring大显身手的地方了。我们来看一看数据访问层的代码,还是面向接口编程:

1.下面是一个接口,它告诉外界可以做哪些事情,譬如按条件分页查询房屋信息,增加,修改,删除房屋信息,得到符合条件的房屋总数等!

package org.leno.houseHire.dao;

import java.util.List;

import org.leno.houseHire.action.Condition;

import org.leno.houseHire.dao.House;

public interface IHouseDAO {

public List<House> findAllHouse(Condition cond,final int start ,final int limit);

public House findById(int id);

public void addHouse(House house);

public void editHouse(House house);

public int delHouse(List<String> ids);

public long getTotalNums(Condition cond);

public List<Area> getAllAreas();

public List<Street> getAllStreets(int aid);

public String getAreaNameById(int id);

public String getStreetNameById(int id);

public User getUserById(int id);

public Street getStreetById(int id);

}

2.下面是一个利用Hibernate访问数据库的DAO实现,我们看到,它还继承了HibernateDaoSupport这个类,这是SpringHibernate提供的一个帮助支持类,它不仅封装了Hiberntate的实现,还对Hibernate操作涉及的事务进行统一管理。

package org.leno.houseHire.dao;

import java.sql.SQLException;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

import org.hibernate.Criteria;

import org.hibernate.HibernateException;

import org.hibernate.Query;

import org.hibernate.Session;

import org.hibernate.criterion.Order;

import org.hibernate.criterion.Projections;

import org.hibernate.criterion.Restrictions;

import org.leno.houseHire.action.Condition;

import org.leno.houseHire.dao.House;

import org.springframework.orm.hibernate3.HibernateCallback;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public class HouseDAOImpl extends HibernateDaoSupport implements IHouseDAO {

public void addHouse(House house) {

getHibernateTemplate().save(house);

}

public void editHouse(House house) {

getHibernateTemplate().update(house);

}

@SuppressWarnings("unchecked")

public List<House> findAllHouse(Condition cond, final int start,

final int limit) {

final String title = cond.getTitle();

final int room = cond.getRoom();

final int ting = cond.getTing();

final int areaId = cond.getAreaId();

final int streetId = cond.getStreetId();

final double priceStart = cond.getPriceStart();

final double priceEnd = cond.getPriceEnd();

final String booktime = cond.getBooktime();

final String sort = cond.getSortCond();

// 更通用可以换成DetachedCriteria

return (List<House>) getHibernateTemplate().execute(

new HibernateCallback() {

public Object doInHibernate(Session session)

throws HibernateException, SQLException {

Criteria cr = session.createCriteria(House.class)

.setFirstResult(start).setMaxResults(limit);

if (title != null && !title.trim().equals("")) {

cr.add(Restrictions

.like("title", "%" + title + "%"));

}

if (room != 0) {

cr.add(Restrictions.eq("room", room));

}

if (ting != 0) {

cr.add(Restrictions.eq("ting", ting));

}

if (streetId == 0) {

if (areaId != 0) {

cr.createCriteria("street").createCriteria(

"area").add(

Restrictions.eq("aid", areaId));

}

}

if (streetId != 0) {

cr.createCriteria("street").add(

Restrictions.eq("sid", streetId));

}

if (priceEnd > 0) {

cr.add(Restrictions.between("hireprice",

priceStart, priceEnd));

}

if (booktime != null && !booktime.trim().equals("")) {

String sda = booktime + " " + "00:00:00";

String eda = booktime + " " + "23:59:59";

SimpleDateFormat sdf = new SimpleDateFormat(

"yyyy-MM-dd HH:mm:ss");

try {

Date start_date = sdf.parse(sda);

Date end_date = sdf.parse(eda);

cr.add(Restrictions.between("booktime",

start_date, end_date));

} catch (ParseException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

if (sort != null && sort.equals("desc")) {

cr.addOrder(Order.desc("booktime"));

}

List<House> list = cr.list();

return list;

}

});

}

/**

* Hibernate3中,对Criteria又增添了新功能,可以支持分组与统计功能,在Hibernate3中增加了Projections以及ProjectionList类,这两个类对分组与统计功能进行了封装

*/

public

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值