Hibernate框架学习1:

来源:互联网 发布:mac和windows双系统 编辑:程序博客网 时间:2024/06/01 08:42

Hibernate框架学习1:

1.对象状态:

瞬时:没有和Hibernate发生任何关系,在数据库中没有任何记录,一旦JVM结束,对象也就消失。

持久:一个对象和Hibernate发生关系,有对应的session,并且在数据库中有一条记录。

托管:一个对象虽然在数据库中有记录,但其session已经关闭。

/** * @param args */public static void main(String[] args) {    SessionFactory sf = new Configuration().configure().buildSessionFactory();    Session s = sf.openSession();    s.beginTransaction();    Product p = new Product();//在数据库中还没有对应的记录,这个时候Product对象的状态是瞬时的。     p.setName("p1");    System.out.println("此时p是瞬时状态");    s.save(p);//Session的save把该对象保存在了数据库中,该对象也和Session之间产生了联系,此时状态是持久的。    System.out.println("此时p是持久状态");    s.getTransaction().commit();    s.close();//session已经关闭了,这个对象虽然在数据库中有了记录,但失去了和session的联系,状态就是托管的    System.out.println("此时p是脱管状态");    sf.close();}

}

严格来说,应该是在commit之后才算持久状态,单纯save之后,数据库中是无法查询到记录的。

2.通过ID获取一个对象:

Product p =(Product) s.get(Product.``class``, ``6``);

``System.out.println(``"id=6的产品名称是: "``+p.getName());

3.删除一条数据

``Product p =(Product) s.get(Product.``class``, ``5``);

`s.delete(p);

4.修改一条数据

`

 Product p =(Product) s.get(Product.class, 6)        System.out.println(p.getName());        p.setName("iphone-modified");        s.update(p);

5.使用HQL,根据name进行模糊查询:

String name = "iphone";        Query q =s.createQuery("from Product p where p.name like ?");//根据HQL创建一个Query对象,from后面使用的是类的名字Product,而非表格的名字product_        q.setString(0, "%"+name+"%");//设置参数        List<Product> ps= q.list();//Query对象的list()方法即返回查询的结果        for (Product p : ps) {            System.out.println(p.getName());        }

6.使用Criteria,根据name进行模糊查询:

  1. 通过session的createCriteria创建一个Criteria 对象

  2. Criteria.add 增加约束。 在本例中增加一个对name的模糊查询(like)

  3. 调用list()方法返回查询结果的集合

    此外,Criteria还可以很方便的进行分页查询和获取总数

    String name = "iphone";       Criteria c= s.createCriteria(Product.class);//创建Criteria对象       c.add(Restrictions.like("name", "%"+name+"%"));       List<Product> ps = c.list();       for (Product p : ps) {           System.out.println(p.getName());       }

7.使用标准SQL进行查询,比如多表联合查询使用这种方法较好。

    String sql="select * from product_ p where p.name like '%"+name+"%'";//where前面的p,别名,相当于变量名,代表表 project_    Query q=s.createSQLQuery(sql);    List<Object[]> list=q.list();//得到的对象都是 Object [ ] 数组对象,并把这些对象都放在list这个集合中    for(Object[] os:list){        for(Object failed:os){            System.out.print(failed+"\t");        }        System.out.println();    }`