Hibernate系列教材 (二十二)- 各类概念 - N+1 什么意思? 以及list和Iterator的区别

本文介绍了Hibernate的缓存机制,特别关注了如何通过Query的list方法导致的N+1查询问题。作者指导读者通过模仿和排错,学习如何利用Iterator避免N+1查询,通过分步操作优化查询性能。

Hibernate有缓存机制,可以通过用id作为key把product对象保存在缓存中

同时hibernate也提供Query的查询方式。假设数据库中有100条记录,其中有30条记录在缓存中,但是使用Query的list方法,就会所有的100条数据都从数据库中查询,而无视这30条缓存中的记录

N+1是什么意思呢,首先执行一条sql语句,去查询这100条记录,但是,只返回这100条记录的ID
然后再根据id,进行进一步查询。

如果id在缓存中,就从缓存中获取product对象了,否则再从数据库中获取

步骤1:先运行,看到效果,再学习
步骤2:模仿和排错
步骤3:Hibernate使用Iterator实现N 1

步骤 1 : 先运行,看到效果,再学习

老规矩,先下载下载区(点击进入)的可运行项目,配置运行起来,确认可用之后,再学习做了哪些步骤以达到这样的效果。

步骤 2 : 模仿和排错

在确保可运行项目能够正确无误地运行之后,再严格照着教程的步骤,对代码模仿一遍。
模仿过程难免代码有出入,导致无法得到期望的运行结果,此时此刻通过比较正确答案 ( 可运行项目 ) 和自己的代码,来定位问题所在。
采用这种方式,学习有效果,排错有效率,可以较为明显地提升学习速度,跨过学习路上的各个槛。

推荐使用diffmerge软件,进行文件夹比较。把你自己做的项目文件夹,和我的可运行项目文件夹进行比较。
这个软件很牛逼的,可以知道文件夹里哪两个文件不对,并且很明显地标记出来
这里提供了绿色安装和使用教程:diffmerge 下载和使用教程

步骤 3 : Hibernate使用Iterator实现N 1

首先通过Query的iterator把所有满足条件的Product的id查出来

然后再通过it.next()查询每一个对象
如果这个对象在缓存中,就直接从缓存中取了
否则就从数据库中获取

N+1中的1,就是指只返回id的SQL语句,N指的是如果在缓存中找不到对应的数据,就到数据库中去查

Hibernate使用Iterator实现N 1

package com.how2java.test;
 
import java.util.Iterator;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import com.how2java.pojo.Product;
 
public class TestHibernate {
    public static void main(String[] args) {
        SessionFactory sf = new Configuration().configure().buildSessionFactory();
        Session s = sf.openSession();
        s.beginTransaction();
 
        String name = "iphone";
        
        Query q =s.createQuery("from Product p where p.name like ?");
        
        q.setString(0, "%"+name+"%");
       
        Iterator<Product> it= q.iterate();
        while(it.hasNext()){
        	Product p =it.next();
            System.out.println(p.getName());
        }
       
        s.getTransaction().commit();
        s.close();
        sf.close();
    }
 
}


更多内容,点击了解: https://how2j.cn/k/hibernate/hibernate-nplus1/52.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值