一.JPA理论斜体样式部分
(1)什么是jpa
jpa:java persistence api的缩写,是ORM对象关系映射规范
jpa是规范,hibernate是他的一个实现,实现不唯一,但最好.
最底层操作还是jdbc(需要引入驱动包)
(2)什么是orm?
o:object对象,r:关系型数据库,m:映射
–>对象关系映射
(3)jpa与jdbc的区别
JPA(Hibernate)的底层还是JDBC
-JPA开发效率高,因为代码简单
-JPA运行效率低,(jdbc高,因为jdbc更接近底层)
-JPA兼容各种数据库,方便移植
-JPA内置缓存(性能在一定程度上还有优化)
二.创建项目
(1)新建maven项目
(2)导包
在外面的pom.xml配置文件中配置相关坐标
(3)引入persistence.xml文件
Idea生成文件方式:
持久化单元配置内容:
<persistence-unit name="cn.itsource.jpa" transaction-type="RESOURCE_LOCAL">
<!--配置数据库四大金刚-->
<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="123456"/>
<!--配置一个方言,目的是为了确定是那种数据库-->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<!--建表策略-->
<property name="hibernate.hbm2ddl.auto" value="create"/>
<!--显示sql语句-->
<property name="hibernate.show_sql" value="true"/>
<!--显示漂亮的sql语句格式-->
<property name="hibernate.format_sql" value="true"/>
</properties>
</persistence-unit>
(4)准备domain对象
@Entity //告诉jpa我是实体类,来管理我
@Table(name="t_employee")//对应数据库中的表名
public class Employee {
@Id
@GeneratedValue
private Long id;//主键注解
private String name;
private String password;
...
(省略getter/sette/和toString方法)
}
(5)基本功能测试
Persistence-->EntityManagerFactory-->EntityManager-->crud
Persistence创建实体管理工厂
工厂创建实体管理对象-->
实体管理对象通过persist/merge/remove/find等方法实现crud
–>基本流程:
//1.拿到entityManagerFactory
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("cn.itsource.jpa");
//2.通过Factory拿到entityManager对象
EntityManager entityManager = entityManagerFactory.createEntityManager();
//3.开启事务
entityManager.getTransaction().begin();
//4.修改数据,merge修改数据(合并)
//这里的merge方法是可以换成其他你需要的方法的
entityManager.merge(employee);
//5.提交事务
entityManager.getTransaction().commit();
//6.关闭entityManager
entityManager.close();
三.CRUD功能实现
在完成增删改查之前,先提取一个工具类,避免重复的代码,影响各位理解
***是用单列的方式来提取的工具类***
public class JpaUtil {
private static EntityManagerFactory factory;
//static静态代码块,加载时运行,且只运行一次,
static {
//ctrl+alt+T 将该行代码包裹起来,进行 操作(try catch/if/for/等等)
try {
factory = Persistence.createEntityManagerFactory("cn.itsource.jpa");
} catch (Exception e) {
e.printStackTrace();
}
}
//静态方法,返回EntityManager,直接拿到返回EntityManager对象
public static EntityManager getEntityManager(){
return factory.createEntityManager();
}
}
(1)增加保存数据
entityManager.persist(employee);
(2)修改合并数据
entityManager.merge(employee);
//3.删除数据,删除需要先查询出来,再判断,删除
Employee employee = entityManager.find(Employee.class, id);
if(employee!=null){
//删除,传入一个对象
entityManager.remove(employee);
}
(3)查询一条数据
return entityManager.find(Employee.class,id );
(4)查询所有数据
/准备jpql语句
String jpql="select o from cn.itsource.jpa.domain.Employee o";
//3.根据jpql拿到查询对象
Query query = entityManager.createQuery(jpql);
return query.getResultList();
四.建表策略
jpa中的四种建表策略
create-drop:先删除,再创建,创建完成后删除
create:先删除,在创建,每次都会创建一张新表
uodate:没有表就创建,有就修改,修改只增不减,不会修改数据类型
validate:验证功能,只验证domain中写了的属性
<!--建表策略-->
create:先删除,再创建,每次测试或运行都会重新创建一张新表,适合做测试
<property name="hibernate.hbm2ddl.auto" value="create"/>
五.重要对象的认知
(1)Persistence:持久化
解析相应的核心配置文件
创建EntityManagerFactory工厂对象
(2)EntityManagerFactory:实体管理工厂
重量级:连接池,二级缓存,所有实体映射关系,预编译的jpql/sql
线程安全,(1:1:1)1:1:1解释在下发
用于创建EntityManager对象
(3)EntityManager:实体管理
轻量级:一级缓存,线程不安全,完成crud,
一级缓存命中:同一个EntityManagerFactory,同一个EntityManager,同一个OID
OID:类的全限定名,能够统一定位到某个资源
cn.itsource.jpa.domain.Employee#id
(4)事务
EntityManager只有一个事务,
如果多个系统,多个数据库,会用到-->JTA
六.映射细节
(1)@colunm
(2)@lob:大文本,能够装很多内容
(3)transient:临时属性,jpa不会去管理这个属性,*
(4)temporal:时间设置