Hibernate学习笔记

Hibernate使用XML文档来维护Java类和关系数据库表之间的映射关系。这样通过Hibernate可以吧信息从SQL数据库中提取出来,在将它转换成Java对象。

一、Hibernate开发

1.生成和数据库相关的接口类和xml配置文件——对底层数据库

用Eclipse插件MiddleGenIDE帮助生成关于数据表的文件。将产生User.java和User.hbm.xml。其中java文件包括对数据表中各个属性的定义和set,get操作。xml文件包含对这个队形的映射文件。如下图为xml文件,其中generator是用来告诉Hibernate使用底层数据库是主键的生成方式,native为在数据库中自增加的方式

2.创建持久化类,即对数据库接口的实现——对底层数据库实现

在Hibernate中每一个session都有两个状态:瞬时状态和持久化状态。当new一个user类之后,此时就为瞬时状态若要现在需要对user数据表进行相关操作。就需要调用save()方法将其持久化,只有这样在JVM之后这个数据对象还能够存在。当调用delete之后就回到瞬时状态了。

二、常用的Hibernate操作

1.select(查询类似)

public User select(String username){
  Session session =null;
  User record =null;
  
  try {
   session = HibernateSessionFactory.currentSession();//用工厂模式对session进行管理,SessionFactory是线程安全的

  //如何保证线程安全呢?在java中连接数据库依赖的是java.sql.Connection,在Hibernate中Hibernate Session对Connection进行了一层高级封装。一个Session对应了一个Connection,要实现延迟加载必须保证是同一个session并且从头到尾都是一个session.

   //在java中一个请求是一个线程,tomcat采用线程池机制,当有一个http请求的时候,随机从线程池中取出一个线程对象去处理。要保证请求使用同一个session就需要对线程进行绑定。在java中用ThreadLocal实现对线程的绑定。
   Query query = session.createQuery("from User where username=?");//使用问号参数,注意参数是从0开始计数的
   query.setString(0, username.trim());
   record = (User) query.uniqueResult();//查询只有一个结果。若结果是个集合 query.list()
   query = null;
  } catch (HibernateException e) {
   // TODO: handle exception
   throw e;
  }finally{
   HibernateSessionFactory.closeSession();
  }
  return record;
  
 }

 

2.Insert

public Integer insert(User record){
  Session session=null;
  Transaction tx=null;//采用事务
  Integer id=null;
  try {
   session=HibernateSessionFactory.currentSession();
   tx=session.beginTransaction();
   session.save(record);//由瞬时化变为持久化
   id=record.getId();
   tx.commit();//注意提交
  } catch (HibernateException e) {
   // TODO Auto-generated catch block
   throw e;
  }finally{
   if(tx!=null){
    tx.rollback();
   }
   HibernateSessionFactory.closeSession();
  }
  return id;
  
 }

3.条件查询Criteria(可以取代HQL)

public Page list(String username, int pageSize, int pageNo) {
  Session session = null;
  Page pager = null;
  try {
   session = HibernateSessionFactory.currentSession();

   // 创建查询条件
   Criteria criteria = session.createCriteria(Address.class);
   criteria.add(Restrictions.eq("username", username));//Restriction用于在在查询中指定各种约束条件

   // 取得总数
   int rowCount = ((Integer) criteria.setProjection(
     Projections.rowCount()).uniqueResult()).intValue();//setProjection投影操作
   criteria.setProjection(null);

   // 取得当前页
   int startIndex = pageSize * (pageNo - 1);

   // 设置排序条件
   criteria.addOrder(Order.asc("username"));
   criteria.setFirstResult(startIndex);
   criteria.setMaxResults(pageSize);
   List<?> result = criteria.list();
   pager = new Page(pageSize, pageNo, rowCount, result);
  } catch (HibernateException e) {
   pager = new Page(pageSize, pageNo, 0, new ArrayList<Object>());
   throw e;
  } finally {
   HibernateSessionFactory.closeSession();
  }
  return pager;
 }

posted @ 2012-07-20 20:47  double_song  阅读(266)  评论(0编辑  收藏  举报