hibernate中session和query的运用

 继承了HibernateDaoSupport类的类获取session时,有以下几个好处:

对于session不了解请先看后面的session偷笑

1):由于HibernateDaoSupport本身已有获取session的方法getSession(),所以直接用Session se=this.getSession();来获取,此时我们执行完了事物操作之后要session.close()或者this.releaseSession(session);关闭session。

插述:hibernate获取session的几种方法:

1,Session session = SessionFactoryUtils.getSession(getSessionFactory(), true); ---->最基本的获取方法

 2,Session session =  new Configuration().configure().buildSessionFactory().openSession();,------>通过配置文件获取疑问

 Configuration的其他用法
Configuration的configure ()方法还支持带参数的访问方式,你可以指定hbm.xml文件的位置,而不是使用默认的classpath
下面的hibernate.cfg.xml这种方式,例如:
Configuration cfg = new Configuration().configure("myexample.xml");

sessionFactory = new Configuration().buildSessionFactory();

3,SessionFactory sessionFactory = new Configuration().buildSessionFactory(); sessionFactory.openSession();
  sessionFactory.getCurrentSession();---->
第一次死openSession(),后面都是获取当前session。就可以使内存用到最少。与第一种一样只是getCurrentSession();疑问

4,Session session= this.getSession();如果继承了hibernateDaoSupport的话。

5,自己写一个hibernateUtils类,在里面打开openSession()。如

A typical transaction should use the following idiom: 官方推荐写法:
 Session sess = factory.openSession();
 Transaction tx;
 try {
     tx = sess.beginTransaction();
     //do some work
     ...
     tx.commit();
 }
 catch (Exception e) {
     if (tx!=null) tx.rollback();
     throw e;//e.printStackTrace();
 }
 finally {
     sess.close();
 } 
Interface Session extends Session(下面是gaiSession中的常用方法) extends  Serializable

 

@1-->掌握session中的几个基本方法的使用。

createQuery:只能用hql语句进行查询,骂人此方法和下面的createSQLQuery也可以进行更新等操作,如:session.createQuery(hql)。executeUpdate(); 

以hibernate生成的Bean为对象装入list返回,返回list集合。调用.list()时生成的SQL:select userid,username from tuser;
调用session.createQuery("from User u").iterator()时生成的SQL:select userid from tuser;可以看出可以看出list()一次将数据从数据库中读出直接填充到List中
iterator()将数据的主键从数据库中读出,当循环这个Iterator时才添加执行:

用途:
  
createSQLQuery:可以用sql语句查询,以对象数组进行存储, session.createSQLQuery(sql).addEntity(Dtree.class).list();可以这样返回list集合

用途:

总结大笑:createSQLQuery  sql语句查询,直接查表,执行速度比createQuery快,createQuery 根据HQL对象查询,需要映射文件hbm.xml配置.

3):save方法 

save method stores an object into the database.

保存方法存储到数据库中的对象。                     骂人看老外怎么写的 ,翻译过来真别扭

That means it insert an entry if the identifier doesn't exist, else it will throw error.

==》如果标识符不存在的话,这意味着它将插入(保存)一个对象,如果标识符已经存在的话的话,它会抛出错误。

If the primary key already present in the table, it cannot be inserted.

==》如果表中已存在主键,对象不能插入。疑问

4):saveOrUpdate方法  用于把实体持久化到数据库中或更新实体。saveOrUpdate方法兼有save和update方法的功能,save和update方法的监听器都是saveOrUpdate方法对应监听器的子类。即saveOrUpdate使save或者update方法的组合。可以执行save或者update的所有功能,甚至可以替代save或者update。但是如果我们明确的知道了自己是要保存还是更新的对象的话,最好还是用save或者update,这样执行效率会高。

This method calls save() or update() based on the operation.

此方法调用保存()或update()的基础上操作。

 If the identifier exists, it will call update method else the save method will be called.

==》如果存在的标识符,它会调用Update方法,否则调用保存方法。

5):update方法

update method in the hibernate is used for updating the object using identifier

更新方法用于根据指定标识符更新的对象。

If the identifier is missing or doesn't exist, it will throw exception.

==》如果标识符是丢失或不存在,它会抛出异常。

中国版:

