Hibernate(6)------延迟加载,联合主键


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();

































你可能感兴趣的:(hibernate)