,JPA(Java Persistence API):通过注解或XML描述对象--关系表的映射关系,并将运行期的实体对象持久化到数据库中。

JPA是一套规范,不是某个ORM产品,它主要包括以下3方面的技术:

    1. ORM映射元数据:JPA支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中
    2. Java持久化API:用来操作实体对象,执行CRUD操作
    3. 查询语言:JPQL。通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。

@Entity用来标注实体

@Table用来指定实体对应的表名

@Id用来标注实体的标示,即主键。@GeneratedValue用来标注主键的生成方式。主要有以下几种:
     * GenerationType.AUTO---由ORM产品根据数据库方言决定--AUTO是默认值,可以省略,即@Id @GeneratedValue
     * GenerationType.IDENTITY---常用于Mysql、Sqlserver
     * GenerationType.SEQUENCE---常用于Oracle
     * GenerationType.TABLE--通用,但是效率不高

@Column标注实体的属性,对应数据库表中的字段,包括length,name,nullable等设置

@Temporal标注时间类型的属性,@Temporal(TemporalType.DATE),@Temporal(TemporalType.TIME),@Temporal(TemporalType.TIMESTAMP)

@Enumerated标注索引,包括@Enumerated(EnumType.ORDINAL)//保存枚举的索引值,@Enumerated(EnumType.STRING) //保存枚举的字面值(而非索引值)

@Lob //对应数据库大文本字段,还可以保存文件

@Transient //表示不与数据库映射

实例说明:

package com.yl.demo1.bean;

import java.util.Date;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient; @Entity
@Table(name="t_person") public class Person { private Integer id;
private String name;
private Date birthday;//日期类型
private Sex sex = Sex.MAN;//枚举类型,并设置默认值
private String info;
private String notinvoke;//不希望映射到数据库的字段
private Byte[] bigfile; public Person(){} public Person(String name) {
this.name = name;
}
@Id @GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(length=10, nullable=false, name="personName")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Temporal(TemporalType.DATE)
public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} @Enumerated(EnumType.STRING) //保存枚举的字面值(而非索引值)
@Column(length=5, nullable=false)
public Sex getSex() {
return sex;
} public void setSex(Sex sex) {
this.sex = sex;
}
@Lob //对应数据库大文本字段,还可以保存文件
public String getInfo() {
return info;
} public void setInfo(String info) {
this.info = info;
} @Transient //表示不与数据库映射
public String getNotinvoke() {
return notinvoke;
} public void setNotinvoke(String notinvoke) {
this.notinvoke = notinvoke;
}
/***
* FetchType.EAGER---立即加载
* FetchType.LAZY----延迟加载,没有访问get方法时不会加载
*/
@Lob @Basic(fetch=FetchType.EAGER)
public Byte[] getBigfile() {
return bigfile;
} public void setBigfile(Byte[] bigfile) {
this.bigfile = bigfile;
} }

上面类中用到的枚举

public enum Sex {
MAN, WOMAN
}

对实体的各种操作行为,包括保存,查询,更新,删除等。

 @Test public void save() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();//事务开始
Person p = new Person("老子");
em.persist(p);
em.getTransaction().commit();
em.close();
factory.close();
} @Test public void getPerson() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL");
EntityManager em = factory.createEntityManager();
Person person = em.find(Person.class, 1);//相当于hibernate的get方法
/**
* 这里执行了一个占时较长的任务时,其他部分可能修改了数据库中的对象,如果下面想要继续使用这个对象,可以使用refresh方法获取最新的数据
*此时调用查询方法只能是在EntityManager的一级缓存中获取刚才查询到的数据,无法获取最新的数据
*/
em.refresh(person);
System.out.println(person.getName());
em.close();
factory.close();
} @Test public void getPerson2() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
EntityManager em = factory.createEntityManager(); Person person = em.getReference(Person.class, 1);//相当于hibernate的load方法,延迟加载
System.out.println(person.getName()); em.close();
//System.out.println(person.getName());//获取出错
factory.close();
}
/**实体的状态
* new
* 托管
* 游离
* 删除
*
*/ @Test public void updatePerson() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();//事务开始
Person person = em.find(Person.class, 1);
person.setName("孔子");
em.getTransaction().commit();
em.close();
factory.close();
} @Test public void updatePerson2() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
EntityManager em = factory.createEntityManager();
Person person = em.find(Person.class, 1);
em.clear();//把实体管理器中的所有实体变成游离状态
person.setName("lao jia");
em.merge(person);//把游离状态的实体同步到实体管理器
em.close();
//person.getName();//此时无法查询到数据
factory.close();
} @Test public void deletePerson() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();//事务开始
Person person = em.find(Person.class, 1);
em.remove(person);
em.getTransaction().commit();
em.close();
factory.close();
} @Test public void query() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
EntityManager em = factory.createEntityManager();
Query query = em.createQuery("select o from Person o where o.id = ?1");//?后指定参数的索引
query.setParameter(1, 2);//1代表参数的索引,2代表相应的值,在这里即id=2
Person person = (Person) query.getSingleResult();
System.out.println(person.getName());
em.close();
factory.close();
} @Test public void deleteQuery() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();//事务开始
Query query = em.createQuery("delete from Person o where o.id = ?1");//?后指定参数的索引
query.setParameter(1, 2);//1代表参数的索引,2代表相应的值,在这里即id=2
query.executeUpdate();
em.getTransaction().commit();
em.close();
factory.close();
} @Test public void updateQuery() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();//事务开始
Query query = em.createQuery("update Person o set o.name = :name and o.id = :id");//?后指定参数的索引
query.setParameter(1, 2);//1代表参数的索引,2代表相应的值,在这里即id=2
query.executeUpdate();
em.getTransaction().commit();
em.close();
factory.close();
}

