HibernateTemplate的使用

出处: http://blog.csdn.net/warcraftjimmy/article/details/6301236

在使用前需要在Spring的配置文件applicationContext.xml中控制反转用到连接数据库中的类是注入SessionsFactory(定义一个sessionfactory的bean),并且继承继承HibernateDaoSupport类

 

 使用HibernateTemplate的方法进行CRUD操作,其中查询操作通常可分为两种, 
     一种为固定条件查询, 
     另一种为动态多条件查询(如查询界面的实现),固定条件查询可以很方便地通过createQuery,find()等方法实现,但是我在动态条件查询的实现过程中,hibernate3.0可以实现英文的条件查询,而中文条件则会出现乱码。现将具体的过程描述如下: 

      1.固定条件查询 

    可以使用常规的方法,如

  1. getHibernateTemplate().find(),getHibernateTemplate().createQuery()等  
[java]  view plain  copy
  1. getHibernateTemplate().find(),getHibernateTemplate().createQuery()等  




2.动态多条件查询 

由于查询条件的不确定性,我曾尝试用拼参数的方法将拼好的sql语句传入find(qlStr),但是查询时hibernate会将中文的条件报为乱码。不过如果条件全部是英文参数的话拼sql是可以的。乱码报错如下: 
3:49,946 INFO  [STDOUT] Hibernate: 
select incometype0_.id as id, incometype0_.name as name0_, incometype0_.type_comment as type3_0_ from income_type incometype0_ where 1=1 and incometype0_.type_comment='·á????×?????' 
因此这种方法无法使用。另外find()的另一种find(String arg0,Object[] arg1),采用数组参数将sql的条件参数传入的方式只是适合固定条件参数的查询,不适合这种动态多条件的中文查询,因此也无法使用。 

说明:由于find(String arg0,Object[] arg1)采用数组参数的方式可以使用中文条件查询,因此可以确定不是我的编码问题。而是Hibernate3.0的find(sqlStr)方法本身的问题。 

为此只能换成另一种实现途径,如下: 

实现途径: 
得到session ,用Query q = session.createQuery(sql);该方法返回一个Query 类型,利用q.setString(String arg0,String arg1)将参数赋值给sql的参数条件。在sql语句中拼一次参数,在setString()中也拼一次赋值。 
如:

  1. public List phraseQuery(final String id, final String name,   
  2.                final String typecomment) {   
  3.           StringBuffer sql = new StringBuffer();   
  4.   
  5.           sql.append("from IncomeType where 1=1 ");   
  6.           if (id != null && id.length() > 0)   
  7.                sql.append(" and id = :id ");   
  8.           if (name != null && name.length() > 0)   
  9.                sql.append(" and name = :name ");   
  10.           if (typecomment != null && typecomment.length() > 0)   
  11.                sql.append(" and typeComment = :tc ");   
  12.   
  13.           final String typeSql = new String(sql);   
  14.   
  15.           return (List) getHibernateTemplate().execute(   
  16.                     new HibernateCallback() {   
  17.                          public Object doInHibernate(Session session)   
  18.                                    throws HibernateException, SQLException {   
  19.                               Query q = session.createQuery(typeSql);   
  20.                               if (id != null && id.length() > 0)   
  21.                                    q.setString("id", id);   
  22.                               if (name != null && name.length() > 0)   
  23.                                    q.setString("name", name);   
  24.                               if (typecomment != null  
  25.                                         && typecomment.length() > 0)   
  26.                                    q.setString("tc", typecomment);   
  27.   
  28.                               return q.list();   
  29.                          }   
  30.                     });   
  31.      }  
[java]  view plain  copy
  1. public List phraseQuery(final String id, final String name,  
  2.                final String typecomment) {  
  3.           StringBuffer sql = new StringBuffer();  
  4.   
  5.           sql.append("from IncomeType where 1=1 ");  
  6.           if (id != null && id.length() > 0)  
  7.                sql.append(" and id = :id ");  
  8.           if (name != null && name.length() > 0)  
  9.                sql.append(" and name = :name ");  
  10.           if (typecomment != null && typecomment.length() > 0)  
  11.                sql.append(" and typeComment = :tc ");  
  12.   
  13.           final String typeSql = new String(sql);  
  14.   
  15.           return (List) getHibernateTemplate().execute(  
  16.                     new HibernateCallback() {  
  17.                          public Object doInHibernate(Session session)  
  18.                                    throws HibernateException, SQLException {  
  19.                               Query q = session.createQuery(typeSql);  
  20.                               if (id != null && id.length() > 0)  
  21.                                    q.setString("id", id);  
  22.                               if (name != null && name.length() > 0)  
  23.                                    q.setString("name", name);  
  24.                               if (typecomment != null  
  25.                                         && typecomment.length() > 0)  
  26.                                    q.setString("tc", typecomment);  
  27.   
  28.                               return q.list();  
  29.                          }  
  30.                     });  
  31.      }  

        

