Hibernate入门学习笔记

来源:互联网 发布:淘宝上优惠券尺寸 编辑:程序博客网 时间:2024/05/17 02:53

学习Hibernate之前的思考:

1、Hibernate是什么?
2、hibernate怎么配置?
3、SessionFactory是干什么的?有哪些方法经常用?
4、hibernate的现成的增删改查方法怎么使用?都有哪些方法?哪些会经常使用?
5、Hql是什么?有什么用?怎么用?
6、Hibernate怎么自定义查询?会用到什么类或接口?
7、Hibernate可以自选数据源?默认的数据源是什么?

学习笔记:

1、Hibernate是一座从对象通往关系的桥梁

有了它,程序员将不用再写面向关系的sql语句,直接操作javaBean对象就可以实现数据库的增删改查等操作。

2、Hibernate的体系结构:

  • SessionFactory(org.hibernate.SessionFactory):

    该对象是JavaBean对象与数据库表之间的关系在内存中的镜像。一般一个数据库对应一个SessionFactory。该对象是线程安全的,它是session工厂。使用它可以获得Session对象,并且它可以给事务之间可以重用的数据提供二级缓存。

  • sesison(org.hibernate.Session):

该对象表示应用程序和JavaBean对象交互操作的一个单线程对象。它是Transaction的工厂,使用它可以获得Transaction,从而去进行事务操作。

  • 事务Transaction(org.hibernate.Tranction):

该对象代表对数据库最小单位的操作。它通过抽象将应用程序和底层具体的JDBC、JTA事务隔离开。某种情况下,一个session可以包括多个Transaction对象。使用该对象一般进行事务的开启和关闭操作。

3、hibernate的增删改查操作

  • 一、增:实现对象持久化靠的是session对象的save(obj)方法。

  • 二、查:

  • a.知道identifier,如主键,则使用load()或get()方法

      load(): User user=(User) session.load(User.class,userId);                get(): User user=(User) session.get(User.class,userId);

区别:load装载某个对象,如果在数据库中该记录不存在,则会抛出一个异常。如果程序员不确定装载的对象是否存在,可以使用get方法。

  • b.不知道identifier,但知道其他属性,则可以使用查询方式即HQL语句查询。

HQL是强大且易于使用的面向对象的查询语言,使用该语言可以通过操作javabean来操作数据库。HQL查询要通过org.hibernate.Query的实例来实现。

Query query=session.createQuery("from User where username=:userName");//获取Query实例对象query.serParameter("userName",userName);//给username赋值List list=query.list();//list方法执行查询并返回查询结果
  • 三、改:

  • 修改持久对象:

    最直接的更新一个对对象的方法是在session处于打开状态是load()它,然后直接修改即可。实例:

Session session=HibernateUtil.getCurrentSession();//获取当前的sessionUser user=session.get(User,userId);//获得持久化对象,此时该对象与session连接user.setUserName("周周");//直接修改属性session.flush();//刷出session,更改会自动提交session.close();//关闭 //修改成功
  • 修改托管(Detached)对象

:在Web应用中,经常是先通过一个session获取一个持久化对象,然后该session被销毁,并把此时处于Detached状态的对象发送到界面层去操作。最后在一个新的session中保存所做的修改。对于这种情况,Hibernate提供了两个方法保存数据。session.update()和session.merge()。merge()方法可以随时保存对象的改动而不考虑session的状态,而update()方法则需要考虑session的状态。

  • saveOrUpdate()方法:

saveOrUpdate()方法即可自动分配新持久化标识(identifier)保存瞬时态对象,又可以更新/重新关联托管(detached)实例。

//在第一个session中获取user1,user1为持久态(Transient)User user1=firstSession.load(User.class,userId);//在更高层的应用程序中执行以下操作//实例化一个user2,user2为瞬时态User user2=new User();user2.setUserName(Smith2);user2.setEmail("Smith2@163.com");user1.setEmail("Smith@163.com");//稍后,在一个新的session中secondSession.saveOrUpdate(user1);//更新user1(user1已经有了一个非空id值)secondSession.saveOrUpdate(user2);//保存user2(保存之前,user2没有非空 )
  • 四、删

删除一个对象就是把该对象由持久态转变为瞬时态,用Session.delete()方法进行删除。

4、Hibernate很重要的API

  • 一、使用Configuration类

    Configuration类的作用是加载配置信息、添加映射类、指定配置资源文件等。实例:

//指定对象关系映射文件Configuration cfg=new Configuration().addResource("model.hbm.xml");/*可以通过addClass()方法将JavaBean类:User、Product添加到cfg中。这样Hibernate就会在ClassPath下的所有映射文件中寻找对User、Product类的映射信息。*/Configuration cfg=new Configuration.addClass(com.star.ShoppingOnline.User.class).addClass(com.star.ShoppingOnline.Product.class);//可以调用其setProperty()方法为Hibernate设置属性,代码如下Configuration cfg= new Configuration().setProperty("hibernate.dialect","org.hibernate.dialect.MySQLDialect").setProperty("show_sql","");
  • 二、使用SessionFactory接口

    当所有映射文件被Configuration解析并加载到内存过后,应用程序必须获得一个用于构造session实例的工厂。这个工厂将别应用程序的所有session共享。SessionFactory的获取:

SessionFactory sf=cfg.buildSessionFactory();
  • 三、使用Session接口

    一旦SessionFactory创建好,就可以用来缓存所有的数据库连接,并且可以给程序员提供一个连接去操作数据库。

Session session=sf.openSession();

然后就可以使用session对象进行操作了。

  • 四、使用transaction接口

    Transaction接口可以通过session对象获取,它主要用来对操作数据库的事务进行管理。一个事务是一个完整的操作单元,要么全部提交,要么全部回滚到提交之前的状态。在编程中一般调用commit()和rollback()方法。

Transaction ts=session.beginTransaction();ts.commit();ts.rollback();
  • 五、使用Query接口

    Query接口用来执行HQL语句,对数据库进行查询。这个接口提供了参数绑定、结果集处理以及运行实际查询的方法。
    1、Query的使用方法:程序员可以通过当前的session获取一个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集合中

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

Iterator iter=session.createQuery("from Product order by saledate desc").iterate();while(iter.hasNext()){     Product product=(Product) iter.next();  //获取对象     //下面的操作是我们使用query对象所不能进行的     if(product.getPrice()>=10){               //根据对象的属性进行判断       iter.remove();                          //删除当前对象       break;     }}

使用iterate()方法,可以对查询结果进行遍历。这样就可以在这个过程中进行一些判断,根据判断的结果决定对这个对象的操作。而这种方式在普通查询中是不能实现的。
3、绑定参数

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

可以看出,在HQL语句中,先用”:username”代表待定的参数,然后用query.setParameter()方法把变量userName的值赋给它。也可以采用这种方式:

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

4、分页操作
在web应用中,经常需要将查询的结果分页显示出来,这就要求一次只能取出所有结果的一个子集,可以通过Query的setFirstResult()和setMaxResults()方法去实现。如

Query q=session.createQuery("from Product");q.setFirstResult(20);  //设置查询的开始位置,实际使用中这个是前端传递过来的参数q.setMaxResults(10);   //设置查询的个数List products=q.list();  //获取结果

5、Hibernate的底层数据源

Hibernate和MyBatis的底层数据源都是c3p0连接池,当为Hibernate设置MaxPoolSize属性时,实际上就是在为连接池设置属性。

1 0
原创粉丝点击