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:修饰实体类对象,表示该 ...
随机推荐
- fedora 禁止nouveau加载
To remove / disable nouveau drivers from kernel initramfs ## Backup old initramfs nouveau image ## m ...
- proguardgui.bat来混淆已有的jar包
1.U:\android-sdk\tools\proguard\bin\找到 proguardgui.bat,双击就可以弹出一个混淆的界面 2.加入不要混淆的,比如我们用的系统的,还有别人的jar 3 ...
- Oracle修改表空间大小
在向orale数据库导入数据的时候报 ORA-01658: 无法为表空间 XXX中的段创建 INITIAL 区错误. Oracle我在创建表空间的时候初始化大小为200M,当数据库中数据量达到这个值, ...
- 【 socke】C# socket端口复用-多主机头绑定
什么是端口复用: 因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分.这种多重绑定便称之为端口复用 ...
- 【学习总结】整理一下int, NSInteger 等概念
基本需要知道的 : unsigned : 没符号的 signed : 有符号的 int : 整型 看看OC的定义 : #if __LP64__ || (TARGET_OS_EMBEDDED & ...
- mybatis从dao传入多个参数到sqlmap时dao中要使用map或实例对象(如:user)作为参数传入, 否则报错找不到属性getter方法
23:37 2015-07-02 注意1. 使用mybaits的resultMap查询时, 如果想传入多个参数(比如where 1=1动态多条件查询时)sqlmap文件中对应的方法中, selectL ...
- 常用脚本语言Perl,Python,Ruby,Javascript一 Perl,Python,Ruby,Javascript
常用脚本语言Perl,Python,Ruby,Javascript一 Perl,Python,Ruby,Javascript Javascript现阶段还不适合用来做独立开发,它的天下还是在web应用 ...
- Python读写文件 - 转
http://blog.csdn.net/adupt/article/details/4435615 http://docs.python.org/release/2.5.2/lib/bltin-fi ...
- uva 108
降维 枚举行累加 然后求单行上最大连续和 #include <iostream> #include <cstring> #include <cstdio> # ...
- JavaScript 踩坑心得— 为了高速(上)
一.前言 很多情况下,产品的设计与开发人员一直想打造一套高品质的解决方案,从而快速.平稳地适应产品迭代.速度是衡量产品适应性的真正且唯一的标准,而且,这并不是笔者的一家之言. 「速度是衡量适应能力的真 ...