开始写之前还是粘贴点what,why,how吧,想了解更多的信息请自行查看JPA官网教程.这里就简单点看看就过吧.
JPA是什么?
Java持久性API(简称JAP)是类和方法的集合,以海量数据关系映射持久并存储到数据库,这是由Oracle公司提供方案技术。在哪里使用JPA?
为了减少编写代码,对象关系管理的负担,程序员遵循“JPA提供者”框架,它可以方便地与数据库实例的交互。这里所需要的框架接管JPA。
JPA提供者
JPA是一个开源的API,因此各企业厂商如Oracle,Redhat,Eclipse等,通过增加 JPA 持续性,在提供JPA的新产品。这些产品包括:
Hibernate, Eclipselink, Toplink, Spring Data JPA, etc.
一 入门CURD
Create:
EntityManagerFactory emfactory = Persistence.
createEntityManagerFactory( "MyEclipse_JPA");
EntityManager entitymanager = emfactory.
createEntityManager();
entitymanager.getTransaction().begin();
Employee employee = new Employee();
employee.setEname("Manisha");
employee.setSalary(40000);
employee.setDeg("接待员");
entitymanager.persist(employee);
entitymanager.getTransaction().commit();
entitymanager.close();
emfactory.close();
Update:
EntityManagerFactory emfactory = Persistence.
createEntityManagerFactory( "MyEclipse_JPA" );
EntityManager entitymanager = emfactory.
createEntityManager( );
entitymanager.getTransaction( ).begin( );
Employee employee=entitymanager.
find( Employee.class, 1 );
//将所有实体变为游离状态
//entitymanager.clear();
//将实体加入托管状态
//entitymanager.merge(employee);
//before update
System.out.println( employee );
employee.setSalary( 46000 );
entitymanager.getTransaction( ).commit( );
//after update
System.out.println( employee );
entitymanager.close();
emfactory.close();
Retrieve:
EntityManagerFactory emfactory = Persistence.
createEntityManagerFactory( "MyEclipse_JPA" );
EntityManager entitymanager = emfactory.
createEntityManager();
Employee employee = entitymanager.
find( Employee.class, 1 );
/*延迟加载
Employee employee = entitymanager.
getReference( Employee.class, 1 );
*/
System.out.println("employee ID = "+employee.getEid( ));
System.out.println("employee NAME = "+employee.getEname( ));
System.out.println("employee SALARY = "+employee.getSalary( ));
System.out.println("employee DESIGNATION = "+employee.getDeg( ));
Delete:
EntityManagerFactory emfactory = Persistence.
createEntityManagerFactory( "MyEclipse_JPA" );
EntityManager entitymanager = emfactory.
createEntityManager( );
entitymanager.getTransaction( ).begin( );
Employee employee=entitymanager.
find( Employee.class, 1 );
entitymanager.remove( employee );
entitymanager.getTransaction( ).commit( );
entitymanager.close( );
emfactory.close( );
实体Employee类如下:
package yzr.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
@Entity
@Table
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int eid;
private String ename;
private double salary;
private String deg;
public Employee(int eid, String ename, double salary, String deg) {
super();
this.eid = eid;
this.ename = ename;
this.salary = salary;
this.deg = deg;
}
public Employee() {
super();
}
public int getEid() {
return eid;
}
public void setEid(int eid) {
this.eid = eid;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public String getDeg() {
return deg;
}
public void setDeg(String deg) {
this.deg = deg;
}
@Override
public String toString() {
return "Employee [eid=" + eid + ", ename=" + ename + ", salary="
+ salary + ", deg=" + deg + "]";
}
}
持久化persistence.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<persistence
version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="MyEclipse_JPA"
transaction-type="RESOURCE_LOCAL">
<properties>
<property name="javax.persistence.jdbc.url"
value="jdbc:mysql://123.207.89.**:3306/jpa"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="*****"/>
<property name="javax.persistence.jdbc.driver"
value="com.mysql.jdbc.Driver"/>
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>
</persistence-unit>
</persistence>
整个资源文件示意图如下:
二 持久化查询语言
JPQL代表Java持久化查询语言。它被用来创建针对实体的查询存储在关系数据库中。 JPQL是基于SQL语法的发展。但它不会直接影响到数据库。
JPQL可以检索使用SELECT子句中的数据,可以使用 UPDATE子句做批量UPDATE和DELETE子句。
面向对象进行编写一些类似sql的查询语言:
EntityManagerFactory emfactory = Persistence
.createEntityManagerFactory("MyEclipse_JPA");
EntityManager entitymanager = emfactory.createEntityManager();
// sql函数
Query query = entitymanager
.createQuery("Select UPPER(e.ename) from Employee e");
List<String> list1 = query.getResultList();
for (String e : list1) {
System.out.println("Employee NAME :" + e);
}
// 聚合函数
Query query1 = entitymanager
.createQuery("Select MAX(e.salary) from Employee e");
Double result = (Double) query1.getSingleResult();
System.out.println("Max Employee Salary :" + result);
// Between
query = entitymanager.createQuery("Select e " + "from Employee e "
+ "where e.salary " + "Between 30000 and 40000");
List<Employee> list = (List<Employee>) query.getResultList();
for (Employee e : list) {
System.out.print("Employee ID :" + e.getEid());
System.out.println("\t Employee salary :" + e.getSalary());
}
// Like
query1 = entitymanager.createQuery("Select e " + "from Employee e "
+ "where e.ename LIKE 'M%' order by e.ename");
List<Employee> list2 = (List<Employee>) query1.getResultList();
for (Employee e : list2) {
System.out.print("Employee ID :" + e.getEid());
System.out.println("\t Employee name :" + e.getEname());
}
命名查询:
package yzr.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
@Entity
@Table
@NamedQuery(query = "Select e from Employee e where e.eid = :id",
name = "find employee by id")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int eid;
private String ename;
private double salary;
private String deg;
public Employee(int eid, String ename, double salary, String deg) {
super();
this.eid = eid;
this.ename = ename;
this.salary = salary;
this.deg = deg;
}
public Employee() {
super();
}
public int getEid() {
return eid;
}
public void setEid(int eid) {
this.eid = eid;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public String getDeg() {
return deg;
}
public void setDeg(String deg) {
this.deg = deg;
}
@Override
public String toString() {
return "Employee [eid=" + eid + ", ename=" + ename + ", salary="
+ salary + ", deg=" + deg + "]";
}
}
//命名查询
query = entitymanager.createNamedQuery("find employee by id");
query.setParameter("id", 1);
List<Employee> list3 = query.getResultList();
for (Employee e : list3) {
System.out.print("Employee ID :" + e.getEid());
System.out.println("\t Employee Name :" + e.getEname());
}
三 实体映射
继承策略
继承是任何面向对象语言的核心理念,因此我们可以用实体之间的继承关系和策略。JPA支持三种类型的继承策略:SINGLE_TABLE,JOINED_TABLE和TABLE_PER_CONCRETE_CLASS。
第一种:单一表策略
package yzr.entity;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;
@Entity
@Table
@Inheritance( strategy = InheritanceType.SINGLE_TABLE )
@DiscriminatorColumn( name="type" )
public class Animal {
@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
private int aid;
private String aname;
private int leg;
public Animal(){
}
public Animal(String name,int leg){
this.aname=name;
this.leg=leg;
}
public int getAid() {
return aid;
}
public void setAid(int aid) {
this.aid = aid;
}
public String getAname() {
return aname;
}
public void setAname(String aname) {
this.aname = aname;
}
public int getLeg() {
return leg;
}
public void setLeg(int leg) {
this.leg = leg;
}
}
package yzr.entity;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
@Entity
@DiscriminatorValue( value="Cat" )
public class Cat extends Animal {
private String skill;
public Cat(){}
public Cat(String name,int leg,String skill){
super(name,leg);
this.skill=skill;
}
public String getSkill() {
return skill;
}
public void setSkill(String skill) {
this.skill = skill;
}
}
package yzr.entity;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
@Entity
@DiscriminatorValue( value="Dog" )
public class Dog extends Animal {
private String action;
public Dog(String name,int leg,String action){
super(name,leg);
this.action=action;
}
public Dog(){
}
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
}
package yzr.mapping;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import yzr.entity.Cat;
import yzr.entity.Dog;
public class singletable {
/**
* @param args
*/
public static void main(String[] args) {
EntityManagerFactory emfactory = Persistence.
createEntityManagerFactory( "MyEclipse_JPA" );
EntityManager entitymanager = emfactory.
createEntityManager( );
entitymanager.getTransaction( ).begin( );
//Cat entity
Cat c1=new Cat(
"miaomiao",4,"sleep");
Cat c2=new Cat(
"Tom",2,"抓老鼠");
//Dog entity
Dog d1=new Dog(
"wangwang", 4,"看家");
Dog d2=new Dog(
"包哥", 4,"吃");
//storing all entities
entitymanager.persist(c1);
entitymanager.persist(c2);
entitymanager.persist(d1);
entitymanager.persist(d2);
entitymanager.getTransaction().commit();
entitymanager.close();
emfactory.close();
}
}
持久化文件persistence.xml保持和上面一致就可以了.
数据库会自动生成一张Animal表:
第二种:注册策略表
package yzr.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;
@Entity
@Table
@Inheritance( strategy = InheritanceType.JOINED )
public class Person {
@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
private int id;
private String name;
private int sex;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
public Person(){}
public Person(String name,int sex){
this.name=name;
this.sex=sex;
}
}
package yzr.entity;
import javax.persistence.Entity;
import javax.persistence.PrimaryKeyJoinColumn;
@Entity
@PrimaryKeyJoinColumn(referencedColumnName="id")
public class Student extends Person {
private String roleName;
public Student(){}
public Student(String name,int sex,String roleName){
super(name,sex);
this.roleName=roleName;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
}
package yzr.entity;
import javax.persistence.Entity;
import javax.persistence.PrimaryKeyJoinColumn;
@Entity
@PrimaryKeyJoinColumn(referencedColumnName="id")
public class Teacher extends Person {
public String bigCall;
public Teacher(){}
public Teacher(String name,int sex,String bigCall){
super(name,sex);
this.bigCall=bigCall;
}
public String getBigCall() {
return bigCall;
}
public void setBigCall(String bigCall) {
this.bigCall = bigCall;
}
}
package yzr.mapping;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import yzr.entity.Student;
import yzr.entity.Teacher;
public class joined {
public static void main(String[] args) {
EntityManagerFactory emfactory = Persistence.
createEntityManagerFactory( "MyEclipse_JPA" );
EntityManager entitymanager = emfactory.
createEntityManager( );
entitymanager.getTransaction( ).begin( );
//Cat entity
Student s1=new Student(
"miaomiao",1,"读书睡觉");
Student s2=new Student(
"Tom",2,"不写作业");
//Dog entity
Teacher t1=new Teacher(
"wangwang", 1,"打人");
Teacher t2=new Teacher(
"包哥", 2,"瞪眼");
//storing all entities
entitymanager.persist(s1);
entitymanager.persist(s2);
entitymanager.persist(t1);
entitymanager.persist(t2);
entitymanager.getTransaction().commit();
entitymanager.close();
emfactory.close();
}
}
数据库生成三种表:person ,student,teacher:
第三种:每个类表策略
package yzr.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;
@Entity
@Table
@Inheritance( strategy = InheritanceType.TABLE_PER_CLASS )
public class Language {
@Id
@GeneratedValue( strategy = GenerationType.TABLE )
public int id;
public String Country;
public Language(){}
public Language(String Country){
this.Country=Country;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCountry() {
return Country;
}
public void setCountry(String country) {
Country = country;
}
}
package yzr.entity;
import javax.persistence.Entity;
@Entity
public class Chinese extends Language {
public String sayhello;
public Chinese(){};
public Chinese(String country,String sayhello){
super(country);
this.sayhello=sayhello;
}
public String getSayhello() {
return sayhello;
}
public void setSayhello(String sayhello) {
this.sayhello = sayhello;
}
}
package yzr.entity;
import javax.persistence.Entity;
@Entity
public class English extends Language {
public String sayByeBye;
public English(){};
public English(String country,String sayByeBye){
super(country);
this.sayByeBye=sayByeBye;
}
public String getSayByeBye() {
return sayByeBye;
}
public void setSayByeBye(String sayByeBye) {
this.sayByeBye = sayByeBye;
}
}
package yzr.mapping;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import yzr.entity.Chinese;
import yzr.entity.English;
public class tablepreclass {
public static void main(String[] args) {
EntityManagerFactory emfactory = Persistence.
createEntityManagerFactory( "MyEclipse_JPA" );
EntityManager entitymanager = emfactory.
createEntityManager( );
entitymanager.getTransaction( ).begin( );
//Chinese entity
Chinese s1=new Chinese(
"miaomiao","读书睡觉");
Chinese s2=new Chinese(
"Tom","不写作业");
//English entity
English t1=new English(
"wangwang","打人");
English t2=new English(
"包哥", "瞪眼");
//storing all entities
entitymanager.persist(s1);
entitymanager.persist(s2);
entitymanager.persist(t1);
entitymanager.persist(t2);
entitymanager.getTransaction().commit();
entitymanager.close();
emfactory.close();
}
}数据库生成三张表,其中一张父表为空表:
![](https://img-blog.csdn.net/20170406163132505)
![](https://img-blog.csdn.net/20170406163137310)
![](https://img-blog.csdn.net/20170406163141419)
四 persistence.xml:
从网上找到的关于持久化配置文件每个节点的说明:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns:persistence="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence persistence_1_0.xsd ">
<!--
Name属性用于定义持久化单元的名字 (name必选,空值也合法);
transaction-type 指定事务类型(可选)
-->
<persistence-unit name="unitName" transaction-type="JTA">
<!-- 描述信息.(可选) -->
<description> </description>
<!-- javax.persistence.PersistenceProvider接口的一个实现类(可选) -->
<provider> </provider>
<!-- Jta-data-source和 non-jta-data-source用于分别指定持久化提供商使用的JTA和/或non-JTA数据源的全局JNDI名称(可选) -->
<jta-data-source>java:/MySqlDS</jta-data-source>
<non-jta-data-source> </non-jta-data-source>
<!-- 声明orm.xml所在位置.(可选) -->
<mapping-file>product.xml</mapping-file>
<!-- 以包含persistence.xml的jar文件为基准的相对路径,添加额外的jar文件.(可选) -->
<jar-file>../lib/model.jar</jar-file>
<!-- 显式列出实体类,在Java SE 环境中应该显式列出.(可选) -->
<class>com.domain.User</class>
<class>com.domain.Product</class>
<!-- 声明是否扫描jar文件中标注了@Enity类加入到上下文.若不扫描,则如下:(可选) -->
<exclude-unlisted-classes/>
<!-- 厂商专有属性(可选) -->
<properties>
<!-- hibernate.hbm2ddl.auto= create-drop / create / update -->
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
五 实体关系
@ManyToOne关系
@OneToMany 关系
@OneToOne 关系
@ManyToMany 关系
@ManyToOne
private Department department;
@OneToMany( targetEntity=Employee.class )
private List employeelist;
JPA教程:http://www.yiibai.com/jpa/jpa_entity_relationships.html
本文案列代码下载:代码