以上方法可以实现动态中文条件查询,在有的书中看到并不推荐用find()方法,find()只提供一些简单的HQL查询,不具有动态绑定参数的功能,在将来的hibernate新版本中,有可能会淘汰find()方法,而Query接口才是真正的HQL查询接口,提供更为丰富的功能。基于此,可能对于一个将被淘汰的方法find()不支持中文也就不足为奇了。^_^毕竟人家重心转移了。而且find()中拼sql字符串的方式虽然是实现查询的常用手段,实现起来也比较方便,但是不利于hibernate更好地利用缓存,而采用Query接口可以更好地利用缓存,提高程序执行效率。 
HibernateTemplate的常用方法简介: 

  1. q      void delete(Object entity):删除指定持久化实例   
  2.   
  3. q      deleteAll(Collection entities):删除集合内全部持久化类实例   
  4.   
  5. q      find(String queryString):根据HQL查询字符串来返回实例集合   
  6.   
  7. q      findByNamedQuery(String queryName):根据命名查询返回实例集合   
  8.   
  9. q      get(Class entityClass, Serializable id):根据主键加载特定持久化类的实例   
  10.   
  11. q      save(Object entity):保存新的实例   
  12.   
  13. q      saveOrUpdate(Object entity):根据实例状态,选择保存或者更新   
  14.   
  15. q      update(Object entity):更新实例的状态,要求entity是持久状态   
  16.   
  17. q      setMaxResults(int maxResults):设置分页的大小  
[java]  view plain  copy
  1. q      void delete(Object entity):删除指定持久化实例  
  2.   
  3. q      deleteAll(Collection entities):删除集合内全部持久化类实例  
  4.   
  5. q      find(String queryString):根据HQL查询字符串来返回实例集合  
  6.   
  7. q      findByNamedQuery(String queryName):根据命名查询返回实例集合  
  8.   
  9. q      get(Class entityClass, Serializable id):根据主键加载特定持久化类的实例  
  10.   
  11. q      save(Object entity):保存新的实例  
  12.   
  13. q      saveOrUpdate(Object entity):根据实例状态,选择保存或者更新  
  14.   
  15. q      update(Object entity):更新实例的状态,要求entity是持久状态  
  16.   
  17. q      setMaxResults(int maxResults):设置分页的大小  

下面是一个完整DAO类的源代码:

  1. public class PersonDAOHibernate implements PersonDAO   
  2.   
  3. {   
  4.   
  5.     //采用log4j来完成调试时的日志功能   
  6.   
  7. private static Log log = LogFactory.getLog(NewsDAOHibernate.class);   
  8.   
  9.     //以私有的成员变量来保存SessionFactory。   
  10.   
  11. private SessionFactory sessionFactory;   
  12.   
  13. //以私有变量的方式保存HibernateTemplate   
  14.   
  15. private HibernateTemplate hibernateTemplate = null;   
  16.   
  17.          //设值注入SessionFactory必需的setter方法   
  18.   
  19.     public void setSessionFactory(SessionFactory sessionFactory)    
  20.   
  21. {   
  22.   
  23.            this.sessionFactory = sessionFactory;   
  24.   
  25.     }   
  26.   
  27.          //初始化本DAO所需的HibernateTemplate   
  28.   
  29. public HIbernateTemplate getHibernateTemplate()    
  30.   
  31. {   
  32.   
  33.          //首先,检查原来的hibernateTemplate实例是否还存在   
  34.   
  35.          if ( hibernateTemplate == null)   
  36.   
  37.          {   
  38.   
  39.                    //如果不存在,新建一个HibernateTemplate实例   
  40.   
  41.                    hibernateTemplate = new HibernateTemplate(sessionFactory);   
  42.   
  43.          }   
  44.   
  45.          return hibernateTemplate;   
  46.   
  47. }   
  48.   
  49.          //返回全部的人的实例   
  50.   
  51.     public List getPersons()   
  52.   
  53.          {           
  54.   
  55.                    //通过HibernateTemplate的find方法返回Person的全部实例   
  56.   
  57.            return getHibernateTemplate().find("from Person");   
  58.   
  59.     }   
  60.   
  61.          /**  
  62.  
  63.           * 根据主键返回特定实例  
  64.  
  65.           * @ return 特定主键对应的Person实例  
  66.  
  67.           * @ param 主键值  
  68.  
  69.     public News getNews(int personid)  
  70.  
  71.          {  
  72.  
  73.            return (Person)getHibernateTemplate().get(Person.class, new Integer(personid));  
  74.  
  75.     }  
  76.  
  77.          /**  
  78.  
  79.           * @ person 需要保存的Person实例  
  80.  
  81.           */  
  82.   
  83.     public void savePerson(Person person)   
  84.   
  85.          {                    
  86.   
  87.                    getHibernateTemplate().saveOrUpdate(person);   
  88.   
  89.     }   
  90.   
  91.          /**   
  92.   
  93.           * @ param personid 需要删除Person实例的主键   
  94.   
  95.           * /   
  96.   
  97.     public void removePerson(int personid)   
  98.   
  99.          {   
  100.   
  101.                    //先加载特定实例   
  102.   
  103.            Object p = getHibernateTemplate().load(Person.classnew Integer(personid));   
  104.   
  105.                    //删除特定实例   
  106.   
  107.            getHibernateTemplate().delete(p);   
  108.   
  109.     }   
  110.   

 

 

猜你喜欢

转载自blog.csdn.net/du_minchao/article/details/52311296
今日推荐