更多Hibernate在框架开发
1 单表查询
1.1 QID检索与查询中的效率优化
OID检索方式是Session对象的get()方法和load()方法 。都是根据id查询返回实体类对象。 其中get()是立即查询,load()是延迟查询 。
1.1.1 get()与立即查询
Depart dept = session.get(Depart.class, 1); //发送sql语句
System.out.println(dept.getDepName());
立即查询: 调用方法后立即发送sql语句进行查询操作,返回实体类对象
代码中,调用get()方法后,立即发送sql语句,查询id=1的记录,返回Depart实体类的对象。
1.1.2 load()与延迟查询
Depart dept = session.load(Depart.class, 2); //没有发送sql语句
System.out.println(dept.getDepId()); //没有发送sql语句
System.out.println(dept.getDepName()) //发送sql语句
延迟查询: 调用方法后不会发送sql语句,只是返回一个实体类的代理对象,此代理对象是一个空壳,只有实体类的id属性,当用到其他属性时才发送sql语句。也叫懒加载或懒查询
代码中,调用load()方法后,不发送sql语句,返回Depart实体类的代理对象,该代理对象只有id属性,当使用name属性时,才发送sql语句。
load()方法默认是延迟查询,可以通过配置修改成立即查询,配置为: 在查询实体类的映射配置文件的<class>
标签中添加属性lazy=false
。
提醒 : 延迟查询因为其代理对象空壳的性质,极大的节约了内存空间,提高了查询效率,所以能用延迟查询就不要用立即查询
1.2 HQL检索
HQL检索是hibernate提供的一种常用的检索方法。需要使用org.hibernate.Query
。需要使用hql语言,其与sql语言的不同在于 实体类名和属性名代替了表名和字段名,且可以省略select关键字,但*不再可用。
/**
* 查询所有记录
* from User //查询所有,可以省略select,但不能用*代替所有
* select u from User u //别名
* from User order by userid // 排序查询
*/
Query query = session.createQuery("select u from User u");
List<User> list = query.list();
for(User user : list){
System.out.println(user.getUsername());
}
/**
* 条件查询
* 两种方式,索引方式中是从0开始的
*/
/*Query quer