声明,使用JDK8和hibernate5.0.7测试
hibernate 的session 对象,作为连接对象,线程不安全,不能定义成全局对象 【定义到方法内部】,通过session来完成 crud 时候;
session 的 get 和 load 方法区别:
T get(calss ,serializable id)
T load( calss , serializable id )
1、get
(1)立即加载
(2)返回真实对象
(3)查询不存在对象,返回null
2、load
(1)懒加载 ,使用到 对象时候发送sql 语句,并且字段为 id 时候直接输出(不发送sql语句)
(2)使用代理对象,第三方jar获取代理对象
(3)查询一个不存在的对象,抛异常
*TIPs: 测试get 方法,可以看出 get 返回值 为真实对象,并且在执行debug 断点语句时候提交sql 语句 [说明及时加载]; *
当使用 get查询使句酷中不存在的数据时候会返回 null
测试load 方法;
懒加载没测出来,仍旧会在未使用对象时候发送sql语句 ,但是查询数据库中不存在的数据时候会抛异常,可以看到 load 方法使用的第三方代理jar ,获取的返回值是代理对象;
**
懒加载没测出来,难道 IDEA太智能了?
使用 eclipse测试应该能出来吧 ;知道的大神讲一下;
抽取的 session工具类;
/**
* @auther SyntacticSugar
* @data 2018/10/30 0030下午 8:45
* 抽取hibernate 的session 对象
*/
public class SessionFactoryUtils {
private static final SessionFactory SESSION_FACTORY;
private static final Configuration CONFIGURATION;
static {
CONFIGURATION=new Configuration().configure() ;
SESSION_FACTORY=CONFIGURATION.buildSessionFactory();
}
//获取session对象
public static Session getSession() {
return SESSION_FACTORY.openSession();
}
}
测试类如下进行对比测试get 和load 的区别:
import com.baidu.bean.Customer;
import com.baidu.utils.SessionFactoryUtils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
/**
* @auther SyntacticSugar
* @data 2018/10/30 0030下午 6:21
*/
public class HibernateTest {
@Test
public void test01() {
/** 配置是hibernate中的 org.hibernate.cfg.Configuration
* 加载配置文件
* 创建sessionFactory
* 创建session 会话对象
*/
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
//开启事务
Transaction transaction = session.beginTransaction();
Customer customer = new Customer();
customer.setCust_name("打豆豆");
session.save(customer);//忘记保存了
//提交事务,关闭会话
transaction.commit();
session.clear();
}
/**
* 使用 get 方法来查询
* (1)采用立即加载
* (2)返回真实对象
* (3)找不到的对象 返回null
*/
@Test
public void test02() {
Session session = SessionFactoryUtils.getSession();
// 开启事务
Transaction transaction = session.beginTransaction();
Customer customer = session.get(Customer.class, 1L);
System.out.println(customer);
//
transaction.commit();
session.close();
}
/**
* 使用 load 方法来查询
* (1)采用 懒加载 ,执行这行代码时候不会发送 sql ,真正使用这个对象时候发送
* 使用id 时候不会发sql , 当打印name 等其他filed时候才会发送sql
* (2)返回的代理对象,使用第三方jar获取代理对象
* (3)找不到的对象 抛异常
*/
@Test
public void test03() {
Session session = SessionFactoryUtils.getSession();
// 开启事务
Transaction transaction = session.beginTransaction();
Customer customer = session.load(Customer.class, 1L);
System.out.println(customer.getCust_id());
//
transaction.commit();
session.close();
}
}
测试 在 主键 id 时候,load 的懒加载特性体现出来了:
load 直接打印 1 ,sql 没有发送,get 发送了sql 语句;
get 如下: