基于hibernate的泛型Dao框架

来源:互联网 发布:nginx 配置路径 编辑:程序博客网 时间:2024/05/23 14:28
这个东西是一年前弄的,不过一直没用到,里面有些东西已经记不太清了,还好注释应该可以看懂。 
目的是希望设计一个基于hibernate的泛型Dao框架 
推荐一个J2EE的群:46176507 

首先创建一个java项目GenericDao 

我们创建一个包com.hb.generic.dao 
该包用来作为我们的基础dao包 
首先我们创建一个针对单个实体操作的泛型EntityDao<T>接口。 

Java代码  收藏代码
  1. /** 
  2.  * @author llying 
  3.  * @company qm 
  4.  */  
  5. public interface EntityDao<T> {  
  6.       
  7.     T get(Serializable id);  
  8.       
  9.     List<T> getAll();  
  10.       
  11.     void save(T newInstance);  
  12.       
  13.     void remove(T transientObject);  
  14.       
  15.     void removeById(Serializable id);  
  16.       
  17.     String getIdName(Class clazz);  
  18. }  

用于定义针对单个实体的CRUD操作。 
接着我们在定义一个接口类HibernateCallback,定义一个回调接口。 
Java代码  收藏代码
  1. import org.hibernate.Session;  
  2. /** 
  3.  * @author llying 
  4.  * @company qm 
  5.  */  
  6. public interface HibernateCallback {  
  7.     Object doInHibernate(Session session);  
  8. }  

接下来我们定义一个com.hb.generic.dao.utils包, 
该包的目的是用于防治一些常用方法的抽取,该包中的一些类是我平时的收集和积累。 
我们这里只对关键类进行说明 
BeanUtils :工具类,通过反射机制对对象进行存取值 
GenericUtils:工具类,取得类中的泛型类型 
里面基本上都有都有注释 
我们在com.hb.generic.dao.support包下创建一个分页类(不做具体介绍,基本上分页都差不多) 
我们需要在com.hb.generic.dao包下创建HibernateDaoHandler接口 
Java代码  收藏代码
  1. import org.hibernate.Session;  
  2. /** 
  3.  * @author llying 
  4.  * @company qm 
  5.  */  
  6. public interface HibernateDaoHandler {  
  7.     Session getSession();  
  8. }  

