HibernateTemplate及generator用法(转)

在ssh或ssh2中,对数据库进行操作的DAO,都可以通过继承 HibernateDaoSupport来实现对数据库的操作.


继承后的实现方式有两种:
super.getSession().A();
getHibernateTemplate().B();或
getHibernateTemplate().getSessionFactory().openSession().C();

用哪个好呢?
网上都是推荐用getHibernateTemplate,原因是:
getSession()和getHibernateTemplate都可以自动释放连接(当然你的配置要正确),但是在一个线程内,若同一时间进行很多次的操作(如:1000次查询),getSession 会get很多个session(就是开很多个会话、连接),很可能导致数据库连接超过上限。 所以推荐使用 getHibernateTemplate。

 

(1)

getSession的各种用法:

查询:
super.getSession().find()
super.getSession().createQuery()
保存:
super.getSession().save()
super.getSession().update()
super.getSession().delete()


query的用法:
select,update,delete,分页都可通过Query来执行:
-1->用query的好处,可以像PreparedStatement一样,可以设置参数.
-2->且不用Iterate,因为只是判断有没值,所以,用list.size()判断,若有值,也只有一个,即用list

(0)来获取即可
-3->同时,query,不但可用于查询,还可以用于更新:
  String hql = "UPDATE User SET userpwd=? WHERE userid=?";
  Query q = super.getSession().createQuery(hql);
  q.setString(0, userpwd);
  q.setString(1, userid);
  q.executeUpdate();
-4->也可delete:
  String hql = "DELETE FROM Item WHERE itemid=?";
  Query q = super.getSession().createQuery(hql);
  q.setInteger(0, itemid);
  q.executeUpdate();
-5->用query进行分页:
  List all = null;
  String hql = "FROM Question AS q WHERE q.itemid=?";
  Query q = super.getSession().createQuery(hql);
  q.setInteger(0, itemid);
  q.setFirstResult((currentPage - 1) * lineSize);
  q.setMaxResults(lineSize);
  all = q.list();
如:
    Query query = session.createQuery("from User");
    query.setFirstResult(0);//从第一条记录开始
    query.setMaxResults(4);//取出四条记录
    List userList = query.list();


(2)
hibernateTemplate:

HibernateTemplate的常用方法简介:
      void delete(Object entity):删除指定持久化实例
      deleteAll(Collection entities):删除集合内全部持久化类实例
      find(String ueryString):根据HL查询字符串来返回实例集合
      findByNameduery(String ueryName):根据命名查询返回实例集合
      get(Class entityClass, Serializable id):根据主键加载特定持久化类的实例
      save(Object entity):保存新的实例
      saveOrUpdate(Object entity):根据实例状态,选择保存或者更新
      update(Object entity):更新实例的状态,要求entity是持久状态
      setMaxResults(int maxResults):设置分页的大小

 

常用方法实例:
查询:
//通过HibernateTemplate的find方法返回Person的全部实例 --> 返回是list类型
returngetHibernateTemplate().find("from Person");

//带参数查询
用这个方法find(Stringhql,Object para)  --> 返回是list类型
String hql = "SELECT u.userName FROM User u WHERE u.userName = ?";
List userList=this.getHibernateTemplate().find(hql,user.getUserName());

//根据主键返回特定实例 -->主键查询  -->返回是对象类型
return (Person)getHibernateTemplate(). get(Person.class, newInteger(personid));
return (Person)getHibernateTemplate(). load(Person.class, newInteger(personid));

//保存的Person实例
getHibernateTemplate().saveOrUpdate(person);

//删除Person实例的主键
 //先加载特定实例
Object p = getHibernateTemplate().load(Person.class, new Integer(personid));
//删除特定实例
getHibernateTemplate().delete(p);

 

Hibernate的主键生成器generator说明

1、如果主键字段为自增类型。
那么对应的.hbm.xml文件中的id字段的xml声明,
应该这么写:
<generator class="native" />
例如:
<id column="user_id" name="Id" type="integer">
<generator class="native" />
</id>

2、如果主键字段不设置为自增,但是是int型的。
可以使用increment,由hibernate产生主键。
<generator class="increment" />
不过这种方法,对于并发量大的应用,似乎最好不要采用。

3、如果使用uuid.hex产生的随机32位数最为主键。
那么数据库的id字段类型为char,长度为32
hbm.xml中写为: <generator class="uuid.hex" />
另外,uuid.string也是功能类似。
uuid.hex产生的是32位的16进制数字的字符串。
而uuid.string产生的是16个字符长的任意ASCII字符组成的字符串
见参考:
uuid.hex
用一个128-bit的UUID算法生成字符串类型的标识符。在一个网络中唯一(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。
uuid.string
使用同样的UUID算法。UUID被编码为一个16个字符长的任意ASCII字符组成的字符串。不能使用在PostgreSQL数据库中

 

 

HibernateDaoSupport中自带了hibernate的模板供编程者使用。

前提条件:你的类必须继承HibernateDaoSupport
一:
回调函数:
public List getList(){
   return (List )getHibernateTemplate().execute(
     new HibernateCallback() {
      public List doInHibernate(final Sessions)
        throws HibernateException, SQLException{

StringBuffer sb = new StringBuffer();
Query query = s.createSQLQuery(sb.toString());//<STRONG>执行普通sql</STRONG>
Query query = s.createQuery(sb.toString());// <STRONG>执行hql </STRONG>
List list = query.list();
return list ;
      }
     });   
}
采用这种做法的好处是:不用关心事务。session的创建和销毁,一切都在程序内部完成。看看名字doInHibernate就知道好处了。不好的是程序看起来比较乱!这也是我用spring最乱的地方,初学者看起来太乱了。
二:
getHibernateTemplate().find():
List list = getHibernateTemplate().find(String hql):
这里传进来的是hql不是sql。

三:
自己获取session处理。
获取session的两种方式:this.getSession();和this.getHibernateTemplate().getSessionFactory().openSession();
获取session以后再createQuery操作就一样了。但是这种做法,是需要自己去手动关闭session的。所以你需要配置openSessioninview。

其他:
getHibernateTemplate.delete(Object);

getHibernateTemplate.save(Object);
getHibernateTemplate.update(Object);

总结:推荐使用回调函数。

 

作者:wangcongywzq 发表于2013-8-28 15:32:28 原文链接
阅读:59 评论:0 查看评论

你可能感兴趣的:(generator)