JPA简单知识的更多相关文章

  1. SQLite数据库和JPA简单介绍

    SQLite数据库和JPA简单介绍 一.SQLite简单使用 SQLite是遵循ACID的关系数据库管理系统,它的处理速度很快,它的设计目标是嵌入式的,只需要几百K的内存就可以了. 1.下载SQLit ...

  2. 关于trunk、access以及hybrid的一些简单知识

    关于trunk.access以及hybrid的一些简单知识:Access 类型的端口只能属于 1 个 VLAN ,一般用于连接计算机的端口: Trunk 类型的端口可以允许多个 VLAN 通过,可以接 ...

  3. svn的简单知识

    svn的简单知识 一.简介: SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统, 它的设计目标就是取代CVS.互联网上很多版本控制服务已从 ...

  4. JavaScript学习笔记(一):介绍JavaScript的一些简单知识

    JavaScript是世界上最流行的编程语言.这门语言可用于HTML和web,更可广泛用于服务器.PC.笔记本电脑和智能手机等设备.---------------------------------- ...

  5. Spring Data JPA 简单查询--接口方法

    一.接口方法整理速查 下表针对于简单查询,即JpaRepository接口(继承了CrudRepository接口.PagingAndSortingRepository接口)中的可访问方法进行整理.( ...

  6. JAVA入门[20]-Spring Data JPA简单示例

    Spring 对 JPA 的支持已经非常强大,开发者只需关心核心业务逻辑的实现代码,无需过多关注 EntityManager 的创建.事务处理等 JPA 相关的处理.Spring Data JPA更是 ...

  7. Spring Data Jpa简单了解

    原文来源:http://www.cnblogs.com/xuyuanjia/p/5707681.html 以下是自己简单整理原有文章,其实就是在原来文章基础上化重点以及可能会有所删减的方式进行整理,需 ...

  8. springboot整合JPA(简单整理,待续---)

    整合步骤 引入依赖: <dependencies> <dependency> <groupId>org.springframework.boot</group ...

  9. JPA 简单实体映射和EntityManagerAPI

    [常用注解] 使用JPA 指定映射关系时,有两种方式,一种是使用xml 方式,另一种是注解方式,笔者推荐使用注解方式.在JPA 映射简单实体时,常用的注解如下: @Entity:修饰实体类对象,表示该 ...

随机推荐

  1. 十二、mysql sql_mode 简学

    .一般默认情况下sql_mode默认为空,也就是不严格的sql检查 .如果sql_mode为空的情况下,测试: )); //定义一个name字段长度为定长2的tt3表 insert into tt3 ...

  2. 软件测试 -- 软件缺陷记录的5C原则

    Correct(准确):每个组成部分的描述准确,不会引起误解: Clear(清晰):每个组成部分的描述清晰,易于理解: Concise(简洁):只包含必不可少的信息,不包括任何多余的内容: Compl ...

  3. bnuoj 1057 函数(模拟)

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=1057 [题意]:给定x的值,带入f(x)求函数值 [题解]:注意第一个数的符号可能是'+',这里把我 ...

  4. MyISAM读写并发优化

    MyISAM在读操作占主导的情况下是很高效的.可一旦出现大量的读写并发,同InnoDB相比,MyISAM的效率就会直线下降,而 且,MyISAM和InnoDB的数据存储方式也有显著不同:通常,在MyI ...

  5. 使用Compass制作雪碧图

    遇见好的文章,笔者也会转载.但是正所谓好记性不如烂笔头,单纯的拿来主义也不如自己的亲自实践.所以每次需要转载的文章,我都会自己敲一遍,中间加入一些自己的思考. 这篇文章转载自:http://www.h ...

  6. 1044: [HAOI2008]木棍分割 - BZOJ

    Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长 ...

  7. Deadline来了,如何按时结题?

  8. 转Spring+Hibernate+EHcache配置(三)

    配置每一项的详细作用不再详细解释,有兴趣的请google下 ,这里需要注意一点defaultCache标签定义了一个默认的Cache,这个Cache是不能删除的,否则会抛出No default cac ...

  9. MySQL性能优化的21个最佳实践

    http://www.searchdatabase.com.cn/showcontent_38045.htm MySQL性能优化的21个最佳实践 1. 为查询缓存优化你的查询 大多数的MySQL服务器 ...

  10. Java泛型:泛型类、泛型接口和泛型方法

    根据<Java编程思想 (第4版)>中的描述,泛型出现的动机在于: 有许多原因促成了泛型的出现,而最引人注意的一个原因,就是为了创建容器类. 泛型类 容器类应该算得上最具重用性的类库之一. ...