在用户使用的时候需要实现该接口获取session 
接下来我们会创建HibernateDaoSupport类 
Dao的基类: 提供分页函数和若干便捷查询方法,并对返回值作了泛型类型转换. 
Java代码  收藏代码
  1. package com.hb.generic.dao;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6. import java.util.regex.Matcher;  
  7. import java.util.regex.Pattern;  
  8.   
  9. import org.apache.commons.logging.Log;  
  10. import org.apache.commons.logging.LogFactory;  
  11. import org.hibernate.Criteria;  
  12. import org.hibernate.Query;  
  13. import org.hibernate.Session;  
  14. import org.hibernate.Transaction;  
  15. import org.hibernate.criterion.CriteriaSpecification;  
  16. import org.hibernate.criterion.Criterion;  
  17. import org.hibernate.criterion.Order;  
  18. import org.hibernate.criterion.Projection;  
  19. import org.hibernate.criterion.Projections;  
  20. import org.hibernate.criterion.Restrictions;  
  21. import org.hibernate.impl.CriteriaImpl;  
  22. import org.hibernate.impl.CriteriaImpl.OrderEntry;  
  23.   
  24. import com.hb.generic.dao.support.Page;  
  25. import com.hb.generic.dao.utils.Assert;  
  26. import com.hb.generic.dao.utils.BeanUtils;  
  27.   
  28. /** 
  29.  * Dao的基类. 
  30.  *  
  31.  * 提供分页函数和若干便捷查询方法,并对返回值作了泛型类型转换. 
  32.  * @author llying 
  33.  * @company qm 
  34.  */  
  35. public abstract class HibernateDaoSupport<T> implements HibernateDaoHandler {  
  36.   
  37.     private static final Log log = LogFactory.getLog(HibernateDaoSupport.class);  
  38.     public Object execute(HibernateCallback action){  
  39.         Assert.notNull(action, "Callback object 对象不能为 Null ");  
  40.         Session session = getSession();  
  41.         Transaction tr = session.beginTransaction();  
  42.         Object result = action.doInHibernate(session);  
  43.         tr.commit();  
  44.         session.close();  
  45.         return result;  
  46.     }  
  47.       
  48.     /** 
  49.      * 获取全部的对象 
  50.      * @param <T> 
  51.      * @param entityClass 对象类型 
  52.      * @return  
  53.      */  
  54.     @SuppressWarnings("unchecked")  
  55.     public <T>List<T> getAll(final Class<T> entityClass) {  
  56.         return (List<T>)execute(new HibernateCallback(){  
  57.             public Object doInHibernate(Session session) {  
  58.                 Criteria criteria = session.createCriteria(entityClass);  
  59.                 return criteria.list();  
  60.             }  
  61.         });  
  62.     }  
  63.       
  64.     /** 
  65.      * 获取全部对象,带排序功能 
  66.      * @param <T> 
  67.      * @param entityClass 实体对象 
  68.      * @param orderBy 排序字段 
  69.      * @param isAsc 升序或降序 
  70.      * @return 
  71.      */  
  72.     @SuppressWarnings({ "hiding""hiding""unchecked" })  
  73.     public <T> List <T> getAll(final Class<T> entityClass,final String orderBy,final boolean isAsc){  
  74.         Assert.hasText(orderBy);  
  75.         return (List<T>) execute(new HibernateCallback(){  
  76.   
  77.             public Object doInHibernate(Session session) {  
  78.                   
  79.                 if (isAsc)  
  80.                     return session.createCriteria(entityClass).addOrder(Order.asc(orderBy)).list();  
  81.                 return session.createCriteria(entityClass).addOrder(Order.desc(orderBy)).list();  
  82.             }  
  83.               
  84.         });  
  85.   
  86.     }  
  87.     /** 
  88.      * 保存对象 
  89.      * @param newInstance 
  90.      */  
  91.     @SuppressWarnings("unused")  
  92.     public void saveOrUpdate(final T newInstance){  
  93.         execute(new HibernateCallback(){  
  94.             public Object doInHibernate(Session session) {  
  95.                 session.saveOrUpdate(newInstance);  
  96.                 return null;  
  97.             }  
  98.         });  
  99.     }  
  100.     /** 
  101.      * 删除对象 
  102.      * @param transientObject 
  103.      */  
  104.     public void remove(final T transientObject) {  
  105.         execute(new HibernateCallback(){  
  106.             public Object doInHibernate(Session session) {  
  107.                 session.delete(transientObject);  
  108.                 return null;  
  109.             }  
  110.               
  111.         });  
  112.     }  
  113.       
  114.   
  115.       
  116.     /** 
  117.      *  
  118.      * @param entityClass 
  119.      * @param id 
  120.      */  
  121.     public void removeById(Class<T> entityClass, Serializable id) {  
  122.         remove( get(entityClass, id));  
  123.     }  
  124.       
  125.     /** 
  126.      * 根据Id获取对象。 
  127.      * @param <T> 
  128.      * @param entityClass 
  129.      * @param id 实体Id 
  130.      * @return 实体对象 
  131.      */  
  132.     @SuppressWarnings({ "hiding""unchecked" })  
  133.     public <T> T get(final Class<T> entityClass,final Serializable id) {  
  134.         return (T) execute(new HibernateCallback(){  
  135.             public Object doInHibernate(Session session) {  
  136.                 return session.get(entityClass, id);  
  137.             }  
  138.         });  
  139.     }  
  140.       
  141.     /** 
  142.      * 创建一个Query对象。 
  143.      * @param hql 
  144.      * @param values 
  145.      * @return 
  146.      */  
  147.     public Query createQuery(String hql,Object...values){  
  148.         Assert.hasText(hql);  
  149.         Query query = getSession().createQuery(hql);  
  150.         for(int i = 0;i<values.length;i++){  
  151.             query.setParameter(i, values[i]);  
  152.         }  
  153.         return query;  
  154.     }  
  155.       
  156.     /** 
  157.      * 创建Criteria对象。 
  158.      * @param <T> 
  159.      * @param entityClass 
  160.      * @param criterions 
  161.      * @return 
  162.      */  
  163.     public <T>Criteria createCriteria(Class<T> entityClass,Criterion...criterions){  
  164.         Criteria criteria = getSession().createCriteria(entityClass);  
  165.         for(Criterion c:criterions){  
  166.             criteria.add(c);  
  167.         }  
  168.         return criteria;  
  169.     }  
  170.     /** 
  171.      * 创建Criteria对象,有排序功能。 
  172.      * @param <T> 
  173.      * @param entityClass 
  174.      * @param orderBy 
  175.      * @param isAsc 
  176.      * @param criterions 
  177.      * @return 
  178.      */  
  179.     public <T>Criteria createCriteria(Class<T> entityClass,String orderBy,boolean isAsc,Criterion...criterions){  
  180.         Assert.hasText(orderBy);  
  181.         Criteria criteria = createCriteria(entityClass,criterions);  
  182.         if(isAsc){  
  183.             criteria.addOrder(Order.asc(orderBy));  
  184.         }else{  
  185.             criteria.addOrder(Order.desc(orderBy));  
  186.         }  
  187.         return criteria;  
  188.     }  
  189.       
  190.     /** 
  191.      * 根据hql查询 
  192.      * @param hql 
  193.      * @param values 
  194.      * @return 
  195.      */  
  196.     public List find(final String hql,final Object...values){  
  197.         Assert.hasText(hql);  
  198.           
  199.         return createQuery(hql, values).list();  
  200.           
  201. /*      return (List) execute(new HibernateCallback(){ 
  202.  
  203.             public Object doInHibernate(Session session) { 
  204.                 Query query = session.createQuery(hql); 
  205.                 for(int i = 0;i<values.length;i++){ 
  206.                     query.setParameter(i, values[i]); 
  207.                 } 
  208.                 return query.list(); 
  209.             } 
  210.              
  211.         });*/  
  212.     }  
  213.       
  214.     /** 
  215.      * 根据属性名和属性值查询. 
  216.      * 
  217.      * @return 
  218.      */  
  219.     public <T>List<T> findBy(Class<T> entityClass,String propertyName,Object value){  
  220.         Assert.hasText(propertyName);  
  221.         return createCriteria(entityClass, Restrictions.eq(propertyName, value)).list();  
  222.     }  
  223.       
  224.     /** 
  225.      * 根据属性名和属性值查询. 有排序 
  226.      * @param <T> 
  227.      * @param entityClass 
  228.      * @param propertyName 
  229.      * @param value 
  230.      * @param orderBy 
  231.      * @param isAsc 
  232.      * @return 
  233.      */  
  234.     public <T>List<T> findBy(Class<T> entityClass,String propertyName,Object value,String orderBy,boolean isAsc){  
  235.         Assert.hasText(propertyName);  
  236.         Assert.hasText(orderBy);  
  237.         return createCriteria(entityClass, orderBy, isAsc, Restrictions.eq(propertyName, value)).list();  
  238.     }  
  239.       
  240.     /** 
  241.      * 根据属性名和属性值 查询 且要求对象唯一. 
  242.      * 
  243.      * @return 符合条件的唯一对象. 
  244.      */  
  245.     public <T>T findUniqueBy(Class<T> entityClass,String propertyName,Object value){  
  246.         Assert.hasText(propertyName);  
  247.         return (T)createCriteria(entityClass, Restrictions.eq(propertyName, value)).uniqueResult();  
  248.     }  
  249.     /** 
  250.      * 分页 通过hql进行 
  251.      * @param hql 
  252.      * @param pageNo 
  253.      * @param pageSize 
  254.      * @param values 
  255.      * @return 
  256.      */  
  257.     public Page pagedQuery(String hql,int pageNo,int pageSize,Object...values){  
  258.         Assert.hasText(hql);  
  259.         Assert.isTrue(pageNo>=1);  
  260.         String countQueryString = "select count(*)" + removeSelect(removeOrders(hql));  
  261.         System.out.println(countQueryString);  
  262.         List countList = find(countQueryString, values);  
  263.         long totalCount =  (Long) countList.get(0);  
  264.         System.out.println(totalCount);  
  265.         if(totalCount<1){  
  266.             return new Page();  
  267.         }  
  268.         int startIndex = Page.getStartOfPage(pageNo, pageSize);  
  269.         Query query = createQuery(hql,values);  
  270.         List list = query.setFirstResult(startIndex).setMaxResults(pageSize).list();  
  271.         return new Page(startIndex,totalCount,pageSize,list);  
  272.     }  
  273.     /** 
  274.      * 分页 通过criteria 
  275.      * @param criteria 
  276.      * @param pageNo 
  277.      * @param pageSize 
  278.      * @return 
  279.      */  
  280.     public Page pagedQuery(Criteria criteria,int pageNo,int pageSize){  
  281.         Assert.notNull(criteria);  
  282.         Assert.isTrue(pageNo>=1);  
  283.         CriteriaImpl criteriaImpl = (CriteriaImpl) criteria;  
  284.           
  285.         //先把Projection和OrderBy条件取出来,清空两者来执行Count操作  
  286.         Projection projection = criteriaImpl.getProjection();  
  287.         List<CriteriaImpl.OrderEntry> orderEntitys = null;  
  288.         try {  
  289.             orderEntitys=(List<OrderEntry>) BeanUtils.forceGetProperty(criteriaImpl, "orderEntries");  
  290.             BeanUtils.forceSetProperty(criteriaImpl, "orderEntries"new ArrayList());  
  291.         } catch (NoSuchFieldException e) {  
  292.             e.printStackTrace();  
  293.         }  
  294.         //取得总的数据数  
  295.         long totalCount = (Long) criteria.setProjection(Projections.rowCount()).uniqueResult();  
  296.         //将之前的Projection和OrderBy条件重新设回去  
  297.         criteria.setProjection(projection);  
  298.         if (projection == null) {  
  299.             criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);  
  300.         }  
  301.           
  302.         try {  
  303.             BeanUtils.forceSetProperty(criteriaImpl, "orderEntries", orderEntitys);  
  304.         } catch (NoSuchFieldException e) {  
  305.             e.printStackTrace();  
  306.         }  
  307.         if(totalCount<1)  
  308.             return new Page();  
  309.         int startIndex = Page.getStartOfPage(pageNo, pageSize);  
  310.         List data = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();  
  311.         return new Page( startIndex, totalCount, pageSize, data);  
  312.     }  
  313.       
  314.     /** 
  315.      * 分页查询函数 
  316.      * @param entityClass 
  317.      * @param pageNo 
  318.      * @param pageSize 
  319.      * @param criterions 
  320.      * @return 
  321.      */  
  322.     public Page pagedQuery(Class<T> entityClass,int pageNo,int pageSize,Criterion...criterions){  
  323.         Criteria criteria = createCriteria(entityClass, criterions);  
  324.         return pagedQuery(criteria, pageNo, pageSize);  
  325.     }  
  326.       
  327.     /** 
  328.      * 分页查询带排序 
  329.      * @param entityClass 
  330.      * @param pageNo 
  331.      * @param pageSize 
  332.      * @param orderBy 
  333.      * @param isAsc 
  334.      * @param criterions 
  335.      * @return 
  336.      */  
  337.     public Page pagedQuery(Class<T> entityClass,int pageNo,int pageSize,String orderBy,boolean isAsc,Criterion...criterions){  
  338.         Criteria criteria = createCriteria(entityClass, orderBy, isAsc, criterions);  
  339.         return pagedQuery(criteria, pageNo, pageSize);  
  340.     }  
  341.       
  342.     /** 
  343.      * 去除hql的select子句。 
  344.      * @param hql 
  345.      * @return 
  346.      * @see #pagedQuery(String,int,int,Object[]) 
  347.      */  
  348.     private static String removeSelect(String hql){  
  349.         Assert.hasText(hql);  
  350.         int beginPos = hql.toLowerCase().indexOf("from");  
  351.         Assert.isTrue(beginPos!=-1,hql);  
  352.         return hql.substring(beginPos);  
  353.     }  
  354.       
  355.     /** 
  356.      * 去除hql的orderBy子句。 
  357.      * @param hql 
  358.      * @return 
  359.      * @see #pagedQuery(String,int,int,Object[]) 
  360.      */  
  361.     private static String removeOrders(String hql) {  
  362.         Assert.hasText(hql);  
  363.         Pattern p = Pattern.compile("order\\s*by[\\w|\\W|\\s|\\S]*", Pattern.CASE_INSENSITIVE);  
  364.         Matcher m = p.matcher(hql);  
  365.         StringBuffer sb = new StringBuffer();  
  366.         while (m.find()) {  
  367.             m.appendReplacement(sb, "");  
  368.         }  
  369.         m.appendTail(sb);  
  370.         return sb.toString();  
  371.     }  
  372.   
  373. }  

