继承了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();,------>通过配置文件获取
3,SessionFactory sessionFactory = new Configuration().buildSessionFactory(); sessionFactory.openSession(); 4,Session session= this.getSession();如果继承了hibernateDaoSupport的话。 5,自己写一个hibernateUtils类,在里面打开openSession()。如
|
@1-->掌握session中的几个基本方法的使用。
createQuery:只能用hql语句进行查询,此方法和下面的createSQLQuery也可以进行更新等操作,如:session.createQuery(hql)。executeUpdate(); 以hibernate生成的Bean为对象装入list返回,返回list集合。调用.list()时生成的SQL:select userid,username from tuser; 用途: 用途: 总结: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. ==》如果标识符是丢失或不存在,它会抛出异常。
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):
参考:
Transaction | beginTransaction()
Begin a unit of work and return the associated Transaction object |
Query | createQuery(String queryString)
Create a new instance of Query for the given HQL query string. |
SQLQuery | createSQLQuery(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
- String hql=”from User user ”;
- List list=session.CreateQuery(hql).list();
上面的代码执行结果是,查询出User实体对象所对应的所有数据,而且将数据封装成User实体对象,并且放入List中返回。
Iterator | iterate()
Return the query results as an Iterator. |
List | list()
Return the query results as a List. |
int | executeUpdate()
Execute the update or delete statement. |
批量更新:通过这种方式我们可以在Hibernate3中,一次性完成批量数据的更新,对性能的提高是相当的可观。同样也可以通过类似的方式来完成delete操作,如下面的代码:
- Transaction trans=session.beginTransaction();
- String hql=”delete from User user where user.age=18”;
- Query queryupdate=session.createQuery(hql);
- int ret=queryupdate.executeUpdate();
- trans.commit();
- 如果使用的是getCurrentSession来创建session的话,在commit后,session就自动被关闭了,也就是不用再session.close()了。但是如果使用的是openSession或者getSession()方法创建的session的话,那么必须显示的关闭session,也就是调用session.close()方法。