saveOrUpdate()方法同时包含了save()与update()方法的功能,如果传入的参数是临时对象,就调用save()方法;如果传入的参数是游离对象,就调用update()方法;如果传入的参数是持久化对象,那就直接返回。那么,saveOrUpdate()方法如何判断一个对象处于临时状态还是游离状态呢?如果满足以下情况之一,Hibernate就把它作为临时对象。疑问

  • Java对象的OID取值为null。
  • Java对象具有version属性并且取值为null。
  • 在映射文件中为<id>元素设置了unsaved-value属性,并且IOD取值与unsaved-value属性值匹配。
  • 在映射文件中为version属性设置了unsaved-value属性,并且version属性取值与unsaved-value属性值疑问

 

6):merge方法 如果在add一个对象之后,如果存在关联对象,并且需要再同一个hibernate session中进行回显,则建议使用merge()方法。

http://blog.csdn.net/oldcrane/article/details/3837188

7):persist方法http://www.blogjava.net/dreamstone/archive/2007/07/29/133071.html

8):get方法

9):load方法

其他方法:

1):flush方法

2):clear方法

3):refresh方法

4):evict方法

2):可以this.getHibernateTemplate()。方法来进行hql语句的操作,我们不需要打开关闭session,连接,会话等这些,hibernate和spring已经帮我们封装好了。标准格式:直接一句代码搞定如:this.getHibernateTemplate().delete(dtree);

掌握下面方法的使用:

getHibernateTemplate().save(entity);

getHibernateTemplate().update(entity);

getHibernateTemplate().saveOrUpdate(entity);

getHibernateTemplate().merge(entity);

getHibernateTemplate().persist(entity);

getHibernateTemplate().get(entityClass, id);

getHibernateTemplate().load(entityClass, id);

getHibernateTemplate().clear();

getHibernateTemplate().flush();

getHibernateTemplate().evict(entity);

getHibernateTemplate().refresh(entity);

3):

参考:

 
 
TransactionbeginTransaction()           Begin a unit of work and return the associated Transaction object
 
 
 QuerycreateQuery(String queryString)           Create a new instance of Query for the given HQL query string.
 SQLQuerycreateSQLQuery(String queryString)           Create a new instance of SQLQuery for the given SQL query string.
http://hi.baidu.com/21xionghua/blog/item/199d43fa59e6908b9e5146ad.html
采用sql查询,不能直接转换为list集合,采用下面的方法就可以了
 List catNameList = session.createSQLQuery(sql).addEntity(DocCatalogInfo.class).list();
如果是关联查询出来的是哪个对象?怎么处理?
select * from t_user a,t_user_role b where a.c_userid=b.c_userid and a.c_username='admin'
sql查询可以更换为list查询更精确的就是string[]数组的集合:
select C_ROLEID from t_user a,t_user_role b where a.c_userid=b.c_userid and a.c_username='admin'
[POWERUSERS, ADMINS, USERS, GROUPADMINS]
 
void delete(Object object)
           从数据库中移除持久化(persistent)对象的实例
get(Class clazz, Serializable id)
           根据给定标识和实体类返回持久化对象的实例,如果没有符合条件的持久化对象实例则返回null。
getSessionFactory()
           获取创建这个session的SessionFactory实例。
save(Object object)
           首先为给定的自由状态(Transient)的对象(根据配置)生成一个标识并赋值,然后将其持久化。
void saveOrUpdate(Object object)
           根据给定的实例的标识属性的值(注:可以指定unsaved-value。一般默认null。)来决定执行 save() 或update()操作。
void update(Object object)
           根据给定的detached(游离状态)对象实例的标识更新对应的持久化实例。
query
http://developer.51cto.com/art/200906/130073.htm
 
 
  1. String hql=”from User user ”;  
  2. List list=session.CreateQuery(hql).list(); 
上面的代码执行结果是,查询出User实体对象所对应的所有数据,而且将数据封装成User实体对象,并且放入List中返回。
 
 
 Iteratoriterate()           Return the query results as an Iterator.
 Listlist()           Return the query results as a List.
 
 
 intexecuteUpdate()           Execute the update or delete statement.
 
 

批量更新:通过这种方式我们可以在Hibernate3中,一次性完成批量数据的更新,对性能的提高是相当的可观。同样也可以通过类似的方式来完成delete操作,如下面的代码:

  1. Transaction trans=session.beginTransaction();  
  2. String hql=”delete from User user where user.age=18”;  
  3. Query queryupdate=session.createQuery(hql);  
  4. int ret=queryupdate.executeUpdate();  
  5. trans.commit();
  6. 如果使用的是getCurrentSession来创建session的话,在commit后,session就自动被关闭了,也就是不用再session.close()了。但是如果使用的是openSession或者getSession()方法创建的session的话,那么必须显示的关闭session,也就是调用session.close()方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值