Hibernate(6)
1、查询
2、lazy -----延迟加载
3、联合主键
------------------------------------------------
在Hibernate一共有两种查询方式:
1、Query接口 (主要支持语句查询,可以写HQL语句也可以写SQL语句)
2、Criteria接口 (它完全面向对象查询,不支持语句)
----------------------------------------------------------------------
Example exam = Example.create(f).enableLike(MatchMode.ANYWHERE);//它用于封装查询条件
c.add(exam);
f:为传递进来的对象,对象中有几个属性有值,系统就会把这几个值当条件来查询
enableLike(MatchMode.ANYWHERE);启用模糊匹配,字符串类型的数据,都会进行模糊匹配
Example这种查询方式,会自动忽略掉主键值
-----------------------------------------------------------
c.add(exam); 此代码,用于将example对象做为查询条件,添加到Criteria查询接口中
-------------------------------------------------------------------------
全局变量不赋值,系统都会指定默认值,局部变量必须指定值才可以使用
所有引用类型的全局变量,如果没有赋值,默认值都是 null
Integer,Long,Short,Boolean,......Double,Float,String, 对象,数组
------------------------------------------
int,short,long,byte,char,float,double,boolean (除了这些类型,其他类型均为引用类型)
Service:负责业务处理,包括查询条件的封装
Dao:负责与数据库交互,不做业务处理,Service给Dao什么样的数据,dao就直接把这些数据更新数据库中
----------------------------------------------------------------------------------
Session:它是数据库连接对象,它负责操作数据库,由于在程序的层次结构中,只有Dao类能够与数据库交互,所以,session也只应该出现在Dao层中
DetachedCriteria: (只能组装查询条件,但是不能查询) 它的创建不需要session
在Service这一层创建该对象,然后组装各种查询条件,然后把它传递到Dao层,利用Dao层中的session进行查询
-------------------------
Hibernate按照主键查询的方式为:
Info f = (Info)ses.get(Info.class,主键值);
Info f = (Info)ses.load(Info.class,主键值);
session的get方法与load方法都会按照主键查询
区别:
get方式查询数据的时候,只要一调用ses的get方法按主键查询,系统马上就会到数据库与数据库交互,得到数据,并且把值赋值对象中的属性
load方法查询数据的时候,如果只是调用ses的load方法,系统并不会查询数据库,它只会把查询的条件(主键值)赋值对象的主键字段------
只要当我们调用Info的getName(),getScore()这些方法的时候,系统才会真正的到数据查询,这时候,如果session已经被关闭,它就不能与数据库建立连接,也就不能查询
get一调用就马上会查询数据库
load调用,并不会马上查询数据库,只有需要用到对象的属性值的时候,系统这个时候才会去数据库
Inf f =(Inf) ses.get(Inf.class,1L);
ses.delete(f);
f:
id 1
name jack
age 23
然后删除对象
-------------------------------------------------------------
Inf f =(Inf) ses.load(Inf.class,1L);
ses.delete(f);
f:
id 1
name
age
city表:
cid
cname
pid---所属省份编号
----------------------------------------------
City类
cid (加载)
cname (加载)
Province province; (由于是关联映射以后,产生的属性,所以第一次的时候并不加载)
Hibernate查询的时候,只会加载数据表中本身就有的属性,如果是通过关联映射产生的属性,在初次加载时,这些关联的属性,并不会加载
只有在当我们要调用关联的属性的方法时候,系统才会再一次查询数据库,此时,如果session在第一次查询的时候,应该已经关闭,第二次查询,就会没有session
表中本身有的属性,第一次就查询出来,如果是通过关联映射产生的属性,第一次不加载,用的时候,才再次查询数据库,这种方式,称为:
延迟加载 (懒人加载)
此时,如果session被关闭,第二次查询就无法进行下去
不管是本表中有的属性,还是通过关联产生的属性,第一次查询的时候,都加载出来,这种方式:称为:
即时加载
多对一的即时加载
即时加载
延迟加载
--------------------------------------------------------------------------------------------
province表:
pid
pname
-----------------------------
Provicne类
pid
pname
Set cities = new HashSet();
Hibernate第六章
1、查询
2、lazy -----延迟加载
3、联合主键
------------------------------------------------
在Hibernate一共有两种查询方式:
1、Query接口 (主要支持语句查询,可以写HQL语句也可以写SQL语句)
2、Criteria接口 (它完全面向对象查询,不支持语句)
----------------------------------------------------------------------
Example exam = Example.create(f).enableLike(MatchMode.ANYWHERE);//它用于封装查询条件
c.add(exam);
f:为传递进来的对象,对象中有几个属性有值,系统就会把这几个值当条件来查询
enableLike(MatchMode.ANYWHERE);启用模糊匹配,字符串类型的数据,都会进行模糊匹配
Example这种查询方式,会自动忽略掉主键值
-----------------------------------------------------------
c.add(exam); 此代码,用于将example对象做为查询条件,添加到Criteria查询接口中
-------------------------------------------------------------------------
全局变量不赋值,系统都会指定默认值,局部变量必须指定值才可以使用
所有引用类型的全局变量,如果没有赋值,默认值都是 null
Integer,Long,Short,Boolean,......Double,Float,String, 对象,数组
------------------------------------------
int,short,long,byte,char,float,double,boolean (除了这些类型,其他类型均为引用类型)
Service:负责业务处理,包括查询条件的封装
Dao:负责与数据库交互,不做业务处理,Service给Dao什么样的数据,dao就直接把这些数据更新数据库中
----------------------------------------------------------------------------------
Session:它是数据库连接对象,它负责操作数据库,由于在程序的层次结构中,只有Dao类能够与数据库交互,所以,session也只应该出现在Dao层中
DetachedCriteria: (只能组装查询条件,但是不能查询) 它的创建不需要session
在Service这一层创建该对象,然后组装各种查询条件,然后把它传递到Dao层,利用Dao层中的session进行查询
-------------------------
Hibernate按照主键查询的方式为:
Info f = (Info)ses.get(Info.class,主键值);
Info f = (Info)ses.load(Info.class,主键值);
session的get方法与load方法都会按照主键查询
区别:
get方式查询数据的时候,只要一调用ses的get方法按主键查询,系统马上就会到数据库与数据库交互,得到数据,并且把值赋值对象中的属性
load方法查询数据的时候,如果只是调用ses的load方法,系统并不会查询数据库,它只会把查询的条件(主键值)赋值对象的主键字段------
只要当我们调用Info的getName(),getScore()这些方法的时候,系统才会真正的到数据查询,这时候,如果session已经被关闭,它就不能与数据库建立连接,也就不能查询
get一调用就马上会查询数据库
load调用,并不会马上查询数据库,只有需要用到对象的属性值的时候,系统这个时候才会去数据库
Inf f =(Inf) ses.get(Inf.class,1L);
ses.delete(f);
f:
id 1
name jack
age 23
然后删除对象
-------------------------------------------------------------
Inf f =(Inf) ses.load(Inf.class,1L);
ses.delete(f);
f:
id 1
name
age
city表:
cid
cname
pid---所属省份编号
----------------------------------------------
City类
cid (加载)
cname (加载)
Province province; (由于是关联映射以后,产生的属性,所以第一次的时候并不加载)
Hibernate查询的时候,只会加载数据表中本身就有的属性,如果是通过关联映射产生的属性,在初次加载时,这些关联的属性,并不会加载
只有在当我们要调用关联的属性的方法时候,系统才会再一次查询数据库,此时,如果session在第一次查询的时候,应该已经关闭,第二次查询,就会没有session
表中本身有的属性,第一次就查询出来,如果是通过关联映射产生的属性,第一次不加载,用的时候,才再次查询数据库,这种方式,称为:
延迟加载 (懒人加载)
此时,如果session被关闭,第二次查询就无法进行下去
不管是本表中有的属性,还是通过关联产生的属性,第一次查询的时候,都加载出来,这种方式:称为:
即时加载
多对一的即时加载
即时加载
延迟加载
--------------------------------------------------------------------------------------------
province表:
pid
pname
-----------------------------
Provicne类
pid
pname
Set cities = new HashSet();