開始寫之前還是粘貼點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();
}
}數據庫生成三張表,其中一張父表爲空表:
四 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
本文案列代碼下載:代碼