在Java SE環境下使用JPA1.0

一、搭建環境

1)   搭建數據庫環境

   1、安裝數據庫(MySQL 5.0.24), 用戶: root,密碼: (空) 。
   2、建庫piscesdb。
   3、建表address:
       
drop table address;

create table address (
   addressID 
int not null,
   city 
varchar(55not null,
   street 
varchar(55NOT NULL,
   zip 
varchar(8NOT NULL,
   
PRIMARY KEY  (addressID)
);

insert into address values (1, "深圳", "坂田市場", "518001");
insert into address values (2, "深圳", "坂田路口", "518002");
insert into address values (3, "深圳", "四季花城", "518003");

  4、建表userinfo:
      
drop table userinfo;

create table userinfo (
   userID 
int not null,  /** 用戶id  */
   username 
varchar(20not null/** 姓名  */
   birthday 
datetime null,   /**  出生日期  */
   sex 
varchar(8not null,   /** 性別 */
   addressID 
int not null,    /** 地址id  */
   
PRIMARY KEY (userID)
);

insert into userinfo values (1, "張金雄", null, "male", 1);
insert into userinfo values (2, "李某某", null, "male", 2);
insert into userinfo values (3, "王某某", '2006-08-10', "female", 3);
insert into userinfo values (4, "陳某某", '2006-08-12', "male", 3);



2)   獲取額外的jar包

    下載JPA的實現類, 去https://glassfish.dev.java.net/downloads/persistence/JavaPersistence.html下載GlassFish v1 FCS branch版本,
進行安裝後得到toplink-essentials.jar,toplink-essentials-agent.jar 兩個包,將這兩個包和mysql的驅動包加入到項目的classpath路徑中去。

3)   開發環境

  JDK:  jdk 6.0 beta2 (JDK 5.0 也可以)
   IDE:  NetBeans 5.0 中文版

二、開發

1)   創建實體Entity類

   1、地址類 Address :
 
/*
 * Address.java
 
*/

package org.pisces.persist;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;

/**
 *
 * 
@author kamhung
 
*/
@Entity 
public class Address implements Serializable {
    
//地址id, 不能爲空, 必須唯一
    @Id 
    @Column(name 
= "addressid", unique=true, nullable=false)
    
private int addressid;
    
    
//城市, 不能爲空
    @Column(name = "city", nullable=false)
    
private String city;
    
    
//街道, 不能爲空
    @Column(name = "street", nullable=false)
    
private String street;
    
    
//郵政編碼, 不能爲空
    @Column(name = "zip", nullable=false)
    
private String zip;
    
    
public Address() {
    }
    
    
public Address(int addressid) {
        
this.setAddressid(addressid);
    }
    
    
public int getAddressid() {
        
return this.addressid;
    }
    
    
public void setAddressid(int addressid) {
        
this.addressid = addressid;
    }
    
    
public String getCity() {
        
return this.city;
    }
    
    
public void setCity(String city) {
        
this.city = city;
    }
    
    
public String getStreet() {
        
return street;
    }
    
    
public void setStreet(String street) {
        
this.street = street;
    }
    
    
public String getZip() {
        
return this.zip;
    }
    
    
public void setZip(String zip) {
        
this.zip = zip;
    }
    
    @Override
    
public int hashCode() {
        
return this.addressid;
    }
    
    @Override
    
public boolean equals(Object object) {
        
if (!(object instanceof Address)) return false;
        
final Address other = (Address)object;
        
return this.addressid == other.addressid;
    }
    
    @Override
    
public String toString() {
        
return "Address[addressid=" + getAddressid() + ", city='" + getCity() + "', street='" + getStreet() + "', zip='" + getZip() +"']";
    }
}

   2、用戶類 UserInfo:
/*
 * UserInfo2.java
 
*/

package org.pisces.persist;

import java.io.Serializable;
import java.sql.Timestamp;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import static javax.persistence.CascadeType.*;

/**
 *
 * 
@author kamhung
 
*/
@Entity 
public class UserInfo implements Serializable {
    
//用戶id, 不能爲空, 必須唯一
    @Id 
    @Column(name 
= "userid", unique=true, nullable=false)
    
private int userid;
    
    
//用戶名, 不能爲空
    @Column(name = "userName", nullable=false)
    
private String userName;
    
    
//性別, 不能爲空
    @Column(name = "sex", nullable=false)
    
private String sex;
    
    
//出生日期, 可以爲空
    @Column(name = "birthday")
    
private Timestamp birthday;
    
    
//地址, 不能爲空
    
//PERSIST 表示更新、新增UserInfo數據時會同時更新、新增Address的數據
    
//REMOVE 表示從數據庫刪除UserInfo會同時刪除Address表中對應的數據
    @OneToOne(cascade={PERSIST, REMOVE})
    @JoinColumn(name 
= "addressID", nullable=false)
    
private Address address;
    
    
public UserInfo() {
    }
    
    
public UserInfo(int userid) {
        
this.setUserid(userid);
    }
    
    @Override
    
public int hashCode() {
        
return this.getUserid();
    }
    
    @Override
    
public boolean equals(Object object) {
        
if (!(object instanceof UserInfo)) return false;
        
final UserInfo other = (UserInfo)object;
        
return this.userid == other.userid;
    }
    
    @Override
    
public String toString() {
        
return "UserInfo[userid=" + this.userid + ", userName='" + userName + "', sex='" + sex
                
+ "', birthday=" + birthday + ", address=" + address + "]";
    }
    
    
public int getUserid() {
        
return userid;
    }
    
    
public void setUserid(int userid) {
        
this.userid = userid;
    }
    
    
public String getUserName() {
        
return userName;
    }
    
    
public void setUserName(String userName) {
        
this.userName = userName;
    }
    
    
public Timestamp getBirthday() {
        
return birthday;
    }
    
    
public void setBirthday(Timestamp birthday) {
        
this.birthday = birthday;
    }
    
    
public String getSex() {
        
return sex;
    }
    
    
public void setSex(String sex) {
        
this.sex = sex;
    }
    
    
public Address getAddress() {
        
return address;
    }
    
    
public void setAddress(Address address) {
        
this.address = address;
    }
}


2)   創建配置文件persistence.xml

       在項目src文件夾下創建一個META-INF文件夾(有就不用創建了), META-INF文件夾下建一個persistence.xml文件, 內容爲:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.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_1_0.xsd">
    
<!-- transaction-type 可選值有: JTA、RESOURCE_LOCAL ;
    在Java EE 環境下默認值爲JTA, 在Java SE 環境下默認值爲RESOURCE_LOCAL;
    如果值爲JTA的話, 則必須要指定<jta-data-source>的值 
-->
    
<persistence-unit name="piscesPU" transaction-type="RESOURCE_LOCAL">
        
<description>這是piscesPU持久化單元的一個簡單描述</description>
        
<!-- 指明javax.persistence.spi.PersistenceProvider 的實現類, 一般來說該節點可以省略 -->
        
<provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider>
        
<!-- 在Java SE環境下必須定義所有的實體Entity類, 也可以用 <mapping-file> 或<jar-file> 節點代替 -->
        
<class>org.pisces.persist.UserInfo</class>
        <class>org.pisces.persist.Address</class>
        
<!--
        //可以定義jndi資源代替properties節點中的數據庫配置,
        //但是在調用Persistence.createEntityManagerFactory方法前必須保證此資源已經注入程序中.
        <jta-data-source>jdbc/persist</jta-data-source>
        
-->  
 
        
<!-- properties節點是用來定義各種JPA實現包所定義的屬性配置 -->  
        
<!-- 下面列舉的是toplink實現包中可以配置的部分屬性 -->
        
<properties>            
            
<!-- 數據庫連接配置, JDBC驅動 -->
            
<property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/>  
            
<!-- 數據庫連接配置,URL -->
            
<property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/piscesdb"/>
            
<!-- 數據庫連接配置, 用戶名 -->
            
<property name="toplink.jdbc.user" value="root"/>
            
<!-- 數據庫連接配置, 密碼 -->
            
<property name="toplink.jdbc.password" value=""/>  
            
            
<!-- 數據庫連接池配置, 可寫的連接池的最大連接數, 默認爲 10 -->
            
<property name="toplink.jdbc.write-connections.max" value="10"/>
            
<!-- 數據庫連接池配置, 可寫的連接池的最大連接數, 默認爲 5 -->
            
<property name="toplink.jdbc.write-connections.min" value="5"/>
            
<!-- 數據庫連接池配置, 只讀的連接池的最大連接數, 默認爲 2 -->
            
<property name="toplink.jdbc.read-connections.max" value="2"/>
            
<!-- 數據庫連接池配置, 只讀的連接池的最大連接數, 默認爲 2 -->
            
<property name="toplink.jdbc.read-connections.min" value="2"/>
            
<!-- 數據庫連接池配置, 只讀的連接池是否可以共享, 默認爲 false -->
            
<property name="toplink.jdbc.read-connections.shared" value="false"/>
            
<!-- 是否綁定所有jdbc屬性, 默認爲 true -->
            
<property name="toplink.jdbc.bind-parameters" value="true"/>
            
            
<!-- 緩衝配置, 以下三個屬性值爲默認設置;
             可以 default改爲entity名(@Entity註釋中的name屬性值)或者類名來指定該entity的緩衝配置, 如:
            <property name="toplink.cache.size.org.pisces.persist.UserInfo" value="2"/>
            <property name="toplink.cache.type.org.pisces.persist.UserInfo" value="SoftWeak"/>
            <property name="toplink.cache.shared.org.pisces.persist.UserInfo" value="true"/>
            
-->
            
<property name="toplink.cache.size.org.pisces.persist.UserInfo" value="2"/>
            
<!-- 緩衝配置, 緩衝大小, 默認爲 1000 -->
            
<property name="toplink.cache.size.default" value="1000"/>
            
<!-- 緩衝配置, 緩衝類型, 可選值爲{ Weak、SoftWeak、HardWeak、Full、NONE }, 不區分大小, 默認爲 SoftWeak -->
            
<property name="toplink.cache.type.default" value="SoftWeak"/>
            
<!-- 緩衝配置, 是否共享緩衝, 默認爲 false -->
            
<property name="toplink.cache.shared.default" value="false"/>
            
            
<!-- 日誌配置, 日誌級別, 默認值爲java.util.logging.Level在系統中的值 -->
            
<property name="toplink.logging.level" value="SEVERE"/>
            
<!-- 日誌配置, 日誌是否記錄當前時間, 默認爲 true -->
            
<property name="toplink.logging.timestamp" value="true"/>
            
<!-- 日誌配置, 日誌是否記錄當前線程名, 默認爲 true -->
            
<property name="toplink.logging.thread" value="true"/>
            
<!-- 日誌配置, 日誌是否記錄當前會話名, 默認爲 true -->
            
<property name="toplink.logging.session" value="true"/>
            
<!-- 日誌配置, 日誌是否記錄異常堆棧, 默認爲 true -->
            
<property name="toplink.logging.exceptions" value="true"/>
            
            
<!-- 目標數據庫類型, 截至目前爲止可選值爲{ Auto、Oracle、Attunity、Cloudscape、Database、DB2、DB2Mainframe
             、 DBase、Derby、HSQL、Informix、JavaDB、MySQL4、PostgreSQL、SQLAnyWhere、 SQLServer、Sybase、TimesTen },
             不區分大小, 默認爲 Auto, 即 TopLink自動匹配對應的數據庫類型 
-->
            
<property name="toplink.target-database" value="Auto"/>
            
            
<!-- 指定會話名稱, 默認爲系統自動產生唯一性名稱-->
            
<property name="toplink.session-name" value="pisces_session_name"/>
            
            
<!-- 設置是否爲weaving, 默認爲 true -->
            
<property name="toplink.weaving" value="true"/>
            
            
<!-- 指定目標應用服務器類型, 截至目前爲止可選值爲{ None、OC4J_10_1_3、SunAS9 }(以後可能會擴展其他值的),
             在 Java SE環境下值爲 None, 不區分大小, 默認爲 None 
-->
            
<property name="toplink.target-server" value="None"/>
                        
            
<!-- 指定實現 oracle.toplink.essentials.tools.sessionconfiguration.DescriptorCustomizer 的類名,
             toplink.descriptor.customizer.  爲前綴, 後面跟entity名(@Entity註釋中的name屬性值)或者entity類名,
             該類中的customize方法在執行 了所有的屬性(除了 toplink.session.customizer 之外)後運行, 如:
            <property name="toplink.descriptor.customizer.org.pisces.persist.UserInfo" value="org.pisces.persist.SimpleDescriptorCustomizer"/>
            <property name="toplink.descriptor.customizer.org.pisces.persist.Address" value="org.pisces.persist.SimpleDescriptorCustomizer"/>
            
-->
            
<!-- 指定實現 oracle.toplink.essentials.tools.sessionconfiguration.SessionCustomizer 的類名,
            該類中的customize方法在執行了所有的屬性後運行, 如:
            <property name="toplink.session.customizer" value="org.pisces.persist.SimpleSessionCustomizer"/>
            
-->
        
</properties>
    
</persistence-unit>
</persistence>

 

 

3)   創建Entity的管理類

       管理類SimpleManager是用來對實體Entity進行操作管理的.
