1.JPA概述
JPA全称Java Persistence API. JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
Sun引入新的JPA ORM规范出于两个原因:
其一,简化现有Java EE和Java SE应用开发工作;
其二,Sun希望整合ORM技术,实现天下归一。
JPA由EJB 3.0软件专家组开发,作为JSR-220实现的一部分。但它不囿于EJB 3.0,你可以在Web应用、甚至桌面应用中使用。JPA的宗旨是为POJO提供持久化标准规范,由此可见,经过这几年的实践探索,能够脱离容器独立运行,方便开发和测试的理念已经深入人心了。Hibernate3.2、TopLink 10.1.3以及OpenJPA都提供了JPA的实现。
JPA的总体思想和现有Hibernate、TopLink、JDO等ORM框架大体一致。
ORM映射元数据
JPA支持XML和JDK5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;
API
用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。
查询语言
这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。
2、实体对象
访问数据库前,我们总是要设计在应用层承载数据的领域对象(Domain Object),ORM框架将它们持久化到数据库表中。
下面我们开始真刀真枪的Gank, 新建万能的 Student 实体。
/** * @Entity 将实体标记为持久化实体 ,默认情况下类名即为表名。 * * @Table(name = "T_STUDENT") 指定持久化实体对应数据库表明为“T_STUDENT” */ @Entity @Table(name = "T_STUDENT") public class Student implements java.io.Serializable{ private static final long serialVersionUID = -7442161782948585590L; /** *@Id 对应的属性是表的主键 * *@GeneratedValue 主键的产生策略 */ @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name="STU_ID") private Long stuId; /** *@Column 属性对应的表字段 * *length: 字段的长度 *name: 字段的名称 *nullable: 字段不能为空 *unique: 唯一性约束 */ @Column(length = 32, name = "STU_NAME", nullable = false, unique = true) private String stuName; /** * @Temporal(value = TemporalType.DATE) * 属性类型为时间 */ @Temporal(value = TemporalType.DATE) private Date birthday; @Temporal(value = TemporalType.TIMESTAMP) private Date createTime; /** * @Lob * 属性类型为大字段 */ @Lob private String info; /** * @Lob * @Basic(fetch = FetchType.LAZY) * 属性类型为二进制文本 */ @Lob @Basic(fetch = FetchType.LAZY) private byte[] image; /** *@Enumerated(EnumType.ORDINAL) * 属性类型为枚举 */ @Enumerated(EnumType.ORDINAL) private Gender gender; /** * @Transient * 对应的字段不持久(不保存到数据库) */ @Transient private String filePath; //对应的set、get方法省略
具有ORM元数据的领域对象称为实体(Entity),按JPA的规范,实体具备以下的条件:
1、必须使用javax.persistence.Entity注解或者在XML映射文件中有对应的元素;
2、必须具有一个不带参的构造函数,类不能声明为final,方法和需要持久化的属性也不能声明为final;
3、如果游离状的实体对象需要以值的方式进行传递,如通Session bean的远程业务接口传递,则必须实现Serializable接口;
4、需要持久化的属性,其访问修饰符不能是public,它们必须通过实体类方法进行访问。
3.使用注解元数据
@Entity
将实体标记为持久化实体 ,默认情况下类名即为表名
@Table(name = "T_STUDENT")
指定持久化实体对应数据库表名,name = "T_STUDENT" 表示 Student 保存到 T_STUDENT 表中
@Id
对应的属性是表的主键
@GeneratedValue
主键的产生策略,通过strategy属性指定。默认情况下,JPA自动选择一个最适合底层数据库的主键生成策略:如SqlServer对应identity,MySql对应auto increment。
在javax.persistence.GenerationType中定义了以下几种可供选择的策略:
(1) IDENTITY:表自增键字段,Oracle不支持这种方式;
(2) AUTO: JPA自动选择合适的策略,是默认选项;
(3) SEQUENCE:通过序列产生主键,通过@SequenceGenerator注解指定序列名,MySql不支持这种方式;
(4)TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。
不同的JPA实现商生成的表名是不同的:
如 OpenJPA生成openjpa_sequence_table表
Hibernate生成一个hibernate_sequences表,
而TopLink则生成sequence表。
@Column
属性对应的表字段。
name: 字段的名称
length: 字段的长度
nullable: 字段不能为空
unique: 唯一性约束
...
@Temporal(value = TemporalType.DATE)
如果属性是时间类型,因为数据表对时间类型有更严格的划分,所以必须指定具体时间类型。在javax.persistence.TemporalType枚举中定义了3种时间类型:
(1) DATE :等于java.sql.Date
(2)TIME :等于java.sql.Time
(3) TIMESTAMP :等于java.sql.Timestamp
@Lob
属性类型为大字段
@Enumerated(EnumType.ORDINAL)
属性类型为枚举
javax.persistence.Enumerated .EnumType定义了2种枚举类型:
(1)ORDINAL:表示持久化的为枚举类型的值
(2)STRING:表示持久化的为枚举类型的名称
@Transient
对应的属性不持久(不保存到数据库)
最后附上项目的结构图:
相关推荐
标题中的“又一个功能完备的gank客户端~ ~.zip”指的是一个基于Gank.io API构建的Android客户端应用,这个应用被设计为一个全面的功能集合,以满足用户浏览和获取Gank.io上各种技术干货的需求。Gank.io是一个分享...
首先,RxJava是一种响应式编程库,它将事件流处理和函数式编程思想结合在一起,使得异步编程变得更加简洁。在Gank客户端中,RxJava被用来处理各种事件,如用户交互、网络请求等。通过使用Observables和Operators,...
Flutter版本的Gank客户端是一个基于Dart编程语言和Flutter框架构建的开源项目,旨在为开发者提供一个优雅的方式来浏览和探索Gank.io上的技术干货。Gank.io是一个收集各种技术、设计、产品等实用信息的平台,而这个...
《gank.io iOS客户端:开源项目的深度解析》 在当今移动互联网时代,开源项目成为开发者们学习、交流和创新的重要平台...开源的力量在于共享与合作,让我们一起在gank.io iOS客户端的开源世界里,共同进步,持续成长。
微信小程序版Gank客户端 微信小程序版Gank客户端 微信小程序版Gank客户端
本文将深入探讨“gank-master”项目,它是一个基于MVP架构搭建的示例,整合了Retrofit、RxJava和OkHttp这三个主流的Android开发工具,被称为“三剑客”。 首先,MVP模式是Model-View-Presenter的缩写,它将应用的...
微信小程序 gank (源码)微信小程序 gank (源码)微信小程序 gank (源码)微信小程序 gank (源码)微信小程序 gank (源码)微信小程序 gank (源码)微信小程序 gank (源码)微信小程序 gank (源码)微信小程序 gank (源码)...
综上所述,Gank.IO Android客户端是一个集知识获取、分享、学习为一体的综合性平台,其强大的功能和优秀的设计理念,使其成为Android开发者不可或缺的工具之一。通过不断的技术迭代和用户体验优化,Gank.IO客户端将...
【标题】"gank开源项目,福利列表有福利"指的是一个名为"GanK"的开源Android项目,这个项目集合了许多开发者资源,特别是针对Android开发者的福利。"福利"在这里可以理解为开发者工具、代码片段、实用库等有助于提高...
Io unofficial client App 一款Material Design风格的Gank.Io非官方客户端应用 功能介绍 每日干货查看,一键分享保存,分类干货查看,干货搜索. Rxjava操作符,中文文档,使用案例,方便随时查阅学习. 安卓艺术开发探索...
标题 "又一个 Gank.io 客户端.zip" 暗示了这是一个针对 Gank.io 平台的第三方客户端应用,Gank.io 是一个收集并分享 Android 和 iOS 开发者日常实用代码片段的平台。这个客户端可能是由开发者社区贡献的一个开源项目...
微信小程序源码 gank(学习版)微信小程序源码 gank(学习版)微信小程序源码 gank(学习版)微信小程序源码 gank(学习版)微信小程序源码 gank(学习版)微信小程序源码 gank(学习版)微信小程序源码 gank(学习版)微信小程序...
Gank.io 微信小程序.zip,第三方 Gank.io 微信小程序
【Android开发-完整的App】:本项目是基于Gank.io数据接口开发的一款Android客户端应用,名为「有干货」。Gank.io是一个收集开发者干货的平台,每天都会分享各种技术文章、代码片段、实用工具等资源,深受广大开发者...
gank.io 感谢 http://gank.io 提供的api帮助完成这个app 该项目完全开源,单纯为了学习与交流,希望大家喜欢,多多提意见。 后续会将未来学到的新的技术或者框架运用到该项目,持续更新 点击下载 gankio.apk 核心...
干果——简洁易用的gank客户端 介绍 一款基于GankIo开发的练手项目。项目采用 MVP Dagger2 Retrofit RxJava开发。首页布局样式大致参考掘金客户端。 应用截图 Gif 特性 基本遵循MD风格 MVP dagger2架构模式的...
Android-Gank-Share是基于Gank.io API构建的一款Android客户端应用,旨在提供一个便捷的方式,让开发者能够快速浏览并分享Gank.io上的实用技术文章、代码片段等资源。项目的核心功能包括:内容分类浏览、搜索、收藏...
微信小程序 社交交友 gank (源代码+截图)微信小程序 社交交友 gank (源代码+截图)微信小程序 社交交友 gank (源代码+截图)微信小程序 社交交友 gank (源代码+截图)微信小程序 社交交友 gank (源代码+截图)...
【标题】"使用Arm框架的gank客户端"指的是在Android Studio 3.1.2环境下,开发者成功构建并运行了一个基于ARM架构的Gank.io客户端应用。Gank.io是一个技术分享平台,它提供了丰富的Android、iOS、前端以及其他技术...