ORM--JPA
JPA是持久层的规范。Hibernate是对JPA的一种实现。主要就是ORM部分使用注解替换了配置。
JPA全称为Java Persistence API ,Java持久化API是Sun公司在Java EE 5规范中提出的Java持久化接口。JPA吸取了目前Java持久化技术的优点,旨在规范、简化Java对象的持久化工作。使用JPA持久化对象,并不是依赖于某一个ORM框架。
JPA和Hibernate的关系
JPA 是规范:JPA 本质上就是一种 ORM 规范
Hibernate 是实现:Hibernate 除了作为 ORM 框架之外,它也是一种 JPA 实现.
ORM映射文件之前使用的是配置方式,这里可以通过JPA规范,把ORM映射使用注解来替代。
Hibernate的注解方式(HibernateJPA)
JPA 的供应商:Hibernate、OpenJPA、TopLink
JPA特点:
- 标准化:
- 简单易用
- 媲美JDBC
- 支持面向对象
开发流程:
第一步:创建Web项目,导入依赖
必须创建Web项目
同时放入模板文件
第二步:配置JPA核心配置文件
核心配置persistence.xml(名称是固定的), 在这个文件中配置持久化单元
- JPA 规范要求目录结构:在META-INF中
- 需要指定跟哪个数据库进行交互;
- 需要指定 JPA 使用哪个持久化的框架以及配置该框架的基本属性
以下就是配置文件的代码:
<?xml version="1.0" encoding="UTF-8"?>
persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
是核心配置文件中的持久化单元名称
<persistence-unit name="jpa-2" transaction-type="RESOURCE_LOCAL">
<!-- 指定JPA 的实现厂商 -->
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<!-- 属性,主要有数据源和对应的扩展属性 -->
<properties>
<!-- 数据源 -->
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver">
</property>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/qf?characterEncoding=utf-8">
</property>
<property name="hibernate.connection.username" value="root"></property
<property name="hibernate.connection.password" value=""></property>
<!-- 扩展属性 必须指向数据库的方言-->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL55Dialect">
</property>
<!-- 自动创建表:一般不需要 因为映射实体是由数据库当中的表生成的,所以表已经存在,若是用配置文件去生成表,则会用到这条语句-->
<property name="hibernate.hbm2ddl.auto" value="update"></property>
<!-- 显示SQL -->
<property name="hibernate.show_sql" value="true"></property>
<property name="hibernate.format_sql" value="true"></property>
</properties>
<!-- 注册实体, -->
<!--<class></class>-->
</persistence-unit>
</persistence>
第三步:创建实体类和映射的注解
创建实体类, 使用 annotation 来描述实体类跟数据库表之间的映射关系.
JPA 基本注解:
- @Entity 标注用于实体类声明语句之前,指出该Java 类为实体类,将映射到指定的数据库表。
- @Table 映射表格
- 常和@Entity配合使用。
- Name可选,的表示表名称,默认表名和实体名一致。
- @Id 映射生成主键:通常置于属性声明语句之前,也可置于属性的getter方法之前。必须有,定义了映射到数据库表的主键属性
- @GeneratedValue 用于标注主键的生成策略,通过 strategy 属性指定。 (strategy=GenerationType.AUTO)主键策略:
- IDENTITY:采用数据库 ID自增长的方式来自增主键字段
-
- AUTO: JPA自动选择合适的策略,是默认选项;
- SEQUENCE:通过序列产生主键
- @Column 映射表格列 (可选):常用属性是 name,用于设置映射数据库表的列名。
具体完成的也是三个方面,就像之前提及的,表和实体类的映射,行和对象的映射,属性和字段的映射;下面来看具体的操作:
类和表:
行和对象的映射
属性和字段
创建完成之后,把创建好的实体类在核心配置文件当中去注册,若是有多个,则注册多个;
在class里面放入类的全名称即可;
第四步:开发DAO测试
初始化表测试:
首次我们需要去加载配置文件,与之前不同的是加载的方式不同
public void initTable(){
//加载配置,得到工厂
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myjpa");
entityManagerFactory.close();
}
这里的entityManagerFactory就相当于之前的工厂。
具体的步骤有大致五个步骤:
- 加载配置文件,得到工厂
EntityManagerFactory jpa = Persistence.createEntityManagerFactory("JPA");
- 有工厂得到实体类管理对象
EntityManager entityManager = jpa.createEntityManager();//相当于Session
3.由实体类管理对象得到事务,并开启事务
EntityTransaction transaction = entityManager.getTransaction(); transaction.begin();
- 用实体类管理对象,进行具体的操作
CRDU操作
增:
javaUser javaUser1=new javaUser(); javaUser1.setName("www"); javaUser1.setPassword("1324567"); entityManager.persist(javaUser1); System.out.println("添加成功");
删:
删除是先得到对象,再将整个对象删除
javaUser javaUser1 = entityManager.find(javaUser.class, 4);
entityManager.remove(javaUser1);
改:
同样,改也是显得到对象,再去设置属性,然后更改
MyComputer myComputer = entityManager.find(MyComputer.class, 1L); myComputer.setComDesc("中国梦"); entityManager.merge(myComputer);
查:
当然查是最简单的,只需要传入想要的类,以及想要得到的主键就可以得到;
javaUser javaUser1 = entityManager.find(javaUser.class, id);
- 提交事务
transaction.commit();
- 关闭连接
当然此处应该关闭两个。一个就是实体管理对象,一个就是产生实体管理对象的工厂类;
entityManager.close();
entityManagerFactory.close();
以上就是对JPA的一个简单的介绍,下一篇回味大家带来SSH的整合,敬请期待!