/*
 * SimpleManager.java
 
*/

package org.pisces.persist;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 *
 * 
@author kamhung
 
*/
public class SimpleManager {
    
    
private SimpleManager(){
        
//do nothing
    }
    
    
/**
     * 刪除用戶id=6的數據
     
*/
    
public static void delete() {
        
final EntityManagerFactory emf =Persistence.createEntityManagerFactory("piscesPU");
        
final EntityManager em =emf.createEntityManager();
        
//找不到數據的話這裏會拋異常
        UserInfo info =em.find(UserInfo.class6);
        
try {
            em.getTransaction().begin();
            em.remove(info);
            em.getTransaction().commit();
        } 
finally {
            em.close();
        }
    }
    
    
/**
     * 修改用戶id=6的數據
     
*/
    
public static void update() {
        
final EntityManagerFactory emf =Persistence.createEntityManagerFactory("piscesPU");
        
final EntityManager em =emf.createEntityManager();
        
//找不到數據的話這裏會拋異常
        UserInfo info =em.find(UserInfo.class6);
        info.setUserName(
"哈哈");
        info.getAddress().setStreet(
"坂田2");
        
try {
            em.getTransaction().begin();
            
//自動將info更新到數據庫
            em.getTransaction().commit();
        } 
finally {
            em.close();
        }
    }
    
    
/**
     * 查詢所有用戶數據
     
*/
    
public static void query() {
        
final EntityManagerFactory emf =Persistence.createEntityManagerFactory("piscesPU");
        
long s =System.currentTimeMillis();
        
//數據庫連接失敗這裏會拋出異常
        final EntityManager em =emf.createEntityManager();
        
long e =System.currentTimeMillis();
        System.out.println(
"連接數據庫耗時: " + (e-s) + "毫秒" );
        
//獲取數據
        @SuppressWarnings("unchecked")
        List
<UserInfo> list =em.createQuery("SELECT a FROM UserInfo a").getResultList();
        
int i=0;
        
for(UserInfo info : list) {
            System.out.println(
"" + (++i) + "個值爲: " + info);
        }
        em.close();
    }
    
    
/**
     * 創建用戶id=6的一條數據, 地址id=6
     
*/
    
public static void create() {
        
final EntityManagerFactory emf =Persistence.createEntityManagerFactory("piscesPU");
        
final EntityManager em =emf.createEntityManager();
        
        UserInfo info 
=new UserInfo(6);
        info.setSex(
"male");
        info.setUserName(
"張某某");
        info.setBirthday(
new java.sql.Timestamp(System.currentTimeMillis()));
        Address naddr 
=new Address(6);
        naddr.setCity(
"深圳");
        naddr.setStreet(
"坂田");
        naddr.setZip(
"518000");
        info.setAddress(naddr);
        
        
try {
            em.getTransaction().begin();
            em.persist(info);
            em.getTransaction().commit();
        } 
finally {
            em.close();
        }
    }
}

三、運行

   1、  編寫main函數:
/*
 * Main.java
 
*/

package org.pisces;

import org.pisces.persist.SimpleManager;

/**
 *
 * 
@author kamhung
 
*/
public class Main {

    
/**
     * 主函數
     
*/
    
public static void main(String[] args) throws Throwable {
        SimpleManager.query();
        SimpleManager.create();
        System.out.println(
"新增一條數據後進行查詢");
        SimpleManager.query();
        SimpleManager.update();
        System.out.println(
"修改一條數據後進行查詢");
        SimpleManager.query();
        SimpleManager.delete();
        System.out.println(
"刪除一條數據後進行查詢");
        SimpleManager.query();
    }
}
 
  2、 運行結果如下:
run:
連接數據庫耗時: 1000毫秒
第1個值爲: UserInfo[userid
=1, userName='張金雄', sex='male', birthday=null, address=Address[addressid=1, city='深圳', street='坂田市場', zip='518001']]
第2個值爲: UserInfo[userid
=2, userName='李某某', sex='male', birthday=null, address=Address[addressid=2, city='深圳', street='坂田路口', zip='518002']]
第3個值爲: UserInfo[userid
=3, userName='王某某', sex='female', birthday=2006-08-10 00:00:00.0, address
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章