get(Class clazz,id)和load(Class clazz,id)都是用来根据主键的内容查询数据库中数据,并且返回相对应的类的对象
用法如下:
public static void main(String[] args) {
//读取总的配置文件
Configuration configuration = new Configuration().configure();
//创建sessionFactory
SessionFactory sessionFactory = configuration.buildSessionFactory();
//得到session
Session session = sessionFactory.openSession();
//开启事务
Transaction transaction = session.beginTransaction();
//查询出User类所对应的表中的主键值为1的整行数据,并且将其所有字段的值一 一对应的赋值给User类中的属性
User user = (User) session.load(User.class, 1);
//提交事务
transaction.commit();
//关闭session
session.close();
}
load()方法查询过程:
load()先到session缓存(即一级缓存)中去查,然后再去二级缓存中去查,如果都没有则返回一个代理对象(可以把它理解成一个假“”的对象,一个替身。等后面使用这个代理对象进行操作时,才去数据库中查,这就是懒加载的过程。这个对象可以自动转化成实体对象,但当代理对象被调用的时候如果数据库中此数据不存在,就会抛出ObjectNotFoundException
get()方法查询过程:
先到session缓存(即一级缓存)中去查,如果查不到再去二级缓存中去查,如果都没有找到就马上向数据库发送查询的请求(sql语句)
get 和 load 的区别:
1) 如果查询不到相对应的数据,get 返回的是一个空对象,即 null。load 则报ObjectNotFoundException
2) 使用get去查询数据会立即向数据库发送查询请求(即查询的sql语句)。如果使用load 方法,则属于懒加载。它才先后去一级缓存和二级缓存中去查找,如果这里面都没有,则返回一个代理对象,如果下面的代码中没有用到所查询出来的类对象,那么它就不向数据库发送查询请求。直到程序员在下面的代码中使用了查询结果的时候,就真正的向数据库发送出查询的sql语句
3)懒加载就是一种优化,就相当于 : 如果查询的结果你都不用,那我为什么要帮你去查?
如何在使用load方法的时候,不使用懒加载?
在对象关系映射文件中(即.hbm.xml文件)的<class name="" table="">标签中加入一个属性:lazy="false" 即:
<class name="" lazy="false" table=""> <!--lazy这个属性默认的是true-->
何时使用get? 何时使用load??
如果确定数据库中有所要查询的数据,那么就用load,因为这样子的话即不会报ObjectNotFoundException,效率还高。不确定的话就用get