HibernateGenericDao:最终面向用户使用的类。 
Java代码  收藏代码
  1. /** 
  2.  *  
  3.  * @author llying 
  4.  * @company qm 
  5.  */  
  6. @SuppressWarnings("unchecked")  
  7. public abstract class HibernateGenericDao<T> extends HibernateDaoSupport<T> implements EntityDao<T>{  
  8.     protected Class<T> entityClass;  
  9.       
  10.     public HibernateGenericDao(){  
  11.         /** 
  12.          * this.getClass()的目的是返回当前对象运行时的类 
  13.          * 通过工具类GenericUtils返回泛型T的实际类对象 
  14.          */  
  15.           
  16.         entityClass = GenericUtils.getSuperClassGenericType(getClass());  
  17.     }  
  18.       
  19.     public T get(Serializable id) {  
  20.         return get(entityClass,id);  
  21.     }  
  22.   
  23.     public List<T> getAll() {  
  24.         return getAll(entityClass);  
  25.     }  
  26.   
  27.     public String getIdName(Class clazz) {  
  28.         return null;  
  29.     }  
  30.   
  31.     public void removeById(Serializable id) {  
  32.         removeById(entityClass,id);  
  33.     }  
  34.   
  35.     public void save(T newInstance) {  
  36.         saveOrUpdate(newInstance);  
  37.     }  
  38.     /** 
  39.      * 查询全部,带排序 
  40.      * @param orderBy 
  41.      * @param isAsc 
  42.      * @return 
  43.      */  
  44.     public List<T> getAllByOrder(String orderBy,boolean isAsc){  
  45.         return getAll(entityClass,orderBy,isAsc);  
  46.     }  
  47.       
  48.     /** 
  49.      * 根据属性名和属性值查询对象 
  50.      * @param propertyName 
  51.      * @param value 
  52.      * @return 
  53.      */  
  54.     public List<T> findBy(String propertyName,Object value){  
  55.         return findBy(entityClass, propertyName, value);  
  56.     }  
  57.       
  58.     /** 
  59.      * 根据属性名和属性值进行查询对象,带排序 
  60.      * @param propertyName 
  61.      * @param value 
  62.      * @param isAsc 
  63.      * @param orderBy 
  64.      * @return 
  65.      */  
  66.     public List<T> findBy(String propertyName,Object value,boolean isAsc,String orderBy){  
  67.         return findBy(entityClass, propertyName, value, orderBy, isAsc);  
  68.     }  
  69.       
  70.     /** 
  71.      * 根据属性名和属性值进行查询对象,返回符合条件的唯一对象。 
  72.      * 如果对象不唯一将抛出异常 
  73.      * @param <T> 
  74.      * @param propertyName 
  75.      * @param value 
  76.      * @return 
  77.      */  
  78.     public <T> T findUniqueBy(String propertyName,Object value){  
  79.         return (T) findUniqueBy(entityClass, propertyName, value);  
  80.     }  
  81. }  

