spring+hibernate+struts2 annotation实现分页(1)

这几天写了个ssh2分页实现,放到博客里留个记号,先贴代码有空再写说明了

@Entity(name="t_person")
public class Person implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;

@Column(length=50,name="p_name")
private String name;

@Column(name="p_sex",nullable=true)
private String sex;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}
}



package com.xangqun.base;

import java.io.Serializable;
import java.util.concurrent.locks.Condition;

import com.xangqun.page.OrderBy;
import com.xangqun.page.Pagination;


public interface BaseDao <T extends Serializable>{

/**
*
* @param eg 示例对象
* @param anyWhere 是否模糊查询,默认false。
* @param conds 排序和is null的字段。分别为OrderBy和String。
* @param pageNo 当前页号
* @param pageSize 每页记录数
* @param exclude 需要排除的属性
* @return
* @throws Exception
*/
public Pagination find(T eg, boolean anyWhere,
Condition[] conds, int pageNo, int pageSize, String... exclude) ;

public Pagination findAll(int pageNo, int pageSize, OrderBy... orders);
}


package com.xangqun.base;

import static org.hibernate.EntityMode.POJO;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Condition;

import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projection;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.hibernate.criterion.Example.PropertySelector;
import org.hibernate.metadata.ClassMetadata;
import org.hibernate.type.Type;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;

import com.xangqun.page.Nullable;
import com.xangqun.page.OrderBy;
import com.xangqun.page.Pagination;

@Transactional
public abstract class BaseDaoImpl<T extends Serializable> implements BaseDao<T> {

public static final NotBlankPropertySelector NOT_BLANK = new NotBlankPropertySelector();

private Class<T> persistentClass;

protected SessionFactory sessionFactory;


@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}

protected Session getSession() {
return sessionFactory.getCurrentSession();
}


@SuppressWarnings("unchecked")
public BaseDaoImpl() {
this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}

/**
*
* @param eg 示例对象
* @param anyWhere 是否模糊查询,默认false。
* @param conds 排序和is null的字段。分别为OrderBy和String。
* @param pageNo 当前页号
* @param pageSize 每页记录数
* @param exclude 需要排除的属性
* @return
*/
@Override
@Transactional(isolation=Isolation.DEFAULT,readOnly=true)
public Pagination find(T eg, boolean anyWhere, Condition[] conds,
int pageNo, int pageSize, String... exclude) {
Order[] orderArr=null;
Condition[] condArr=null;
if (conds != null && conds.length > 0) {
List<Order> orderList = new ArrayList<Order>();
List<Condition> condList = new ArrayList<Condition>();
for (Condition c : conds) {
if (c instanceof OrderBy) {
orderList.add(((OrderBy) c).getOrder());
} else {
condList.add(c);
}
}
orderArr = new Order[orderList.size()];
condArr = new Condition[condList.size()];
orderArr = orderList.toArray(orderArr);
condArr = condList.toArray(condArr);
}
Criteria crit = getCritByEg(eg, anyWhere, condArr, exclude);
return findByCriteria(crit, pageNo, pageSize, null, orderArr);
}

@SuppressWarnings("unchecked")
protected ClassMetadata getCmd(Class clazz) {
return (ClassMetadata) getSessionFactory().getClassMetadata(clazz);
}
@Transactional(isolation=Isolation.DEFAULT,readOnly=true)
protected Criteria getCritByEg(T eg, boolean anyWhere, Condition[] conds,
String[] exclude) {
System.out.println(getSession().isOpen());
Criteria crit = getSession().createCriteria(getPersistentClass());
Example example = Example.create(eg);
System.out.println(eg);
example.setPropertySelector(NOT_BLANK);
if (anyWhere) {
example.enableLike(MatchMode.ANYWHERE);
example.ignoreCase();
}
for (String p : exclude) {
example.excludeProperty(p);
}
crit.add(example);
// 处理排序和is null字段
if (conds != null) {
for (Condition o : conds) {
if (o instanceof OrderBy) {
OrderBy order = (OrderBy) o;
crit.addOrder(order.getOrder());
} else if (o instanceof Nullable) {
Nullable isNull = (Nullable) o;
if (isNull.isNull()) {
crit.add(Restrictions.isNull(isNull.getField()));
} else {
crit.add(Restrictions.isNotNull(isNull.getField()));
}
} else {
// never
}
}
}
// 处理many to one查询
ClassMetadata cm = getCmd(eg.getClass());
String[] fieldNames = cm.getPropertyNames();
for (String field : fieldNames) {
Object o = cm.getPropertyValue(eg, field, POJO);
if (o == null) {
continue;
}
ClassMetadata subCm = getCmd(o.getClass());
if (subCm == null) {
continue;
}
Serializable id = subCm.getIdentifier(o, POJO);
if (id != null) {
Serializable idName = subCm.getIdentifierPropertyName();
crit.add(Restrictions.eq(field + "." + idName, id));
} else {
crit.createCriteria(field).add(Example.create(o));
}
}
return crit;
}
@Transactional(isolation=Isolation.DEFAULT,readOnly=true)
protected Pagination findByCriteria(Criteria crit, int pageNo,
int pageSize, Projection projection, Order... orders) {
int totalCount = ((Number) crit.setProjection(Projections.rowCount())
.uniqueResult()).intValue();
Pagination p = new Pagination(pageNo, pageSize, totalCount);
if (totalCount < 1) {
p.setList(new ArrayList());
return p;
}
crit.setProjection(projection);
if (projection == null) {
crit.setResultTransformer(Criteria.ROOT_ENTITY);
}
if (orders != null) {
for (Order order : orders) {
crit.addOrder(order);
}
}
crit.setFirstResult(p.getFirstResult());
crit.setMaxResults(p.getPageSize());
p.setList(crit.list());
return p;
}

