ORM框架 Object References Mapping 操作对象即操作表
三层 MVC层/表示层/视图层 业务逻辑层 数据持久层Hibernate DButils MyBatis
---------------------------------------------------------------------
1.新建Maven的项目
pom.xml文件
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.1.0.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
-----------------------
----------------------------------------------
2.编写核心配置文件 默认名称 hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://10.10.44.12:3306/salary</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
</sessionFactory>
</hibernate-configuration>
---------------------------------------------------------------------
3.注解的方式为主
@Entry@Table(name="")
@Id
@Basic
@Column 标识属性和字段的特殊需求 name
@Temporal 三个选项 Temporal.DATE Temporal.TIME Temporal.TIMESPACE
@Lob 二进制数据 属性数据类型一定要是byte[]
@Transient 不维护
---------------------------------------------------------------------
4.根据类去创建表 配置属性 4个选项(关键字)
<property name="hbm2ddl.auto">update</property>create 有且只有一条数据 因为它每一次都会创建一张新表
create-drop 曾今存在过 创建表 做持久化操作 删除表
update 1.如果发现没有表 创建表 2.如果发现没有该字段 添加该字段
PS 不给给你删表/删字段
validate 检查当前的类和表是否一致 一致才会去做持久化操作 否则抛异常
---------------------------------------------------------------------
5.基础代码
//1.解析核心配置文件
Configuration cfg=new Configuration();
cfg.configure(); //建表
//2.创建session工厂
SessionFactory sf=cfg.buildSessionFactory();
//3.打开一个session
Session s=sf.openSession();
//4.开启事务
s.beginTransction();
//5.持久化操作(增删查改)
//6.提交事务
s.getTransaction().commit();
//7.关闭session
s.close();
//8.关闭sessionFactory
sf.close();
---------------------------------------------------------------------
6.主键的生成策略2种大方式
1.JPA的规范 AUTO TABLE SEQUENCE IDENTIFY
@GeneratedValue(strategy=GenerationType.AUTO)AUTO 根据当前的数据表自动选择 MYSQL MSSQL 自增长
ORACLE hibernate_sequence的序列
TABLE 单独做一张表去存放所有的表的主键=enhanced-table
SEQUENCE ORACLE 一张表对应一个序列
IDENTIFY 只有支持自增长的数据库才能使用 MYSQL MSSQL
2.Hibernate内置
配置一起用@GeneratedValue(generator = "uuid")
@GenericGenerator(name="uuid",strategy = "uuid")strategy表示主键生成的方式
1.assigned 自定义 手动给主键 Hibernate不管
2.UUID体系:uuid uuid2 guid uuid.hex 计算方式 网卡的MAC地址+当前的时间的毫秒数+随机数
3.自增长体系 increment(hibernate来生成的) identity(依赖于数据库本身)
4.序列体系 Oracle专用
Sequence---------------------------------------------------------------------
seqhilo
sequence-identity
enhanced-sequence
7.集合映射 场合 一对多
1.集合类型来分
List@ElementCollection(targetEntity=String.Class)
@CollectionTable(name="t_names")
@Orderby
@OrderColumn(name="orderindex")
private List<String> names;
Set
@ElementCollection(targetEntity=String.Class)
@CollectionTable(name="t_names")
private Set<String> names;
Map
@ElementCollection(targetEntity=String.Class)
@CollectionTable(name="t_names")
@MapKeyProperty(name="key")
private Map<String,String> names;
---------------------------------------------------------------------
2.数据类型来分
基本数据类型@ElementCollection(targetEntity=基本数据类型)
嵌入式数据类型 要求: 1.实现序列化接口
@ElementCollection(targetEntity=嵌入式数据类型)2.重写hashCode和equals方法
3.加@Embeddable
---------------------------------------------------------------------
3.联合主键
1.联合主键也是一个嵌入式的类 @Embeddable2.要在你想要做联合主键的类上引入这个类 加上 @EmbeddedId
------------------------------------------------------------------------
举个栗子昂
关系映射
为什么要有关系映射?水果超市
一对一 : 用户----购物车
一对多 : 商品分类---->商品
用户---->地址
用户---->订单多对多 : 订单<---->商品
商品---->评论
购物车<---->商品------------------------------------------------------------------------
1.一对一 平级
@Entry
@Table(name="TUser")
class User
{
private int usid;
}
@Entry
@Table(name="TShopCar")
class Shopcar
{
private int carid;
@OneToOne
@JoinColumn(name="usid",nullable=false,unique=true)
private User user;
}
有关Mappedby的4个原则
1.属性 返回值类型Shopcar里面和外键关联的属性user2.关系 mappedby(放弃维护关系) 只保存数据 不维护关系
Shopcar car=new Shopcar();
User user=new User();
user.setShopcar(car);
3.保存数据 双向关联的时候 如果想要保存数据 必须保存维护关系哪一方
4.除了级联的保存之外 其他的级联关系不受任何影响
-----------------------------------------------------------------
2.双向一对一
@Entry
@Table(name="TUser")
class User
{
private int usid;
@OneToOne(mappedby="user",cascade=Casecade.ALL)
private Shopcar shopcar;
}
@Entry
@Table(name="TShopCar")
class Shopcar
{
private int carid;
@OneToOne(cascade=Casecade.ALL)
@JoinColumn(name="usid",nullable=false,unique=true)
private User user;
}
-------------------------------------------------------------------------
3.一对多 关系建立在一方
class Catalog{
private int cid;
@OneToMany(cascade=Cascade.ALL)
@joinColumn(name="cid") //通知hibernate 给集合中的泛型中的类添加一个外键
private Set<Product> products;
}
class Product{
private int pid;
}
---------------------------------------------------------------------
4.多对一
class Catalog{
private int cid;
}
class Product{
private int pid;
@ManyToOne(cascade=Cascade.ALL)
@joinColumn(name="cid")
private Catalog catalog;
}
-----------------------------------------------------------------------
5.双向一对多 4.2之后 (joinColumn保持一致 主表的主键) 有外键的是子表
class Catalog{
private int cid;
@OneToMany(cascade=Cascade.ALL)
@joinColumn(name="cid")
private Set<Product>product;
}
class Product{
private int pid;
@ManyToOne(cascade=Cascade.ALL)
@joinColumn(name="cid")
private Catalog catalog;
}
---------------------------------------------------------------------
6.双向多对一 3.6的版本就有了
class Catalog{
private int cid;
@OneToMany(mappedby="catalog",cascade=Cascade.ALL)
private Set<Product>product;
}
class Product{
private int pid;
@ManyToOne(cascade=Cascade.ALL) 没有mappedby这个属性
@joinColumn(name="cid")
private Catalog catalog;
}
---------------------------------------------------------------------------
7.单向多对多 建立一张中间表
class Shopcar{
private int carid;
@ManyToMany(cascade=Cascade.ALL)
@JoinTable(name="T_SHOPCAR_PRODUCT",
joinColumns=@JoinColumn(name="CARID"),
inverseJoinColumns=@JoinColumn(name="PID"))
private List<Product> products
}
class Product{
private int pid;
}
--------------------------------------------------------------------
继承映射 3种方式
-----------------------------------------------------------------------1.共一张表
父类
@inheritance(strategy=InheritanceType.SINGLE_TABLE)
class BaseBean
{
//主键
private int pk;
//创建人
priate String creator;
//创建时间
private String creatime;
//最后修改人
private String lastmodifier;
//最后修改时间
private String lastmodifytime;
}
@DiscriminatorColumn(name="product")
@Entry
@Table(name="TProduct")
class product extends BaseBean
{
private String pname;
}
@DiscriminatorColumn(name="catalog")
@Entry
@Table(name="TCatalog")
class catalog extends BaseBean
{
private String cname;
}
表结构如下: 在一张表中存在多个类的数据 不会使用
BaseBean
pk discriminator pname cname creator creatime lastmodifier lastmodifytime
1 product 小米盒子 张三 2018-05-28
2 catalog 图书类
---------------------------------------------------------------------------
2.关系表
@inheritance(strategy=InheritanceType.JOINED)
class BaseBean
{
//主键
private int pk;
//创建人
priate String creator;
//创建时间
private String creatime;
//最后修改人
private String lastmodifier;
//最后修改时间
private String lastmodifytime;
}
@Entry
@Table(name="TProduct")
class product extends BaseBean
{
private String pname;
}
@Entry
@Table(name="TCatalog")
class catalog extends BaseBean
{
private String cname;
}
表结构如下 JOINED uuid
BaseBean
pk creator creatime lastmodifier lastmodifytime
1 张三 2018-10-11->TProduct
2 李四 2018-10-12 ->TCatalog
子表1:TProdcut
pname pk
小米盒子 1
子表2:TCatalog
cname pk
图书类 2
-----------------------------------------------------------------------------
3.各一张表
1.每一类都会生成一张表 包括父类 2.不想把父类生成表 将父类设置为抽象的
@inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
absoule class BaseBean
{
//主键
private int pk;
//创建人
priate String creator;
//创建时间
private String creatime;
//最后修改人
private String lastmodifier;
//最后修改时间
private String lastmodifytime;
}
@Entry
@Table(name="TProduct")
class product extends BaseBean
{
private String pname;
}
@Entry
@Table(name="TCatalog")
class catalog extends BaseBean
{
private String cname;
}
表结构如下
子表1:TProdcut
pk pname creator creatime lastmodifier lastmodifytime
1 张三 2018-10-11
2 李四 2018-10-12
子表2:TCatalog
pk cname creator creatime lastmodifier lastmodifytime
1 张三 2018-10-11
2 李四 2018-10-12
---------------------------------
双向多对多
无级分类
复杂的多对多
组件映射
级联和抓取策略
查询1+N问题
Session中其他方法
批量操作
ORACLE中的查询的操作
HQL hibernate的查询
QBC
QBE
NAVITE SQL
乐观锁和悲观锁
缓存