Java(hibernate框架)

目录

一.hibernate入门

二.hibernate的持久化类

三.hibernate的一级缓存

四.hibernate的批量查询(HQL查询,QBC查询)

五.hibernate的一对多关系映射

六.hibernate的多对多关系映射

七.JPA的入门

八.JPA的操作


一.hibernate入门

1.将hibernate和项目集成(环境搭建):

  •             hibernate-release-5.0.7.Final\lib\required\*  所有包
  •             hibernate-release-5.0.7.Final\lib\optional\c3p0\* 所有包
  •             hibernate在运行的过程中会加载一个日志包  
  •                                企业开发用的日志包:  apacha-log4j.jar

ps:     required下面的所有包:9个
            c3p0下面的所有包:3个
            apache提供的日志包:3个
            要连接的数据库驱动包(mysql) 1个

            hibernate的环境搭建:16个

2.映射配置文件

  •                  文件的名称可以是任意值:建议起名叫: 类名.hbm.xml (由自己加载)
  •                  在类名.hbm.xml做3步:
  •                   1 做类名和表名的映射
  •                   2 做主键和属性的映射 ,让主键自增(来保证唯一)
  •                   3 做其它属性和其它字段的映射

class标签:建立类和表的映射

  •    name       :类的全路径
  •    table        :数据库中表的名称。
  •    catalog    :数据库名称(可以省略)

id标签:建立主键和类中属性映射

  •    name       :类中的属性的名称
  •    column    :表中的字段名称。(如果类中的属性名和表中的字段名一致,column可以省略)

property标签:建立普通字段与类中属性映射

  •    name       :类中的属性的名称
  •    column    :表中的字段名称。(如果类中的属性名和表中的字段名一致,column可以省略)
  •    length      :字段的长度(自动创建表)
  •    not-null   :非空(自动创建表)
  •    unique     :唯一(自动创建表)

3.核心配置信息(xml) hibernate.cfg.xml

  •        要求: 在src下面 有一个名叫:hibernate.cfg.xml文件 (由程序自动加载)
  •                  所有的数据库连接信息都在:hibernate-release-5.0.7.Final\project\etc\hibernate.properties
  •     
  •                   数据库的驱动
  •                   数据库的地址
  •                    数据库的用户名
  •                    数据库的密码
  •            c3p0的配置
  •                    控制显示sql语句
  •                    让sql语句格式化
  •                    让hibernate根据映射内容创建数据库的表

ps:XML的提示问题,约束文件可以在本地去配置,不需要去网上加载。

4.API入门

  •      save()
  •      get()或load() 只能进行主键查询

        get和load的区别:get会直接查询出来数据,load会在需要数据的时候才会进行查询数据。

  •      update()

ps:先查再该

  •      delete()

ps:先查再删

二.hibernate的持久化类

1.hibernate对持久化类的要求规范:

  •             1 需要提供一个无参的构造方法   hibernate是通过无参构造器来实例化对象的
  •             2 所有属性都要私有化  
  •             3 需要对外提供set/get方法
  •             4 基本类型(int)和包装类型(integer),建议全部包装类型
  •             5 持久化类不能被final修饰  hibernate的优化手段就失效 延迟加载就会失效变成立即加载
  •                     load查询返回的是代理对象;而这个代理对象是持久化类的子类。
  •             
  •             6 持久化类必须要有标识属性(OID属性)  
  •                   标识属性(OID属性):就是与表主键创建了关系的属性 我们就可以把该属性称为标识属性或则oid属性

2.标识属性(oid属性)的作用在哪里?  

    标识属性: Object Identifie  简称OID属性

    作用: 可以让hibernate来区分多个对象是否是同一个对象

  •           jvm: 是根据内存地址,如果内存地址相同 多个对象它会认为是同一个
  •          数据库: 是根据主键,如果主键相同 多个对象它会认为是同一个
  •          hibernate:是根据oid,如果oid相同 多个对象它会认为是同一个

ps:判断是否为同一个对象的凭据不同。

ps:主键的引进,解决了一范式存在的问题(非主属性对主属性的不完全依赖),根据主键可以完全判断出每条数据。

3.主键的生成策略:

ps: 以后如果针对是数值型,选择用native 如果是varchar类型,可以选择用uuid 。

4.持久化类的三种状态 

  •  瞬时态: 当前持久化类 没有oid属性 没有被session操作管理

ps:Customer customer = new Customer(); // oid属性没有值  session没有管理
ps:customer.setCust_name("abcd"); 

  •  持久态: 当前持久化类 有oid属性 有被session操作管理

ps:session.save(customer); // oid属性被生成策略(uuid)设置了 而且也被session管理
ps:tx.commit();
ps:session.close();

  •  脱管态(离线态)当前持久化类 有oid属性 没有被session操作管理

ps:System.out.println(customer.getCust_id()); //有oid属性值  没有被session操作管理

三.hibernate的一级缓存

持久态的特点:

  • 如果持久态对象修改完属性,不需要执行更新操作,也会自动更新数据库数据。

1.为什么持久化类的持久态对象 在修改完了属性之后,不需要update也能自动更新到数据库?

原因:

  • 一级缓存的存在。一级缓存 存储区 放一份,快照区 备份一份。
  • session.get(Customer.class,"abcdefg"); // 去数据库查询,查完了之后放在一级缓存中
  • ct.setCust_name("rose1234");   // 去一级缓存中的存储区修改了内容,但是快照区不修改
  • tx.commit();      // 去一级缓存中,将存储区和快照区的数据都拿出来对比。

