Hibernate学习笔记 -- day10 OID、对象导航查询、原生SQL

一、OID查询

1、什么是OID查询

所谓实体查询即OID查询,就是使用主键作为条件来查询一个实体。其中涉及的方法是Session对象get方法和load方法。

2、get方法:

/**
	 * 根据id查询一个实体
	 * @param entityType 指的是要查询的实体类字节码对象
	 * @param id 查询的条件,即主键的值。
	 * @return 返回的是实体类对象
	 */
	<T> T get(Class<T> entityType, Serializable id);

3、load方法:

	/**
	 * 根据id查询一个实体
	 * @param theClass 指的是要查询的实体类字节码
	 * @param id查询的条件,即主键的值。
	 * @return 返回的是实体类对象或者是实体类对象的代理对象
	 */
	<T> T load(Class<T> theClass, Serializable id);

4、get 和 load 方法的区别

(1)、查询时机不一样

        get方法任何时候都是立即加载,即只要一调用get马上发起数据库查询

        load方法默认情况下是延迟加载,即真正用到对象的非OID字段数据才发起查询

        load方法可以通过配置的方式改为立即加载

	由于load方法是hibernate的方法所以只有XML的方式:
	<class name="Customer" table="cst_customer" lazy="false">	

(2)、返回的结果不一样

        get方法永远返回查询的实体类对象。

        load方法当是延迟加载时,返回的是实体类的代理对象。

(3)、代码演示

/**
 * 根据id查询一个实体
 * 
 * 涉及的方法:
 * 	  get(Class clazz,Serailizable id);
 * 	 load(Class clazz,Serailizable id);
 * 区别:
 *  1、加载的时机不一样
 * 	 		get方法永远是立即加载。
 *  		load方法默认是延迟加载。
 *  				立即加载:不管用不用,只要一调用方法,马上发起查询。
 *  				延迟加载:什么时候用,什么时候再发起查询。也叫懒加载(惰性加载)
 *  		load方法可以通过配置的方式改为立即加载。
 *  2、返回的结果不一样
 *  		get返回的实体类对象
 *  		load返回的是实体类对象的代理对象,当我们真正要获取数据时,它会对我们的方法进行增强,去查询。
 *
 */
public class HibernateDemo1 {
	/**
	 * get
	 */
	@Test
	public void test1(){
		Session s = HibernateUtil.getCurrentSession();
		Transaction tx = s.beginTransaction();
		Customer c = s.get(Customer.class, 1L);//就立即发起查询,不管用不用
		System.out.println(c.getCustId());
		System.out.println(c.toString());
		tx.commit();
	}
	
	/**
	 * load
	 */
	@Test
	public void test2(){
		Session s = HibernateUtil.getCurrentSession();
		Transaction tx = s.beginTransaction();
		Customer c = s.load(Customer.class, 1L);//不会马上发起查询,什么时候用什么时候发起查询
		System.out.println(c.getCustId());
		System.out.println(c.toString());
		tx.commit();
	}
}

5、涉及的概念

        类级别检索策略。检索策略也称为抓取策略。其实就是查询策略。

        简单的说就是我们查询一个实体时,发起查询的时机在什么时候。

        立即加载:是不管用不用马上查询。

        延迟加载:等到用的时候才真正发起查询。

二、对象导航图查询

1、什么是对象导航图查询

使用的都是实体类中的方法。

2、明确:

对象导航查询需要思想的转变。

3、要求:

两个实体必须具有关联关系,没有关联关系的不能用。

4、含义:

实体:

        get关联对象的实体

例如:

        customer.getLinkMans()

        linkman.getCustomer()

5、演示案例

	/**在使用ORM持久层框架思想没有转变之前:
	 * 			查询我的联系人
	 * 			根据客户ID查询联系人信息
	 */
	@Test
	public void test2(){
		Session s = HibernateUtil.getCurrentSession();
		Transaction tx = s.beginTransaction();
		SQLQuery sqlquery = s.createSQLQuery("select * from cst_linkman where lkm_cust_id = ? ");
		sqlquery.setLong(0, 1L);
		sqlquery.addEntity(LinkMan.class);//把查询结果封装到联系人的实体类中
		List list = sqlquery.list();

		for(Object o : list){
			System.out.println(o);
		}
		
		tx.commit();
	}
	
	/**在使用ORM持久层框架思想没有转变之后:
	 * 	明确:任何一个实体,它都会有findById的方法。
	 */
	@Test
	public void test1(){
		Session s = HibernateUtil.getCurrentSession();
		Transaction tx = s.beginTransaction();
		Customer c = s.get(Customer.class,1L);
		System.out.println(c);
		System.out.println(c.getLinkmans());
		tx.commit();
	}
	
	/**
	 * 对象导航查询
	 */
	@Test
	public void test3(){
		Session s = HibernateUtil.getCurrentSession();
		Transaction tx = s.beginTransaction();
		LinkMan l = s.get(LinkMan.class,1L);
		System.out.println(l);
		System.out.println(l.getCustomer());
		tx.commit();
	}

三、原生SQL语句查询

1、什么是SQL查询

使用原始的SQL语句来查询

2、涉及的对象:

第一种方式:session的doWork方法可以使用Connection

第二种方式:SQLQuery对象。它的获取方式是session.createSQLQuery(String sql);

在hibernate中用的不多。

3、案例演示

@Test
	public void test2(){
		Session s = HibernateUtil.getCurrentSession();
		Transaction tx = s.beginTransaction();
		SQLQuery sqlquery = s.createSQLQuery("select * from cst_linkman where lkm_cust_id = ? ");
		sqlquery.setLong(0, 1L);
		sqlquery.addEntity(LinkMan.class);//把查询结果封装到联系人的实体类中
		List list = sqlquery.list();

		for(Object o : list){
			System.out.println(o);
		}
		
		tx.commit();
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值