现在我们的dao泛型框架已经完成,我们进行测试一下 
我现在数据库中创建表Person 
Sql代码  收藏代码
  1. CREATE TABLE `person` (  
  2.   `p_id` int(11) NOT NULL auto_increment,  
  3.   `p_name` varchar(255) NOT NULL,  
  4.   `p_age` int(11) NOT NULL,  
  5.   PRIMARY KEY  (`p_id`)  
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;  

我们创建person.test包 
我们创建实体bean 
Java代码  收藏代码
  1. package person.test;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class Person implements Serializable{  
  6.     private Integer id;  
  7.     private String name;  
  8.     private Integer age;  
  9.     public Integer getId() {  
  10.         return id;  
  11.     }  
  12.     public void setId(Integer id) {  
  13.         this.id = id;  
  14.     }  
  15.     public String getName() {  
  16.         return name;  
  17.     }  
  18.     public void setName(String name) {  
  19.         this.name = name;  
  20.     }  
  21.     public Integer getAge() {  
  22.         return age;  
  23.     }  
  24.     public void setAge(Integer age) {  
  25.         this.age = age;  
  26.     }  
  27. }  

我们设置Person.hbm.xml映射文件 
Java代码  收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  4. <hibernate-mapping>  
  5.     <class name="person.test.Person" table="person">  
  6.         <id name="id" type="java.lang.Integer">  
  7.             <column name="p_id"></column>  
  8.             <generator class="native"></generator>  
  9.         </id>  
  10.         <property name="name" type="java.lang.String">  
  11.             <column name="p_name" length="255" not-null="true"></column>  
  12.         </property>  
  13.         <property name="age" type="java.lang.Integer">  
  14.             <column name="p_age" not-null="true"></column>  
  15.         </property>  
  16.     </class>  
  17. </hibernate-mapping>  

接下来我们配置hibernate.cfg.xml 
Java代码  收藏代码
  1. <?xml version='1.0' encoding='UTF-8'?>  
  2. <!DOCTYPE hibernate-configuration PUBLIC  
  3.           "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
  4.           "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  5.   
  6. <hibernate-configuration>  
  7.   
  8.     <session-factory>  
  9.         <property name="connection.username">root</property>  
  10.         <property name="connection.url">  
  11.             jdbc:mysql://localhost:3306/genericdao  
  12.         </property>  
  13.         <property name="dialect">  
  14.             org.hibernate.dialect.MySQLDialect  
  15.         </property>  
  16.         <property name="myeclipse.connection.profile">mysql</property>  
  17.         <property name="connection.driver_class">  
  18.             com.mysql.jdbc.Driver  
  19.         </property>  
  20.         <mapping resource="person/test/Person.hbm.xml" />  
  21.     </session-factory>  
  22.   
  23. </hibernate-configuration>  

接下来我们创建SessionFactory 
这个会话工厂是由工具生成的这里不做详细介绍。 
接下来我们创造PersonManager所有的Person操作都由他完成,神奇吧只需继承我们之前的HibernateGenericDao并实现getSession就可以。 
Java代码  收藏代码
  1. package person.test;  
  2.   
  3. import org.hibernate.Session;  
  4.   
  5. import com.hb.generic.dao.HibernateGenericDao;  
  6.   
  7. public class PersonManager extends HibernateGenericDao<Person> {  
  8.   
  9.     @Override  
  10.     public Session getSession() {  
  11.         // TODO Auto-generated method stub  
  12.         return HibernateSessionFactory.getSession();  
  13.     }  
  14.   
  15. }  


下面我们写一个main方法进行测试。 
Java代码  收藏代码
  1. /** 
  2.      * 1.测试save方法 
  3.      */  
  4.     public void testSave(){  
  5.         for(int i=1;i<100;i++){  
  6.             Person p = new Person();  
  7.             p.setName("pname"+i);  
  8.             p.setAge(i);  
  9.             pm.save(p);  
  10.         }  
  11.     }  
  12.     /** 
  13.      * 2.测试getAll方法 
  14.      */  
  15.     public void testGetAll(){  
  16.         List<Person> list = pm.getAll();  
  17.         System.out.println(list.size());  
  18.         for(Person p: list){  
  19.             System.out.println("------------------------");  
  20.             System.out.println("id :" + p.getId());  
  21.             System.out.println("name :" + p.getName());  
  22.             System.out.println("age :" + p.getAge());  
  23.         }  
  24.     }  
  25.     /** 
  26.      * 3.测试get方法 
  27.      */  
  28.     public void testGet(){        
  29.         Person p = pm.get(new Integer(20));  
  30.         System.out.println("id :" + p.getId());  
  31.         System.out.println("name :" + p.getName());  
  32.         System.out.println("age :" + p.getAge());  
  33.     }  
  34.     /** 
  35.      * 4.测试排序方法 getAllByOrder 
  36.      */  
  37.     public void testGetAllByOrder(){  
  38.         List<Person> list = pm.getAllByOrder("age"true);  
  39.         System.out.println("-- Asc --");  
  40.         for(Person p: list){  
  41.             System.out.println(p.getId());  
  42.             System.out.println(p.getName());  
  43.             System.out.println(p.getAge());  
  44.         }  
  45.         System.out.println("-- Desc --");  
  46.         list = pm.getAllByOrder("age"false);  
  47.         for(Person p: list){  
  48.             System.out.println(p.getId());  
  49.             System.out.println(p.getName());  
  50.             System.out.println(p.getAge());  
  51.         }  
  52.     }  
  53.     /** 
  54.      * 5.测试find方法 即hql查询 
  55.      */  
  56.     public void testFind(){  
  57.         List<Person>list = pm.find("from Person p where p.age = ?"50);  
  58.         for(Person p: list){  
  59.             System.out.println(p.getId());  
  60.             System.out.println(p.getName());  
  61.             System.out.println(p.getAge());  
  62.         }  
  63.         list = pm.find("from Person p where p.age > ? and p.age < ?",30,50);  
  64.         for(Person p: list){  
  65.             System.out.println(p.getId());  
  66.             System.out.println(p.getName());  
  67.             System.out.println(p.getAge());  
  68.         }  
  69.     }  
  70.     /** 
  71.      * 6.测试findBy方法 即简单查询 
  72.      */  
  73.     public void testFindBy(){  
  74.         List<Person>list = pm.findBy("age"11);  
  75.         for(Person p: list){  
  76.             System.out.println(p.getId());  
  77.             System.out.println(p.getName());  
  78.             System.out.println(p.getAge());  
  79.         }  
  80.           
  81.         //如果多个按name字段排序  
  82.         list = pm.findBy("age"15false"name");  
  83.         for(Person p: list){  
  84.             System.out.println(p.getId());  
  85.             System.out.println(p.getName());  
  86.             System.out.println(p.getAge());  
  87.         }  
  88.     }  
  89.     /** 
  90.      * 7.findUniqueBy查询 仅返回单个对象 
  91.      */  
  92.     public void testFindUniqueBy(){  
  93.         Person p = pm.findUniqueBy("age"16);  
  94.         System.out.println("id :" + p.getId());  
  95.         System.out.println("name :" + p.getName());  
  96.         System.out.println("age :" + p.getAge());  
  97.     }  
  98.     /** 
  99.      * 8.分页查询测试 pageQuery 
  100.      */  
  101.     public void testPagedQuery(){  
  102.         Page page = pm.pagedQuery("from Person p where p.age > ?"12011);  
  103.         System.out.println("currentPageNo " + page.getCurrentPageNo());  
  104.         System.out.println("totalCount " + page.getTotalCount());  
  105.         List<Person> list = (List<Person>) page.getResult();  
  106.         for(Person p: list){  
  107.             System.out.println("id :" + p.getId());  
  108.             System.out.println("name :" + p.getName());  
  109.             System.out.println("age :" + p.getAge());  
  110.         }  
  111.     }  
  112.     /** 
  113.      * 9.更新方法 测试saveOrUpdate 
  114.      */  
  115.     public void testUpdate(){  
  116.         Person p = pm.findUniqueBy("age"16);  
  117.         p.setName("16per");  
  118.         pm.saveOrUpdate(p);  
  119.         p = pm.findUniqueBy("age"16);  
  120.         System.out.println(p.getName());  
  121.     }  
  122.     /** 
  123.      * 10.测试通过id删除方法 removeById 
  124.      */  
  125.     public void testRemoveById(){  
  126.         pm.removeById(23);  
  127.         Person p = pm.get(new Integer(23));  
  128.         System.out.println(p==null);  
  129.     }  
  130.     /** 
  131.      * 11.测试通过对象删除 remove 
  132.      */  
  133.     public void testRemove(){  
  134.         Person p = pm.get(new Integer(24));  
  135.         pm.remove(p);  
  136.         p = pm.get(new Integer(24));  
  137.         System.out.println(p==null);  
  138.     }  

0 0