ps:一致: 什么都不做。不一致: 自动发送update语句做数据的数据更新

2.一级缓存

一级缓存:

  • 称为Session级别的缓存。因为一级缓存的生命周期与session一致的。自带的,不可卸载的。

ps:任何语句都会先到缓存中查找,如果缓存没有,再去数据库里查找,之后并且在缓存中放入数据。

二级缓存:

  • 称为SessionFactory级别的缓存。需要进行配置的缓存的插件。默认不开启的。

ps:我们一般使用redis二级缓存。

3.关闭缓存的方法:

  • session.close() session关闭 以及缓存也销毁
  • session.clear() clear可以清空一级缓存的所有数据 、
  • session.evict()   可以清空一级缓存的某一个对象的数据

四.hibernate的批量查询(HQL查询,QBC查询)

OID查询方式:

  • 根据主键查询一条对象的数据

Query方式 :

  • 如果是使用这种方式做查询,又被称作为HQL查询。查的是对象和属性

ps:与SQL语言语法很相似的一个语言。面向对象。

Criteria方式 :

  • 完全的面向对象查询,又被称作为QBC查询。
  • 不面向SQL语句了,全部调用API来实现。

对象导航查询:

  • 在查询本对象的同时,可以把关联对象也查询出来
  • 所有的查询方式都默认包含对象导航查询
  • 而且是延迟查询,lazy默认为true,可以设置为false。

ps:更加面向对象化查询语言。

ps:Hibernate中设置与当前线程绑定的session的使用。

五.hibernate的一对多关系映射

1.如何让实体类之间明白它们之间的关系?

如果是1对多的关系?

  • 需要在一的一方有多的一方的集合,在customer类中有linkMan的集合
  • 需要在多的一方有一的一方的对象,在LinkMan类中有Customer类的对象

如果是一对一?

  • 在夫类中有妻类的对象
  • 在妻类中有夫类的对象
  • 在双方中都以对方的对象

2.hibernate的一对多关系建立?

在多的一方(Linkman)

name: 自己里面一的一方对象的属性名 :customer	
class: 一的一方的全限定名
column: 指定外键名

在一的一方(Customer)

	
	

set:配置集合
name:自己里面多的一方的集合属性名 linkmans
column: 指定外键名
class: 多的一方的全限定名
  • 让一的一方放弃外键的维护权 (customer)   在一的一方设定标签 :inverse="true" ,放弃外键的维护权。

级联:在操作自己数据的时候,会把自己关联的数据也给操作了

  • cascade:save-update     级联保存  保存谁就在谁身上设置,delete   级联删除  删除谁就在谁身上设置
  • 一般是让一的一方设置级联保存。

六.hibernate的多对多关系映射

1.如何让实体类之间明白它们之间的关系?

如果是多对多?

  • 在user类中有role类的集合
  • 在role类中有User类的集合
  • 在双方中都有对方的集合

2.hibernate的多对多关系建立?

格式一样:

	
	
	
	



		
		

  • 级联保存操作(基本不会用),级联删除操作(不会用-避免去使用)
  • 正常的(保存,删除)操作即可满足需求。

七.JPA的入门

1.JPA的概念

  • JPA是通过注解的方式来描述 对象和表的映射关系

2.JPA环境的搭建

  • 需要导入1个JPA的包。

数据库的映射配置文件:

类上:
@Entity // 当前类是持久化类
@Table(name="表名") //当前持久化类和哪个表做映射

属性:
@Id //当前的属性是oid属性
@Column(name="主键名")// 和表的哪个字段做映射
@GeneratedValue(strategy=GenerationType.IDENTITY) //指定oid的增长策略
@Column(name="字段名") // 其它属性和表中的字段映射
  • 通过注解直接替代xxx.hbm.xml

数据库核心文件:

  •          1 在src下面 有一个META-INF的文件夹
  •          2 在这个文件夹下面 有一个persistence.xml的文件
  •                  约束:hibernate-entitymanager-5.0.7.Final.jar/org.hibernate.jpa/persistence_2_0.xsd/24行到26行
  •          3 所有的数据库信息配置都在这个文件中来配置

八.JPA的操作

1.单表的映射

  •     @Entity  实体类
  •     @Table(name="cst_customer")  与表的映射
  •     @Id   指定OID属性
  •     @Column(name="cust_id") 指定映射的字段
  •     @GeneratedValue(strategy=GenerationType.IDENTITY)  指定主键的生成策略

2.一对多

  •     一: @OneToMany(targetEntity=LinkMan.class,mappedBy="customer")
  •     多: @ManyToOne(targetEntity=LinkMan.class)
  •         一对多的关系配置:
  •             @JoinColumn(name="lkm_cust_id",referencedColumnName="cust_id")

3.多对多

  •     多(被动): @ManyToMany(targetEntity=User.class,mappedBy="roles")
  •     多(主动): @ManyToMany(targetEntity=Role.class)
  •          多对多的关系配置:
  •             @JoinTable(name="中间表的名称",joinColumns="自己在中间表的配置(数组)"
  •             inverseJoinColumns="对方在中间表的配置(数组)")

4.级联

  •     cascade=CascadeType.ALL  做级联保存以及级联删除
  •     cascade=CascadeType.PERSIST 只做级联保存
  •     cascade=CascadeType.REMOVE 只做级联删除

5.crud

  • persist()----保存
  • find()  : 立即加载,getReference():延迟加载-----单条数据的oid查询
  • merge()---修改
  • remove()---删除

6.批量查询

  • 类似之前的query方式

你可能感兴趣的:(java)