ORM
ORM(Object-Relational Mapping) 表示对象关系映射。
简单的说:ORM就是建立实体类和数据库表之间的关系,从而达到操作实体类就相当于操作数据库表的目的。
好处
当实现一个应用程序时(不使用O-R Mapping),我们可能会写特别多数据访问层的代码,
从数据库保存数据、修改数据、删除数据,而这些代码都是重复的。而使用ORM则会大大减少重复性代码。
常见的orm框架有:
Mybatis(ibatis)、Hibernate、Jpa
Hibernate
Hibernate是一个开源的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,
是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以使用面向对象的思维来操纵数据库。
JPA
JPA的全称是Java Persistence API, 即Java 持久化API,是SUN公司推出的一套基于ORM的规范,内部是由一系列的接口和抽象类构成。
JPA通过JDK 5.0注解描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
查询能力:
JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以看成是Hibernate HQL的等价物。
JPA定义了独特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,
而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。
JPA和Hibernate的关系
JPA规范本质上就是一种ORM规范,注意不是ORM框架——因为JPA并未提供ORM实现,它只是制订了一些规范,提供了一些编程的API接口,但具体实现则由服务厂商来提供实现。
![fd57f46334a44616c17ee0269dd41ee7.png](https://i-blog.csdnimg.cn/blog_migrate/234e29672b4a20053d4fb0c0f382f042.png)
JPA和Hibernate的关系就像JDBC和JDBC驱动的关系,JPA是规范,Hibernate除了作为ORM框架之外,它也是一种JPA实现。
JPA怎么取代Hibernate呢?JDBC规范可以驱动底层数据库吗?答案是否定的,也就是说,如果使用JPA规范进行数据库操作,底层需要hibernate作为其实现类完成数据持久化工作。
JPA常用注解
@Entity
作用:指定当前类是实体类。
@Table
作用:指定实体类和表之间的对应关系。
属性:
name:指定数据库表的名称
@Id
作用:指定当前字段是主键。
@GeneratedValue
作用:指定主键的生成方式。。
属性:
strategy :指定主键生成策略。
@Column
作用:指定实体类属性和数据库表之间的对应关系
属性:
name:指定数据库表的列名称。
unique:是否唯一
nullable:是否可以为空
inserttable:是否可以插入
updateable:是否可以更新
columnDefinition: 定义建表时创建此列的DDL
secondaryTable: 从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字搭建开发环境[重点]
入门例子
pom.xml中导入hibernate的jar依赖
hibernate-entitymanager
hibernate-c3p0
JPA的核心配置文件
位置:
srcmainresourcesMETA-INFpersistence.xml
内容:
<!--配置持久化单元
配置实体类和数据库表的映射
/**
测试保存
public
![ca4ce5899ea6a3db3ed6cfb9cb94d381.png](https://i-blog.csdnimg.cn/blog_migrate/975ff35641e6c736852519089a948d2e.png)
运行后输出如下
![a537c09a50c882b2b0cd68c18cd6ead1.png](https://i-blog.csdnimg.cn/blog_migrate/4dff49166fd3d2d6e82f86766ead3f97.jpeg)
表中插入成功
![753956d6b55f830865e34234678e5a9d.png](https://i-blog.csdnimg.cn/blog_migrate/dbd06c2d828c47a0de0f91d39514142b.png)
解决中文
在数据库url中加编码
<property
![b67bf2fdfd204035ab20e3e76e797a2f.png](https://i-blog.csdnimg.cn/blog_migrate/e1d688e068323db75306ad95497cf9ca.png)
如果使用jdk9会报异常
java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
产生这个问题的原因主要是使用JDK 9.0 及其以上,JDK9做了巨大改变,可以使用jdk8
如果使用jdk9,需要下载四个jar包
可以下载javax.activation-1.2.0.jar,jaxb-api-2.3.0.jar,jaxb-core-2.3.0.jar,jaxb-impl-2.3.0.jar四个jar包
JAXB API是java EE的API,而java EE的API不再包含对java SE 9的模块中,因此JAXB APIs不再包含在java SE 9的默认类路径中,因此引发了以上报错
主键生成策略
生成规则由@GeneratedValue设定,JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO
IDENTITY:主键由数据库自动生成(主要是自动增长型)
用法:
@Id
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
用法:
@Id
//@SequenceGenerator源码中的定义
@Target
AUTO:主键由程序控制
用法:
@Id
TABLE:使用一个特定的数据库表格来保存主键
用法:
@Id
//@TableGenerator的定义:
@Target
//这里应用表tb_generator,定义为 :
CREATE