Hibernate API的使用

  1. 使用Configuration类
      org.hibernate.cfg.Configuration实例代表了JavaBean类型到sql数据库表映射的完整集合,并且也包含了所有对hibernate属性的设置信息。所以也可以把configuration理解为程序员定义的hibernate.cfg.xml文件在内存中的表示。SessionFactory就是使用Configuration构建而成的。在程序中可以通过Configuration类去加载映射信息,以及设置属性值,如:
      通过以下代码就可以把映射文件model.hbm.xml交给Configuration获取映射信息。
      
<mapping resource="model.hbm.xml">

  除了这种方式,还可以在创建Configuration的实例cfg时,通过addResource()方法为其制定映射资源为model.hbm.xml。
  

Configuration cfg=new Configuration().addResource("model.hbm.xml");

  此外,创建Configuration的实例时,可以通过addClass()方法将JavaBean类User、Product添加到cfg中,这样Hibernate就会在ClassPath下的所有映射文件中寻找对User、Product类的映射信息,代码如下:
  

Configuration cfg=new Configuration().addClass("com.examp.ShoppingOnline.User.class").addClass("com.examp.ShoppingOnline.Product.class");

  除了通过Configuration类加载映射信息,还可以通过调用其setProperty()方法为Hibernate设置属性,代码如下:
  

Configuration cfg=new Configuration().setProperty("hibernate.dialect""org.hibernate.dialect.MySQLInnoDBDialect").setProperty("show_sql","");

  在上面的代码中,把hibernate.dialect属性的值设置为org.hibernate.dialect.MySQLInnoDBDialect,并且把show_sql属性的值设置为true。
2. 使用SessionFactory接口
  当所有映射文件被Configuration解析并加载到内存之后,应用程序必须获得一个用于构造session实例的工厂。这个工厂被应用程序的所有色色死你共享。
  

SessionFactory sessionFactory=cfg.buildSessionFactory();

  如果使用多个数据库,Hibernate允许应用程序创建多个SessionFactory实例,每个数据库创建一个SessionFactory实例,这样很有利。
3. 使用Session接口
  一旦SessionFactory创建好,就可以用来缓存所有的数据库连接,并且可以给程序员提供一个连接去操作数据库。这是程序员需要做的就是使用SessionFactory实例创建一个session对象,然后就可以私用session对象进行操作。代码如下:
  

Session session=sessions.openSession();

  获取session对象后首先调用其beginTransaction()方法获取一个Transaction对象tx;然后可以调用session的save()、update()、load()等方法处理JavaBean对象;在调用tx.comnmit()提交处理,如果发生异常,则调用tx.rollback()去回滚所有操作;最后用session.close()方法关闭该session。
4. 使用Transaction接口
  Transaction接口可以通过session对象获取,它主要用来对操作数据库的事务进行管理。一个事务是一个完整的操作单元,或者全部提交,或者全部回滚到提交前的状态。在编程中一般调用其commit()和rollback()方法,它们分别用来提交所有操作和把所有的操作滚回到原来的状态。
5. 使用Query接口
  (1)Query的使用方法
  

List users=session.createQuery("from User where username=:userName").setParameter("username",userName).list();

List products=session.createQuery("from Product order by saledate desc").setMaxResults(dispNUm).list();

  一个查询通常在调用list()时才被执行,执行结果会被装载进内存的一个集合(collection)中。查询返回的对象处于持久态。如果程序员知道的查询只会返回一个对象,可以使用list()的快捷方式uniqueResult().
  (2)迭代式获取结果(Iterating results)
  

Iterator iter=sesson.createQuery("from Product order by saledate desc").iterate();
while(iter.hasNext()){
  Product product=(Product)iter.next();
  if(product.getPrice()>10){
  iter.remove();
  break;
  }
}

  从以上代码可以看出,使用iterate()方法进行遍历,这样就可以在这个过程中进行一些判断,根据判断结果决定这个对象的操作,而这种方式在普通的查询方法中是无法实施的。
  (3)绑定参数
  在进行查询的过程中,,有些作为查询条件的常量,是其他变量的值,这时就可以使用Query提供的参数绑定的方法去将变量的值赋给查询条件。代码如下:
  

Query query=session.createQuery("from User where username=:userName");
query.setParameter("username",userName);
List list=query.list();

  从上述代码可以看出在HQL语句中,先使用“:username”代表待定的条件参数,然后使用query.setParameter()方法把变量userName的值赋给它。也可以采用以下方式:
  

Query query=session.createQuery("from User where username=?");
query.setString(0,"Simith2");
List list=query.list();

  用“?”代表待定的条件常量,然后用setString()方法把字符串Simith2赋值给它。
  (4)分页操作
  在web应用中,经常需要将查询的结果分页显示出来,这就要求一次只能去除所有结果的一个子集,可以通过Query的setFirstResult()和setMaxResults()方法实现,代码如下:
  

Query q=session.createQuery("from Product");
q.setFirstResult(20);
q.setMaxResults(10);
List procucts=q.list();

  以上的代码取出第20-30条,一共十条记录。
6. 使用Criteria接口
   Criteria接口是程序员可以动态的使用一种面对对象API创建查询,而非在java代码中嵌入字符串。代码如下:
   

Criteria crit=session.createCriteria(Product.class);
crit.add(Expression.eq("price",12.0));
crit.setMaxResults(10);
List products=crit.list();

   以上代码用来查询价格为12.0的所有商品,并且要求最多返回的商品数不超过10个。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章