共计 5456 个字符,预计需要花费 14 分钟才能阅读完成。
1、jpa 入门
- Java 长久层 api,代替 jdbc,Java 长久化标准。JPA 是 Hibernate 的一个形象,是一种 ORM 标准,是 Hibernate 性能的一个子集,Hibernate 是 JPA 的一个实现
- jpa 和 jdbc 优缺点:
- jdbc:
实质:解决 Java 对象和关系型数据库表之间的转化
长处:性能最高,操作数据库最底层
毛病:
1. 应用简单(反复代码很多),移植数据库很麻烦
2. 性能优化须要本人解决,没有提供数据缓存,须要本人实现。
3. 面向的是 sql 语句操作,不是面向对象的。
- jpa:
实质:只是对于 jdbc 再次做了一层封装
长处:
1. 程序员操作很简略,代码简略。
2. 间接面向长久对象操作
3. 提供世界级数据缓存(一级缓存,二级缓存,查问缓存)
4. 数据库移植性很强,很少的批改(通过配置方言):把各种数据库抽取了一个方言接口,不同的数据库实现类一个方言接口,须要换数据库,只须要批改方言实现,驱动 jar 文件,连贯数据库信息(4 个:驱动,url 地址,用户名,明码)
毛病:
1. 不能干涉 sql 语句的生成。find 办法默认查问表的所有字段
2. 一个我的项目中如果对 sql 语句的优化比拟高,不实用 jpa(不过 jpa 中有对原生 sql 的反对)
3. 如果一个表中有上亿的数据,也不适宜用 jpa 和 jdbc(能够应用数据库读写剖析,分库分表计划解决)
- 实用的我的项目规模:中小型,jpa 在性能优化上比拟吃力,超大型还是举荐应用 MyBatis.
- ORM 框架:就是把数据保留到可掉电式存储设备中,长久层就是 dao 层,
- ORM 是对象关系映射框架,就是通过 Java 对象映射到数据库表,通过操作 Java 对象,就能够实现对数据库表的操作,
面向对象概念 | 面向关系概念 |
---|---|
类 | 表 |
对象实体 | 表的行(记录) |
属性,对象粒度 | 表的列(字段) |
2、JPA 根本注解
- @Entity:用于实体类申明语句之前,指出该 Java 类为实体类,将映射到指定的数据库表。
- @Table:当实体类与其映射的数据库表名不同名时应用,该标注于 @Entity 并列应用,置于实体类申明语句之前,可写于独自语句行,也可与申明语句同行。
- name 用于指明数据库的表名
- catalog 和 schema 用于设置表所属的数据库目录或模式,通常为数据库名
- uniqueConstraints 用于设置约束条件,通常不设置
- @Id 申明一个实体类的属性映射为数据库的主键列。通常地位申明语句之前或者同行,也能够置于属性的 getter 办法之前。、
- @GeneratedValue 用于标注主键的生成策略,通过 strategy 属性指定。默认状况下,jpa 主动抉择一个适宜底层数据库的主键生成策略:SqlServer 对应 identity,MySQL 对应 auto increment。
- IDENTITY:采纳数据库 ID 自增长形式来自增主键字段,然而 Oracle 不反对这种形式
- AUTO:JPA 主动抉择适合的策略,是默认选项:
- SEQUENCE:通过序列产生主键,通过 @SequenceGenerator 注解指定序列名,然而 MySql 不反对这种形式
- TABLE:通过表产生主键,便于数据库的移植
- @Basic 示意一个简略的属性到数据库表的字段的映射对于没有任何标注的 get()办法。默认即为 @Basic
- fetch:示意该属性的读取策略,有 EAGER 和 LAZY 两种,示意主支抓取和提早加载,默认为 true
- optional:示意该属性是否容许为 null 默认为 true
- Column:当实体属性与其映射的数据库表的类不同名时须要应用
- Transient:示意该属性并非到数据库表的字段的映射,ORM 框架将疏忽该属性。必须标注
- Temporal:调整精度
3、JPA 的 API
- Persistence:用于获取 EntiryManagerFactory 的实例
- 罕用办法:Persistence.createEntityManagerFactory(persistenceUnitName) 办法
- EntiryManagerFactory
- 获取 EntiryManager
- close()办法,敞开本身
- EntityManager 的罕用 API
- find()办法,在执行 find 办法时就发送 SQL 语句(相似于 Hibernate 中的 Session 的 get()办法)
- getReference()办法,若不实用查问的对象则返回一个代理对象,到真正应用的时候才发送 SQL 语句 chax(相似于 Hibernate 的 Session 的 load()办法)
- persistence() 办法,相似于 Hibernate 的 save() 办法,与 Hibernate 的 save() 办法不同的是其不能插入一个有 id 属性的对象
- remove() 办法,相似于 Hibernate 中 Session 的 delete 办法,然而其不能删除 游离化对象(仅有 id)
- merge() 办法,相似于 Hibernate 中 Session 的 saveOrUpdate() 办法
- EntityTransaction:JPA 中的事务操作
- 罕用 API:begin();commit();rollback()
4、JPA 中映射关联关系
- 映射单向多对一的关联关系,many 的一方作为关系的保护段,one 的一方作为被保护端,one 方指定 @OneToMany 正文并设置 mappedBy 属性,以指定他是被保护端,many 方指定 @ManyToOne 注解,并应用 @JoinColumn 指导外键名称
- 创立 Order 实体类:标注注解生成数据表,应用 @ManyToOne 映射多对一的关联关系,应用 @JoinColumn 来标注外键。
- 单向多对一的保留:保留多对一是,倡议先保留 1 的一段,这样不会多出额定的 update 语句
- 获取操作(find):默认状况下应用左外连贯的形式来获取 n 的一端的对象和其关联的 1 的一端的对象。能够应用 @ManyToOne 的 fetch 属性来批改默认的关联属性的加载策略
- 删除操作(remove):不能间接删除 1 的一端,因为有外键束缚
- 批改操作:能够依据 n 的一端对 1 的一端镜像批改操作。
- 映射单项一对多的关联关系 Customer:Order 1:n,Customer 中有 Order 的 Set 稽核属性,Order 中没有 Customer 的属性
- 在 Customer 中增加 Order 的 Set 汇合属性,并映射 1 - n 关联关系,从新生成数据表
- 保留操作(persist):总会多出 UPDATE 语句,n 的一端在插入式不会同时插入外键列
- 查问操作(find)默认应用懒加载
- 删除操作(remove):默认状况下删除 1 的一端,会先把关联的 n 的一端的外键置空,而后再删除,能够通过 @OneToMany 的 cascade 属性
- 映射双向多对一的关联关系(注:双向多对一通双向一对多)
- 实体:Customer 中有 Order 的 Set 汇合属性,Order 中有 Customer 的属性,两个实体映射的外键列必须统一,都为 CUSTOMER_ID
- 保留操作(persist):
- 映射双向一对一的关联关系
- 映射双向多对多的关联关系
5、JPA 的二级缓存
- 若 JPA 实现反对二级缓存,该节点能够配置在以后的长久化单位中是否启用二级换窜,可配置如下值:
- ALL:所有实体类都被缓存
- NONE:所有实体类都不能被缓存
- ENABLE_SELECTIVE:示意 @Cacheable(true)注解的实体类将被缓存
- DISABLE_SELECTIVE:换窜除示意 @Cacheable(false)依赖的所有实体类
- UNSPECIFIED:默认值,JPA 产品默认值将被应用
6、JPQL
- JPQL 语言的语句是 select 语句,update 语句或 delete 语句,他们都通过 Query 接口封装执行
- Query 接口封装了执行数据库查问的相干办法。调用 EntityManager 的 createQuery、createNamedQuery 及 createNativeQuery 办法能够取得查问对象,进而可调用 Query 接口的相干办法来执行查问操作。
- Query 接口的次要办法:
- int executeUpdate()
- 用于执行 update 或 delete 语句
- List getResultList()
- 用于执行 select 语句并返回后果集实体列表
- Object getSingleResult()
- 用于执行只返回单个后果实体的 select 语句。
- Query setFirstResult(int startPosition)
- 用于设置从哪个实体记录开始返回查问后果
- Query setMaxResults(int maxResult)
- 用于设置返回后果实体的最大数。与 setFirstResult 联合应用可实现分页查问
- Query setFlushMode(FlushModeType flushMode)
- 设置查问对象的 Flush 模式。参数能够取两个枚举值:FlushModeType.AUTO 为自动更新数据库记录,FlushMode Type。COMMIT 为直到提交事务时才更新数据库记录
- setHint(String hintName, Object value)
- 设置与查问对象相干的特定供应商参数或提示信息。参数名及其取值须要参考特定 JPA 实现库提供商的文档。如果第二个参数有效将抛出 IllegalArgumentException 异样。
- setParameter(int position, Object value)
- 为查问语句的指定地位参数赋值。Position 指定参数序号,value 为赋给参数的值。
- setParameter(int position, Date d, TemporalType type)
- 为查问语句的指定地位参数赋 Date 值。Position 指定参数序号,value 为赋给参数的值,temporalType 取 TemporalType 的枚举常量,包含 DATE、TIME 及 TIMESTAMP 三个,,用于将 Java 的 Date 型值长期转换为数据库反对的日期工夫类型(java.sql.Date、java.sql.Time 及 java.sql.Timestamp)
- –setParameter(int position, Calendar c, TemporalType type)
- 为查问语句的指定地位参数赋 Calenda r 值。position 指定参数序号,value 为赋给参数的值,temporalType 的含意及取舍同前。
- setParameter(String name, Object value)
- 为查问语句的指定名称参数赋值。
- setParameter(String name, Date d, TemporalType type)
- 为查问语句的指定名称参数赋 Date 值。用法同前
- setParameter(String name, Calendar c, TemporalType type)
- 为查问语句的指定名称参数设置 CalendarnameIllegalArgumentException 异样。
- Select 语句:
- from 是必选子句,如果不想返回反复实体,能够应用关键字 distinct 来进行润饰
- 查问所有实体:select o from Order o
- 调用 EntityManager 的 createQuery() 办法可创立查问对象,接着调用 Query 接口的 getResultList() 办法就可取得查问后果集
- where 子句用于指定查问条件,也反对蕴含参数的查问,然而参数名前必须冠以冒号。同样也能够应用参数序号
- order by 子句,能够对查问后果镜像排序,默认为升序,asc(升序)desc(降序)
- group by 子句与聚合查问,通常的聚合函数:AVG,COUNT,MAX,MIN
- having 子句用于对 group by 分组设置约束条件,用法与 where 子句基本相同,having 子句作用于分组,用于抉择满足条件的组,其条件表单时中通常会应用聚合函数
- 关联查问。默认左关联,
- 子查问:常呈现在 any,all,exist s 表达式中用于汇合匹配查问
- JPQL 函数:字符串处理函数,算术函数和日期函数
- UPDATE 语句:用于执行数据更新操作,次要用于针对单个实体类的批量更新
- DELETE 语句:用于执行数据更新操作
7、整合 Spring
三种整合形式
- LocalEntityManagerFactoryBean:实用于那些仅应用 JPA 进行数据拜访的我的项目,该 FactoryBean 将依据 JPA PersistenceProvider 自动检测配置文件进行工作,个别从“META-INF/persistence.xml”读取配置信息,这种形式最简略,但不能设置 Spring 中定义的 DataSource,且不反对 Spring 治理的全局事务
- 从 JNDI 中获取:用于从 Java EE 服务器获取指定的 EntityManagerFactory,这种形式在进行 Spring 事务管理时个别要应用 JTA 事务管理
- LocalContainerEntityManagerFactoryBean**:实用于所有环境的 FactoryBean,能全面管制 EntityManagerFactory 配置, 如指定 Spring 定义的 DataSource 等等。
最初
- 如果感觉看完有播种,心愿能给我点个赞,这将会是我更新的最大能源,感激各位的反对
- 欢送各位关注我的公众号【java 冢狐】,专一于 java 和计算机基础知识,保障让你看完有所播种,不信你打我
- 如果看完有不同的意见或者倡议,欢送多多评论一起交换。感激各位的反对以及厚爱。
——我是冢狐,和你一样酷爱编程。
欢送关注公众号“Java 冢狐”,获取最新消息
正文完