Hibernate知识整理2----4种查询方法

来源:互联网 发布:反骨是什么网络用语 编辑:程序博客网 时间:2024/06/11 07:39

1.根据主键查询:session.get

//1,通过配置文件创建一个session工厂,默认去src或classes根目录去找hibernate.cfg.xml配置文件    SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();//2,从工厂中取得2个session(提供给我们进行数据库操作的会话对象)    Session sessionA = sessionFactory.openSession();//3.根据主键查询    Member m1 =(Member)session.get("com.demo.db.DTO.Member", 1);    UserDto up = (UserDto)session.get(UserDto.class, dto.getUser_id());

查询机制:
第一次查询的时候,会把这个对象缓存给session,第二次使用这个session查的时候,由于已经有缓存,不会再发出查询

hibernate默认不自动提交事务,不提交,数据库不改变;而修改后输出结果却是改后的,原因是由于前面查了一次,session中就有该对象的缓存,而对应的修改方法会把缓存给改了,所以只运行了一次查询,而没有运行更新

Sa查出对象,对象在“缓存区”,Sa关闭,他们的关联断开,对象“游离”,这时用Sb去进行更新,这个缓存对象又与Sb关联,所以后面再查不会重新查数据库

sessionA查出来的对象用sessionB处理的话,两个session关联同一个对象了

2.根据HQL查询session.createQuery(HQL)

这个方法每次都会进行数据库查询,并且会将查询到的数据储存在缓存当中。当我们要查询某一条数据时(get),如果缓存当中存在的话,将不会再向数据库发出查询;如果该数据项在缓存当中不存在的话,则会再次向数据库发出查询。

3.单个数据查询及防注入

单个查询

Query query = session.createQuery("from Student");Object o = query.uniqueResult();

防注入写法
参数绑定

String HQL = "from Student s where s.name like :searchString";//冒号后面是一个named parameter,我们可以使用Query接口将一个参数绑定到searchString参数上:List result = session.createQuery(HQL ).setString("searchString", searchString).list();//多参数String HQL = "from Student s "+ "where s.name like :searchString " + "and s.date > :minDate";List result = session.createQuery(HQL)                  .setString("searchString", searchString)                   .setDate("minDate", minDate)                  .list();//Query query=session.createQuery(“from User user where user.name=:customername and user:customerage=:age ”); //query.setString(“customername”,name); //query.setInteger(“customerage”,age); //positional parameter写法(不常用)String HQL = "from Student s "+ "where s.name like ?" + "and s.date > ?";List result = session.createQuery(HQL)                  .setString(0, searchString)                   .setDate(1, minDate)                  .list();

4.hibernate懒加载(延时加载)load();

    **拓展**:懒加载(LazyLoad)一直是前端的优化方案之一。它的核心思想是:当用户想看页面某个区域时,再加载该区域的数据。这在一定程度上减轻了服务器端的压力,也加快了页面的呈现速度。    懒加载多用于图片,因为它属于流量的大头。最典型的懒加载实现方案是先将需要懒加载的图片的src隐藏掉,这样图片就不会下载,然后在图片需要呈现给用户时再加上src属性。
Student student = (Student) session.load(Student.class, 1); 

调用load方法返回的是代理对象,代理对象中只保存了id,只有在获取非主键属性时,才会发出sql语句;

hibernate3以后默认启用了延迟加载:lazy=”true”;
get方法不使用延迟加载机制,首先查找Session缓存,然后查找二级缓存,然后查询数据库(hibernate3以前会跳过二级缓存,直接查询数据库)。
load方法首先查找Session缓存,然后查找二级缓存,若找不到则返回代理对象,延迟到真正使用对象非主键属性时才发出sql语句加载对象。

若设置lazy=”false”,load返回代理对象之后会发出sql语句

因此如果提前关闭session的话,在使用到缓存当中没有的非主键属性时,就会报错,解决方法是在Filter进行事务管理,不过对于性能会有损耗;load的生命周期伴随着session工厂。

5.Criteria

Criteria是直接来操作对象来与数据库交互;(相当于一个容器)
org.hibernate.criterion.Restrictions的各种静态方法传回org.hibernate.criterion.Criteria实例,传回的每个org.hibernate.criterion.Criteria实例代表着一个条件,您要使用org.hibernate.Criteria的add()方法加入这些条件实例,
可以使用Restrictions的函数方法(大于,小于)

6.修改

a.

session.beginTransaction();//开启事务up.setData_status(1);session.save(up);//保存session.getTransaction().commit();//提交事务

b.

Member m1 =(Member)sessionA.get("com.leec.demo.db.DTO.Member", 1);  Member M = new Member();M.setM_id(1);Transaction tx=sessionA.beginTransaction();//事务开始sessionA.saveOrUpdate(M);tx.commit();//事务提交      
Member m1 =(Member)sessionA.get("com.leec.demo.db.DTO.Member", 1);  Member M = new Member();M.setM_id(1);Transaction tx=sessionA.beginTransaction();//事务开始sessionA.merge(M);tx.commit();//事务提交      

save和update两个方法是要把处理的对象与当前session关联上;delete是要把关联去掉;
而merge则原来这个对象是怎么样的就怎么样,但会把结果反映到缓存对象和数据库中,也就是所谓的“合并”了;

1 0