static final class NotBlankPropertySelector implements PropertySelector {
private static final long serialVersionUID = 1L;

public boolean include(Object object, String property, Type type) {
return object != null
&& !(object instanceof String && StringUtils
.isBlank((String) object));
}
}
public Pagination findAll(int pageNo, int pageSize, OrderBy... orders) {
Criteria crit = createCriteria();
return findByCriteria(crit, pageNo, pageSize, null, OrderBy
.asOrders(orders));
}
protected Criteria createCriteria(Criterion... criterions) {
Criteria criteria = getSession().createCriteria(getPersistentClass());
for (Criterion c : criterions) {
criteria.add(c);
}
return criteria;
}

public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setPersistentClass(Class<T> persistentClass) {
this.persistentClass = persistentClass;
}

public Class<T> getPersistentClass() {
return persistentClass;
}

}



package com.xangqun.page;

/**
* 可分页接口
* @author xangqun
*
*/
public interface Paginable {

public int getTotalCount();//总数

public int getTotalPage(); //总分页

public boolean isFirst(); //是否第一页

public boolean isLast(); //是否最后页

public int getPageSize(); //每页显示个数

public int getcurrentPage(); //取得当前页

public int getNextPage(); //取得下一页

public int getPrePage(); //取得前一页
}


package com.xangqun.page;

public class SimplePage implements Paginable {

public static final int DEFAULT_COUNT = 10;

protected int currentPage; //当前页号
protected int pageSize; //每页记录数
protected int totalCount; //总记录数
protected int totalPage;

public SimplePage(){};

public SimplePage(int currentPage, int pageSize, int totalCount) {
this.currentPage = currentPage<0?1:currentPage;
this.pageSize = pageSize<0?10:pageSize;
this.totalCount = totalCount<0?0:totalCount;
if ((this.currentPage - 1) * this.pageSize >= totalCount) {
this.currentPage = totalCount / pageSize;
}
}

/**
* 调整分页参数,使合理化
*/
public void adjustPage() {
if (totalCount <= 0) {
totalCount = 0;
}
if (pageSize <= 0) {
pageSize = DEFAULT_COUNT;
}
if (currentPage <= 0) {
currentPage = 1;
}
if ((currentPage - 1) * pageSize >= totalCount) {
currentPage = totalCount / pageSize;
}
}

@Override
public int getcurrentPage() {
return currentPage;
}

@Override
public int getPageSize() {
return pageSize;
}

@Override
public int getNextPage() {
return isLast()?currentPage:(currentPage+1);
}

@Override
public int getPrePage() {
return isFirst()?currentPage:(currentPage-1);
}

@Override
public int getTotalCount() {
return totalCount;
}

@Override
public int getTotalPage() {
return (totalCount%pageSize!=0||totalCount==0)?(totalCount/pageSize+1):totalCount/pageSize;
}

@Override
public boolean isFirst() {
return (currentPage<=1)?true:false;
}

@Override
public boolean isLast() {
return currentPage>=totalCount?true:false;
}

public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}

public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}

public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}

public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
}


package com.xangqun.page;

import java.io.Serializable;
import java.util.List;
/**
* 分页实现
* @author xangqun
*
*/
public class Pagination extends SimplePage implements Paginable,Serializable {

private static final long serialVersionUID = 1L;
public List<? extends Object> list;

public Pagination() {
}

public Pagination(int currentPage, int pageSize, int totalCount) {
super(currentPage, pageSize, totalCount);
}

public Pagination(int currentPage, int pageSize, int totalCount, List<? extends Object> list) {
super(currentPage, pageSize, totalCount);
this.list = list;
}

public int getFirstResult() {
return (currentPage - 1) * pageSize;
}

public List<? extends Object> getList() {
return list;
}

public void setList(List<? extends Object> list) {
this.list = list;
}

}


package com.xangqun.page;

import java.io.Serializable;

public class Condition implements Serializable {
private static final long serialVersionUID = 1L;
protected String field;

public String getField() {
return field;
}
}


package com.xangqun.page;

public class Nullable extends Condition {

private static final long serialVersionUID = 1L;
private boolean isNull;

public Nullable(String field, boolean isNull) {
this.field = field;
this.isNull = isNull;
}

public static Nullable isNull(String field) {
return new Nullable(field, true);
}

public static Nullable isNotNull(String field) {
return new Nullable(field, false);
}

public boolean isNull() {
return isNull;
}
}


package com.xangqun.page;

import org.hibernate.criterion.Order;

public class OrderBy extends Condition{

private static final long serialVersionUID = 1L;
public static enum OrderType {
ASC, DESC
}
private OrderType orderType;

public OrderBy(){}
public OrderBy(String field,OrderType orderType){
this.field=field;
this.orderType=orderType;
}

public static OrderBy asc(String field) {
return new OrderBy(field, OrderType.ASC);
}

public static OrderBy desc(String field) {
return new OrderBy(field, OrderType.DESC);
}

public Order getOrder(){
Order order = null;
if (OrderType.ASC == orderType) {
order = Order.asc(getField());
} else if (OrderType.DESC == orderType) {
order = Order.desc(getField());
}
return order;
}

public static Order[] asOrders(OrderBy[] orderBys) {
if (orderBys != null) {
Order[] orders = new Order[orderBys.length];
for (int i = 0; i < orderBys.length; i++) {
orders[i] = orderBys[i].getOrder();
}
return orders;
} else {
return null;
}

}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值