`
目前_还活着
  • 浏览: 984 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

一起 Gank JPA (一)

阅读更多

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
        对应的属性不持久(不保存到数据库)

 

        更多详细介绍请点击查阅 JPA-api 

        点击下载本章源码实例下载

       

       最后附上项目的结构图:

        


 

 
 

  • 大小: 19.5 KB
分享到:
评论

相关推荐

    又一个功能完备的gank客户端~ ~.zip

    标题中的“又一个功能完备的gank客户端~ ~.zip”指的是一个基于Gank.io API构建的Android客户端应用,这个应用被设计为一个全面的功能集合,以满足用户浏览和获取Gank.io上各种技术干货的需求。Gank.io是一个分享...

    Gank客户端.zip

    首先,RxJava是一种响应式编程库,它将事件流处理和函数式编程思想结合在一起,使得异步编程变得更加简洁。在Gank客户端中,RxJava被用来处理各种事件,如用户交互、网络请求等。通过使用Observables和Operators,...

    Flutter版本的Gank客户端.zip

    Flutter版本的Gank客户端是一个基于Dart编程语言和Flutter框架构建的开源项目,旨在为开发者提供一个优雅的方式来浏览和探索Gank.io上的技术干货。Gank.io是一个收集各种技术、设计、产品等实用信息的平台,而这个...

    gank.io iOS客户端.zip

    《gank.io iOS客户端:开源项目的深度解析》 在当今移动互联网时代,开源项目成为开发者们学习、交流和创新的重要平台...开源的力量在于共享与合作,让我们一起在gank.io iOS客户端的开源世界里,共同进步,持续成长。

    微信小程序版Gank客户端

    微信小程序版Gank客户端 微信小程序版Gank客户端 微信小程序版Gank客户端

    gank-master

    本文将深入探讨“gank-master”项目,它是一个基于MVP架构搭建的示例,整合了Retrofit、RxJava和OkHttp这三个主流的Android开发工具,被称为“三剑客”。 首先,MVP模式是Model-View-Presenter的缩写,它将应用的...

    微信小程序 gank (源码)

    微信小程序 gank (源码)微信小程序 gank (源码)微信小程序 gank (源码)微信小程序 gank (源码)微信小程序 gank (源码)微信小程序 gank (源码)微信小程序 gank (源码)微信小程序 gank (源码)微信小程序 gank (源码)...

    Gank.IO_干货集中营Android客户端

    综上所述,Gank.IO Android客户端是一个集知识获取、分享、学习为一体的综合性平台,其强大的功能和优秀的设计理念,使其成为Android开发者不可或缺的工具之一。通过不断的技术迭代和用户体验优化,Gank.IO客户端将...

    gank开源项目,福利列表有福利

    【标题】"gank开源项目,福利列表有福利"指的是一个名为"GanK"的开源Android项目,这个项目集合了许多开发者资源,特别是针对Android开发者的福利。"福利"在这里可以理解为开发者工具、代码片段、实用库等有助于提高...

    Android代码-一个集Gank.Io,Rxjava示例,操作符,MD控件使用,各种好玩Ap示例的学习App。

    Io unofficial client App 一款Material Design风格的Gank.Io非官方客户端应用 功能介绍 每日干货查看,一键分享保存,分类干货查看,干货搜索. Rxjava操作符,中文文档,使用案例,方便随时查阅学习. 安卓艺术开发探索...

    又一个 Gank.io 客户端.zip

    标题 "又一个 Gank.io 客户端.zip" 暗示了这是一个针对 Gank.io 平台的第三方客户端应用,Gank.io 是一个收集并分享 Android 和 iOS 开发者日常实用代码片段的平台。这个客户端可能是由开发者社区贡献的一个开源项目...

    微信小程序源码 gank(学习版)

    微信小程序源码 gank(学习版)微信小程序源码 gank(学习版)微信小程序源码 gank(学习版)微信小程序源码 gank(学习版)微信小程序源码 gank(学习版)微信小程序源码 gank(学习版)微信小程序源码 gank(学习版)微信小程序...

    Gank.io 微信小程序.zip

    Gank.io 微信小程序.zip,第三方 Gank.io 微信小程序

    Android-「有干货」——体验别具一格的Gank.ioAndroid客户端

    【Android开发-完整的App】:本项目是基于Gank.io数据接口开发的一款Android客户端应用,名为「有干货」。Gank.io是一个收集开发者干货的平台,每天都会分享各种技术文章、代码片段、实用工具等资源,深受广大开发者...

    Android代码-gank.io

    gank.io 感谢 http://gank.io 提供的api帮助完成这个app 该项目完全开源,单纯为了学习与交流,希望大家喜欢,多多提意见。 后续会将未来学到的新的技术或者框架运用到该项目,持续更新 点击下载 gankio.apk 核心...

    Android代码-干果-简洁易用的 gank 客户端

    干果——简洁易用的gank客户端 介绍 一款基于GankIo开发的练手项目。项目采用 MVP Dagger2 Retrofit RxJava开发。首页布局样式大致参考掘金客户端。 应用截图 Gif 特性 基本遵循MD风格 MVP dagger2架构模式的...

    Android-干货集中营Gank.ioAndroid客户端

    Android-Gank-Share是基于Gank.io API构建的一款Android客户端应用,旨在提供一个便捷的方式,让开发者能够快速浏览并分享Gank.io上的实用技术文章、代码片段等资源。项目的核心功能包括:内容分类浏览、搜索、收藏...

    微信小程序 社交交友 gank (源代码+截图)

    微信小程序 社交交友 gank (源代码+截图)微信小程序 社交交友 gank (源代码+截图)微信小程序 社交交友 gank (源代码+截图)微信小程序 社交交友 gank (源代码+截图)微信小程序 社交交友 gank (源代码+截图)...

    使用Arm框架的gank客户端

    【标题】"使用Arm框架的gank客户端"指的是在Android Studio 3.1.2环境下,开发者成功构建并运行了一个基于ARM架构的Gank.io客户端应用。Gank.io是一个技术分享平台,它提供了丰富的Android、iOS、前端以及其他技术...

Global site tag (gtag.js) - Google Analytics