JPA简单知识
,JPA(Java Persistence API):通过注解或XML描述对象--关系表的映射关系,并将运行期的实体对象持久化到数据库中。
JPA是一套规范,不是某个ORM产品,它主要包括以下3方面的技术:
- ORM映射元数据:JPA支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中
- Java持久化API:用来操作实体对象,执行CRUD操作
- 查询语言: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简单知识的更多相关文章
- SQLite数据库和JPA简单介绍
SQLite数据库和JPA简单介绍 一.SQLite简单使用 SQLite是遵循ACID的关系数据库管理系统,它的处理速度很快,它的设计目标是嵌入式的,只需要几百K的内存就可以了. 1.下载SQLit ...
- 关于trunk、access以及hybrid的一些简单知识
关于trunk.access以及hybrid的一些简单知识:Access 类型的端口只能属于 1 个 VLAN ,一般用于连接计算机的端口: Trunk 类型的端口可以允许多个 VLAN 通过,可以接 ...
- svn的简单知识
svn的简单知识 一.简介: SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统, 它的设计目标就是取代CVS.互联网上很多版本控制服务已从 ...
- JavaScript学习笔记(一):介绍JavaScript的一些简单知识
JavaScript是世界上最流行的编程语言.这门语言可用于HTML和web,更可广泛用于服务器.PC.笔记本电脑和智能手机等设备.---------------------------------- ...
- Spring Data JPA 简单查询--接口方法
一.接口方法整理速查 下表针对于简单查询,即JpaRepository接口(继承了CrudRepository接口.PagingAndSortingRepository接口)中的可访问方法进行整理.( ...
- JAVA入门[20]-Spring Data JPA简单示例
Spring 对 JPA 的支持已经非常强大,开发者只需关心核心业务逻辑的实现代码,无需过多关注 EntityManager 的创建.事务处理等 JPA 相关的处理.Spring Data JPA更是 ...
- Spring Data Jpa简单了解
原文来源:http://www.cnblogs.com/xuyuanjia/p/5707681.html 以下是自己简单整理原有文章,其实就是在原来文章基础上化重点以及可能会有所删减的方式进行整理,需 ...
- springboot整合JPA(简单整理,待续---)
整合步骤 引入依赖: <dependencies> <dependency> <groupId>org.springframework.boot</group ...
- JPA 简单实体映射和EntityManagerAPI
[常用注解] 使用JPA 指定映射关系时,有两种方式,一种是使用xml 方式,另一种是注解方式,笔者推荐使用注解方式.在JPA 映射简单实体时,常用的注解如下: @Entity:修饰实体类对象,表示该 ...
随机推荐
- 四、记一次失败的 CAS 搭建 之 结果总是那么伤(客户端)
==================================================================================================== ...
- 【BZOJ 2005】[Noi2010]能量采集
Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. 栋栋的植物种得 ...
- approval workflow in sharepoint designer
http://office.microsoft.com/en-us/sharepoint-designer-help/video-create-an-approval-workflow-in-shar ...
- 如何在Linux下重命名多个文件
在Linux中,当你想要改变一个文件名,使用mv命令就好了.然而mv不能使用通配符重命名多个文件.可以用sed.awk或者与xargs结合使用来处理多个文件的情况.然而,这些命令行即繁琐又不友好,并且 ...
- java程序练习:x进制转Y进制
/*X进制到Y进制转换*/ /*Step1.提示用户输入数据的进制X *Step2.接收用户输入的数据,保存到X * Scanner方法 *Step3.接收用户输入X进制的数据,保存到num *Ste ...
- 过长文字自动换行的技巧 Word-Break Word-Wrap
在很多时候,为了防止内容过长把表格或容器撑破, 我们都需要为容器加上自动换行的功能. 实现自动换行,用CSS来实现,通常有两种方式: word-break: 取值为 normal, break-all ...
- 解决position:relative情况下,z-index无效的方法
在实际开发中,div+css经常会碰到层级的问题 其中有个很头痛的就是z-index控制层级时,老是发现z-index不起作用 老杨依据自己的经验,总结出以下步骤: 1.判断被覆盖的层(想要置顶的层) ...
- linux后台执行命令&
当在前台运行某个作业时,终端被该作业占据:而在后台运行作业时,它不会占据终端.可以使用&命令把作业放到后台执行. 如:30 2 * * * /data/app/scripts/hotbacku ...
- java信号量PV操作 解决生产者-消费者问题
package test1; /** * 该例子演示生产者和消费者的问题(设只有一个缓存空间.一个消费者和一个生产者) * MySystem类定义了缓冲区个数以及信号量 * @author HYY * ...
- easyui源码翻译1.32--datagrid(数据表格)
前言 此前网上有easyui1.25的源码 应该算是比较老的版本 之后又经历了1.26 . 1.3. 1.31. 1.32 .1.33.1.34 1.33开始支持css3 算是又一个转折 但是 ...