乐趣区

关于java:十一Spring从入门到入土Spring整合JPA

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 冢狐”,获取最新消息

退出移动版