1 .JPA的认识

1.1 什么是JPA–理解

JPA是Java Persistence API的简称,中文名 Java持久层API,它和学的jdbc或者spring-jdbc同一个层次

持久层:dao层 操作数据库那层

1.2 JPA再次理解–理解

(1)JPA它做持久层API

(2)它是对象关系映射(ORM) 规范

ORM:对象 关系 映射

[外链图片转存失败(img-PVJJVD4r-1568809069475)(C:\Users\JAVA\AppData\Roaming\Typora\typora-user-images\1568772969907.png)]

(3) JPA的hibernate区别

JPA它是ORM的规范,hibernate是其中一个实现框架

(4)为什么要JPA,不用jdbc? --比较jpa和jdbc优缺点 – 面试

​ jdbc:

缺点:

​ 代码重复性比较高

​ 封装数据 比较麻烦

​ 移植数据库比较麻烦

​ 没有缓存—提高的访问速度

​ 面向sql。不是面向对象操作

好处:

​ 如果是sql高手,使用jdbc相当爽 操作数据库最底层技术,其他的框架技术都是在jdbc上面进行封装

​ 在实现缓存 就需要在内存里面存储数据 --? Map(key,value)

​ JPA:

​ 好处:

​ 重复性代码不多 完成crud 只需要调用方法就可以搞定 比如保存 perisit(Employee employee)

​ merge

​ 移植数据很方便,到时候只需要配置一些方言就可以搞定

​ 提供的世界级缓存支持(一级缓存 二级缓存)

​ 不用写sql ,会自动生成

​ 面向对象操作,操作对象就相当于操作数据库,但是jpa也是支持sql

​ 缺点:

​ 有时候,我们不能干预sql的生成,如果你对sql要求比较高,不适合使用jpa,而已数据量太大,比如表里面有上亿条数据,也不是我们jpa。有些性能无法控制 select * from ,怎么办?用mybatis

​ JPA 一些中小型的项目

​ SSM(springmvc spring mybatis)

1.3 jpa小结

jpa 是什么:java perisitence api java持久层的api

jpa和hibernate关系:jpa是ORM对象关系映射的规范,hibernate是其中一个实现

jpa和jdbc的区别:

2 使用JPA

2.1JPA基本使用(掌握)

(1)下载

(2)导入包–了解pom.xml

[外链图片转存失败(img-gJFIXgi0-1568809069476)(C:\Users\JAVA\AppData\Roaming\Typora\typora-user-images\1568776897291.png)]

(3)配置文件

persistence.xml配置文件

配置连接数据库配置

(4)测试

得到EntityManagerFactory

2.2 JPA的完成CRUD(掌握)

新增:persist --事务

修改:merge --事务

删除:remove --事务

查询:find

查询所有:使用jpql语句

工具类抽取

2.3 JPA的自动创建表策略(理解)

数据库的建表策略

create: 创建策略 表示每次操作的时候,都要先删除表,在创建表 -- 测试上面
create-drop:创建删除策略 每次在操作的时候,先删除表 在创建表 在删除表 --没有用 比较临时表上面
update : 更新策略 --测试最多的 没有会跟我在数据库创建出来 --掌握
validate :  验证策略 -- 验证数据库配置和实体对象配置是否一致,如果不一致就会报错
			比如数据库没有表,有对应的实体对象 报错
			数据库表有多余字段 ,对应的实体对象没有字段 也不会错误
			数据库少字段 username,实体对象有username ,会报错 --假如数据库已经把所有表创建好,我们自己在代码在创建好
			


<property name="hibernate.hbm2ddl.auto" value="update" />

2.4 JPA核心的类

Persistence:通过它我们可以得到EntityManagerFactory

 Persistence.createEntityManagerFactory("cn.itsource.jpa")

EntityManagerFactory:实体管理工厂对象

作用:它是重量级的对象,因为它和数据库打交道,我们不要频繁的创建和销毁,如果我们频繁创建该对象或者销毁该对象,很损耗系统。尽量满足一个原则,1:1:1

1的应用程序对应1对应数据库 对应1个entityManagerFactory,尽量可以达到共享的效果,而且要注意线程安全问题(ThreadLocal)

(1)包含数据库的连接池在这里

(2)包含二级缓存–(用不到 明天用)

(3)包含预定义的jpql或者sql (PreparedStatement)–(jpql在用)

(4)管理实体的之间关系 Employee(员工) Department(部门) 多对一(第三天)

EntityManager:(经常使用对象) 实体管理对象

(1)可以完成CRUD

这个对象 你可以频繁创建和销毁,不会销毁太多性能 注意,如果多个操作 都在使用在对象,也会线程安全问题

比如转账 火狐–> $20000–>hanghang -->entityManager

​ 健健 取钱 -->entityManager

–事务并发带来的问题(后面讲)

(2)维护了一个一级缓存

缓存(内存):容器,装数据 操作之前可以把数据,先从数据库读取出来,放入到缓存里面,下次来使用的,不需要查询数据库,直接从缓存里面取数据

怎么使用一级缓存?

缓存命中条件:同一个entityManagerFactory 同一个entityManager 同一个OID(实体对象主键id)

EntityTransaction(了解)

实体事务对象:

事务:一组操作 同生共死

EntityTransaction transaction = entityManager.getTransaction();

现在事务 都是同一个库下面事务

不同库的事务 强哥 中国银行 女朋友 石楚玉 建设银行 --大的银联 --分布式事务

2.5 细节的配置

@Entity
@Table(name=“Jpa_Student”)
public class Student {
@Id//主键
@GeneratedValue//自动递增
private Long id;
//数据库名为username,唯一,不为空
@Column(name=“username”,unique = true,nullable = false)
private String name;
private String password;
//数据库里面是int类型,默认值是25,长度是11
@Column(insertable = false, columnDefinition = “int(11) default ‘25’”)
private Integer age = 25;
private Boolean sex;// 数据库没有布尔类型,bit对象
//总共19位,小数2位
@Column(columnDefinition = "decimal(19,2) ")
private BigDecimal salary;//
@Column(updatable = false)

//年月日时分秒
@Temporal(TemporalType.TIMESTAMP)
private Date createTime;
// 生日:年月日
@Temporal(TemporalType.DATE)
private Date birthday;
// 开会时间:时分秒
@Temporal(TemporalType.TIME)
private Date time;
// 大文本
@Lob
private String text;
// 如果name属性希望不持久化数据库
// @Transient// 临时属性
private String temp;
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