Hibernate学习

  Hibernate
它是一个ORM框架
O--object R--references M--mapping
对象 关系 映射
操作表即操作对象

三层
MVC层、业务逻辑层、数据持久层
ORM框架 处理数据库的操作 持久层的框架

Hibernate框架的搭建
3.6版本的 hibernate3.jar lib/required/* lib/jpa/*
4.0版本的 lib/required/*
5.0版本的 lib/required/*

org.hibernate
hibernate-core
5.0.10.Final

新建一个核心配置 hibernate和struts2
struts2配置的文件名固定称为struts.xml
hibernate的配置文件可以自定义名称 默认名称hibernate.cfg.xml
如果不会写核心配置文件 hibernate/project/etc/ 找我们配置文件的母版
需要在hibernate.cfg.xml中配置数据库的连接信息

#hibernate.dialect org.hibernate.dialect.MySQLDialect 方言
#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
#hibernate.connection.driver_class com.mysql.jdbc.Driver
数据库驱动类
#hibernate.connection.url jdbc:mysql:///test
数据库连接URL
#hibernate.connection.username gavin
用户名
#hibernate.connection.password
密码
show engines 查看当前的数据库引擎
MySQL的安装目录 mysql.ini 文件 属性 = 值(注意格式,等号前后都有空格键)
default-storage-engine = INNODB

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
" ">http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">


true
org.hibernate.dialect.MySQLDialect
com.mysql.jdbc.Driver
jdbc:mysql:///test
root
123456








测试数据库连接是否为空?
Configuration cfg=new Configuration();
cfg.configure();
SessionFactory sf=cfg.buildSessionFactory();
Session s = sf.openSesssion();

三大范式:
1、数据表的字段不能有重复
2、每一个数据表必须有一个主键
3、必须完全依赖,不能部分依赖 如果存在部分依赖 则创建一个新表 通过主外键关联维护关系

持久化的操作 针对数据库的CRUD操作
前提是 项目中 必须有和数据表对应的实体类
学习常见的数据库持久化的注解
@Entry 标识在类上 做映射关系
@Table(name="") ORALCE MYSQL
@Id 标识主键 每一个表中必须有主键
@Basic 默认 标识在非主键的字段上 一般不用写 非主键的字段 默认就是Basic
@Column(name="leav",notnull=false,uniqueable=true...)
private String leave
@Transisent 表示持久化 不维护
@Lob 二进制的数据类型
@Temporal 时间 3种类型
Temporal.Time 时间
Temporal.Data 日期
Temporal.TimeSpace 时间日期

主键生成策略
JPA的规范
GenerationType.AUTO
GenerationType.IDENTIFIED MYSQL MSSQL
GenerationType.SEQUENCE ORACLE
@GeneratorValue(generator="",strategy = GenerationType.TABLE)

@GenerationType.SEQUENCE ORACLE 需要配合
@GeneratorValue(generator="seq",strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name = "seq", sequenceName = "序列的名称",allocationSize =1)

在数据库中生成一张表 专门来维护主键
@GeneratorValue(generator="tab",strategy = GenerationType.TABLE)
@TableGenerator(name = "tab",
table = "pk_table",
pkColumnName = "pk",
valueColumnName = "pk_value",
initialValue = 1,
allocationSize = 1)

Hibernate的自定义规范
@GeneratorValue(generator="uuid")
@GenericGenerator(name="uuid",strategy="hibernate的生成策略")

字符串类型 uuid uuid2 uuid.hex guid
数字类型 自增长类型 identity incerment
序列类型 sequence
自定义类型 assigned 自己指定主键
其他类型
高低位算法 seqHilo
[sequence-identity] -> [org.hibernate.id.SequenceIdentityGenerator]
[enhanced-sequence] -> [org.hibernate.id.enhanced.SequenceStyleGenerator]
[foreign] -> [org.hibernate.id.ForeignGenerator]
[select] -> [org.hibernate.id.SelectGenerator]



持久化的操作 增C 删D 查R 改U
#解析我们核心配置文件
Configuration cfg= new Configuration();
cfg.configure();
#创建session工厂
SessionFactory sf = cfg.buildSessionFactory();
#创建session
Session s = sf.openSession();
#开启事务
s.beginTransaction();
#持久化操作
增删查改
#提交事务
s.getTransaction().commit();
#关闭session
s.close();
#关闭session工厂
sf.close();

数据持久的方法
s.save() 保存
s.uodate() 修改
s.delete(对象) 该对象必须要主键 删除
s.get(Class,"id"); 获取单个
HQL语言的规范 用类名代替表名 用属性名来代替字段名 不允许用*号 *用别名代替
当查询所有的时候 select s 可以省略
select S.列 from 类 s 数组的集合
Query query = s.createQuery(HQL);
query.setFirstResult(0);
query.setMaxResult(10); 不会变化


集合映射 用来处理一对多的情况 电子商城
1、集合映射类有3种
List @Orderby

Set

Map @MapKeyColumn("map的key的字段名")

1、基本数据类型的映射
@ElementCollection(type=基本数据类型)
@CollectionTable(name="你要生成的表名")
2、复合数据类型
@ElementCollection(type=标注了@embeddable注解类)
@CollectionTable(name="你要生成的表名")


hibernate里有2种类
@Entry 实体类 必须配置在 hibernate.cfg.xml
mapping class=""
@embeddable嵌入式类规范
1、实现序列化接口

2、重写hashcode和equals方法


  Hibernate 中对象的3种状态
瞬态 持久态 游离态
(数据库的数据存在文件系统中)

new、查询的对象都是瞬态
commit只对持久化状态对象做操作
commit之后的操作都为游离态  

你可能感兴趣的:(Hibernate)