1.什么是JPA
JPA(中文名Java持久层API)是一种ORM规范
ORM:对象(java)关系(数据库)映射
本质:处理Java对象和关系型数据库表之间的转换,只是对JDBC再次做了一层封装
Hibernate是一个开放源代码的对象关系映射(ORM)框架。
优缺点( Hibernate):
开发效率高
性能不高
兼容性强
有缓存机制
jpql是面向对象的语言 (最终会转化为sql语句)
2.JDBC
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访 问,它由一组用Java编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
本质:处理Java对象和关系型数据库表之间的转换
JDBC优缺点:
性能好:最底层(但是要是那种比较牛的人,会缓存)
开发效率低
数据库移植比较麻烦,兼容性不强
sql语句不是面向对象的语言
3.使用JPA完成基础的CRUD(增删改查)
3.1导包
<!-- hibernate的包 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.8.Final</version>
</dependency>
<!-- hibernate对于jpa的支持包 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.8.Final</version>
</dependency>
<!-- mysql的驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!-- junit的测试包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<build>
<finalName>pss</finalName>
<plugins>
<plugin>
<!-- Maven的编译插件-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
3.2Domain:使用注解创建表
@Entity//建表
@Table(name="xx")//给表一个名字
public class Product{
@Id//一个类必需要加主键
@GeneratedValue//自动给值
private Long id;
public void setId(Long id){
this.id=id
}
public Long getId(){
return id;
}
}
3.3.代码完成
1.获取EntityManager 对象
EntityManagerFactory f =Persistence.createEntityManagerFactory();
EntityManager eg = f.createEntityManager();
2.开启事务(同生共死,要么都成功,要么都失败)
entityManager.getTransaction().begin();
3.提交事务
entityManager.getTransaction().commit();
4.关闭事务
entityManager.close();
entityManagerFactory.close();
5.增删改需要添加事务
save:persist();
edit:merge();
delect:先查在删 remove()
查询不要事务的:
queryOne:find()
queryAll: creatQuery() 然后 getResultList();
3.4.WEN-INF/persistence.xml
<property name="hibernate.<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<!--
persistence-unit:持久化单元(一个数据库对应一个持久化单元)
name="" :为持久化单取个名字
transaction-type:事务类型
RESOURCE_LOCAL:本地(数据库自带)
JTA:用于分布式系统
我要操作数据库->最少配置基本属性:driven,url,username,password
自带连接池
-->
<persistence-unit name="cn.itsource.jap" transaction-type="RESOURCE_LOCAL">
<!--
properties:属性配置
全部可以在: \hibernate-release-4.3.8.Final\project\etc\hibernate.properties
-->
<properties>
<!-- 操作数据库的四个基本属性 -->
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.url" value="jdbc:mysql:///jpa" />
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password" value="root" />
<!-- 配置方言:根据不同数据库的特性去生成SQL -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<!--
创建表
ddl:建库建表建约束
-->
hbm2ddl.auto" value="update" />
<!-- 显示SQL -->
<property name="hibernate.show_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
4.建表策略
create-drop -> 删 - 建 -删(保存关闭EntityManagerFactory)
create -> 删 -建
update -> 修改(如果没有表会创建)【只增不减】
validate -> 验证 【只验证domain中有的数据】
5.四大对象
1.Persistence:
工具类,创建EntityManagerFactory(解析xml)
2.EntityManagerFactory:
重(连接池,sql,二级缓存,domain关系等)
线程安全
一个应用程序对应一个EntityManagerFactory:一个数据库 1:1:1
创建EntityManager
3.EntityManager:
轻(连接,一级缓存)
线程不安全的
一个请求(线程)一个EntityManager
一级缓存命中:同一个EntityManagerFactory,同一个EntityManager,同一个OID
OID:对象的全限定名#id的值
4.Transaction:
EntityManager拿到的事务是同一个:
3.提交事务
entityManager.getTransaction().commit();
4.关闭事务
entityManager.close();
entityManagerFactory.close();