JPA

在Java SE环境下使用JPA1.0(1)

一、搭建环境
1)   搭建数据库环境   1、安装数据库(MySQL 5.0.24), 用户: root,密码: (空) 。
   2、建库piscesdb。
   3、建表address:

Java代码
  1. drop table address;  
  2.   
  3. create table address (  
  4.    addressID int not null,  
  5.    city varchar(55) not null,  
  6.    street varchar(55) NOT NULL,  
  7.    zip varchar(8) NOT NULL,  
  8.    PRIMARY KEY  (addressID)  
  9. );  
  10.   
  11. insert into address values (1"深圳""坂田市场""518001");  
  12. insert into address values (2"深圳""坂田路口""518002");  
  13. insert into address values (3"深圳""四季花城""518003");  
drop table address;

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

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


4、建表userinfo:

Java代码
  1. droptable userinfo;  
  2.   
  3. createtable userinfo (  
  4.    userID intnotnull,  /** 用户id  */  
  5.    username varchar(20) notnull, /** 姓名  */  
  6.    birthday datetimenull,   /**  出生日期  */  
  7.    sex varchar(8) notnull,   /** 性别 */  
  8.    addressID intnotnull,    /** 地址id  */  
  9.    PRIMARYKEY (userID)  
  10. );  
  11.   
  12. insertinto userinfo values (1"张金雄"null"male"1);  
  13. insertinto userinfo values (2"李某某"null"male"2);  
  14. insertinto userinfo values (3"王某某"'2006-08-10'"female"3);  
  15. insertinto userinfo values (4"陈某某"'2006-08-12'"male"3);  
droptable userinfo;

createtable userinfo (
   userID intnotnull,  /** 用户id  */
   username varchar(20) notnull, /** 姓名  */
   birthday datetimenull,   /**  出生日期  */
   sex varchar(8) notnull,   /** 性别 */
   addressID intnotnull,    /** 地址id  */
   PRIMARYKEY (userID)
);

insertinto userinfo values (1, "张金雄", null, "male", 1);
insertinto userinfo values (2, "李某某", null, "male", 2);
insertinto userinfo values (3, "王某某", '2006-08-10', "female", 3);
insertinto 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 :

Java代码
  1. /* 
  2. * Address.java 
  3. */  
  4.   
  5. package org.pisces.persist;  
  6.   
  7. import java.io.Serializable;  
  8. import javax.persistence.Column;  
  9. import javax.persistence.Entity;  
  10. import javax.persistence.Id;  
  11.   
  12. /** 
  13. * 
  14. * @author kamhung 
  15. */  
  16. @Entity   
  17. publicclass Address implements Serializable {  
  18.     //地址id, 不能为空, 必须唯一  
  19.     @Id   
  20.     @Column(name ="addressid", unique=true, nullable=false)  
  21.     privateint addressid;  
  22.       
  23.     //城市, 不能为空  
  24.     @Column(name ="city", nullable=false)  
  25.     private String city;  
  26.       
  27.     //街道, 不能为空  
  28.     @Column(name ="street", nullable=false)  
  29.     private String street;  
  30.       
  31.     //邮政编码, 不能为空  
  32.     @Column(name ="zip", nullable=false)  
  33.     private String zip;  
  34.       
  35.     public Address() {  
  36.     }  
  37.       
  38.     public Address(int addressid) {  
  39.         this.setAddressid(addressid);  
  40.     }  
  41.       
  42.     publicint getAddressid() {  
  43.         returnthis.addressid;  
  44.     }  
  45.       
  46.     publicvoid setAddressid(int addressid) {  
  47.         this.addressid = addressid;  
  48.     }  
  49.       
  50.     public String getCity() {  
  51.         returnthis.city;  
  52.     }  
  53.       
  54.     publicvoid setCity(String city) {  
  55.         this.city = city;  
  56.     }  
  57.       
  58.     public String getStreet() {  
  59.         return street;  
  60.     }  
  61.       
  62.     publicvoid setStreet(String street) {  
  63.         this.street = street;  
  64.     }  
  65.       
  66.     public String getZip() {  
  67.         returnthis.zip;  
  68.     }  
  69.       
  70.     publicvoid setZip(String zip) {  
  71.         this.zip = zip;  
  72.     }  
  73.       
  74.     @Override  
  75.     publicint hashCode() {  
  76.         returnthis.addressid;  
  77.     }  
  78.       
  79.     @Override  
  80.     publicboolean equals(Object object) {  
  81.         if (!(object instanceof Address)) returnfalse;  
  82.         final Address other = (Address)object;  
  83.         returnthis.addressid == other.addressid;  
  84.     }  
  85.       
  86.     @Override  
  87.     public String toString() {  
  88.         return"Address[addressid="+ getAddressid() +", city='"+ getCity() +"', street='"+ getStreet() +"', zip='"+ getZip() +"";  
  89.     }  
  90. }  
  91. 2、用户类 UserInfo:   
  92. /* 
  93. * UserInfo2.java 
  94. */  
  95.   
  96. package org.pisces.persist;  
  97.   
  98. import java.io.Serializable;  
  99. import java.sql.Timestamp;  
  100. import javax.persistence.Column;  
  101. import javax.persistence.Entity;  
  102. import javax.persistence.Id;  
  103. import javax.persistence.JoinColumn;  
  104. import javax.persistence.OneToOne;  
  105. importstatic javax.persistence.CascadeType.*;  
  106.   
  107. /** 
  108. * 
  109. * @author kamhung 
  110. */  
  111. @Entity   
  112. publicclass UserInfo implements Serializable {  
  113.     //用户id, 不能为空, 必须唯一  
  114.     @Id   
  115.     @Column(name ="userid", unique=true, nullable=false)  
  116.     privateint userid;  
  117.       
  118.     //用户名, 不能为空  
  119.     @Column(name ="userName", nullable=false)  
  120.     private String userName;  
  121.       
  122.     //性别, 不能为空  
  123.     @Column(name ="sex", nullable=false)  
  124.     private String sex;  
  125.       
  126.     //出生日期, 可以为空  
  127.     @Column(name ="birthday")  
  128.     private Timestamp birthday;  
  129.       
  130.     //地址, 不能为空  
  131.     //PERSIST 表示更新、新增UserInfo数据时会同时更新、新增Address的数据  
  132.     //REMOVE 表示从数据库删除UserInfo会同时删除Address表中对应的数据  
  133.     @OneToOne(cascade={PERSIST, REMOVE})  
  134.     @JoinColumn(name ="addressID", nullable=false)  
  135.     private Address address;  
  136.       
  137.     public UserInfo() {  
  138.     }  
  139.       
  140.     public UserInfo(int userid) {  
  141.         this.setUserid(userid);  
  142.     }  
  143.       
  144.     @Override  
  145.     publicint hashCode() {  
  146.         returnthis.getUserid();  
  147.     }  
  148.       
  149.     @Override  
  150.     publicboolean equals(Object object) {  
  151.         if (!(object instanceof UserInfo)) returnfalse;  
  152.         final UserInfo other = (UserInfo)object;  
  153.         returnthis.userid == other.userid;  
  154.     }  
  155.       
  156.     @Override  
  157.     public String toString() {  
  158.         return"UserInfo[userid="+this.userid +", userName='"+ userName +"', sex='"+ sex  
  159.                 +"', birthday="+ birthday +", address="+ address +"";  
  160.     }  
  161.       
  162.     publicint getUserid() {  
  163.         return userid;  
  164.     }  
  165.       
  166.     publicvoid setUserid(int userid) {  
  167.         this.userid = userid;  
  168.     }  
  169.       
  170.     public String getUserName() {  
  171.         return userName;  
  172.     }  
  173.       
  174.     publicvoid setUserName(String userName) {  
  175.         this.userName = userName;  
  176.     }  
  177.       
  178.     public Timestamp getBirthday() {  
  179.         return birthday;  
  180.     }  
  181.       
  182.     publicvoid setBirthday(Timestamp birthday) {  
  183.         this.birthday = birthday;  
  184.     }  
  185.       
  186.     public String getSex() {  
  187.         return sex;  
  188.     }  
  189.       
  190.     publicvoid setSex(String sex) {  
  191.         this.sex = sex;  
  192.     }  
  193.       
  194.     public Address getAddress() {  
  195.         return address;  
  196.     }  
  197.       
  198.     publicvoid setAddress(Address address) {  
  199.         this.address = address;  
  200.     }  

2)   创建配置文件persistence.xml       在项目src文件夹下创建一个META-INF文件夹(有就不用创建了), META-INF文件夹下建一个persistence.xml文件, 内容为:
Java代码
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence"   
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">   
  5.     <!-- transaction-type 可选值有: JTA、RESOURCE_LOCAL ;   
  6.     在Java EE 环境下默认值为JTA, 在Java SE 环境下默认值为RESOURCE_LOCAL;   
  7.     如果值为JTA的话, 则必须要指定<jta-data-source>的值 -->   
  8.     <persistence-unit name="piscesPU" transaction-type="RESOURCE_LOCAL">   
  9.         <description>这是piscesPU持久化单元的一个简单描述</description>   
  10.         <!-- 指明javax.persistence.spi.PersistenceProvider 的实现类, 一般来说该节点可以省略 -->   
  11.         <provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider>   
  12.         <!-- 在Java SE环境下必须定义所有的实体Entity类, 也可以用 <mapping-file> 或<jar-file> 节点代替 -->   
  13.         <class>org.pisces.persist.UserInfo</class>   
  14. <class>org.pisces.persist.Address</class>   
  15.         <!--   
  16.         //可以定义jndi资源代替properties节点中的数据库配置,   
  17.         //但是在调用Persistence.createEntityManagerFactory方法前必须保证此资源已经注入程序中.   
  18.         <jta-data-source>jdbc/persist</jta-data-source>   
  19.         -->     
  20.   
  21.         <!-- properties节点是用来定义各种JPA实现包所定义的属性配置 -->     
  22.         <!-- 下面列举的是toplink实现包中可以配置的部分属性 -->   
  23.         <properties>               
  24.             <!-- 数据库连接配置, JDBC驱动 -->   
  25.             <property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/>     
  26.             <!-- 数据库连接配置,URL -->   
  27.             <property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/piscesdb"/>   
  28.             <!-- 数据库连接配置, 用户名 -->   
  29.             <property name="toplink.jdbc.user" value="root"/>   
  30.             <!-- 数据库连接配置, 密码 -->   
  31.             <property name="toplink.jdbc.password" value=""/>     
  32.                
  33.             <!-- 数据库连接池配置, 可写的连接池的最大连接数, 默认为 10 -->   
  34.             <property name="toplink.jdbc.write-connections.max" value="10"/>   
  35.             <!-- 数据库连接池配置, 可写的连接池的最大连接数, 默认为 5 -->   
  36.             <property name="toplink.jdbc.write-connections.min" value="5"/>   
  37.             <!-- 数据库连接池配置, 只读的连接池的最大连接数, 默认为 2 -->   
  38.             <property name="toplink.jdbc.read-connections.max" value="2"/>   
  39.             <!-- 数据库连接池配置, 只读的连接池的最大连接数, 默认为 2 -->   
  40.             <property name="toplink.jdbc.read-connections.min" value="2"/>   
  41.             <!-- 数据库连接池配置, 只读的连接池是否可以共享, 默认为 false -->   
  42.             <property name="toplink.jdbc.read-connections.shared" value="false"/>   
  43.             <!-- 是否绑定所有jdbc属性, 默认为 true -->   
  44.             <property name="toplink.jdbc.bind-parameters" value="true"/>   
  45.                
  46.             <!-- 缓冲配置, 以下三个属性值为默认设置;   
  47.              可以 default改为entity名(@Entity注释中的name属性值)或者类名来指定该entity的缓冲配置, 如:   
  48.             <property name="toplink.cache.size.org.pisces.persist.UserInfo" value="2"/>   
  49.             <property name="toplink.cache.type.org.pisces.persist.UserInfo" value="SoftWeak"/>   
  50.             <property name="toplink.cache.shared.org.pisces.persist.UserInfo" value="true"/>   
  51.             -->   
  52.             <property name="toplink.cache.size.org.pisces.persist.UserInfo" value="2"/>   
  53.             <!-- 缓冲配置, 缓冲大小, 默认为 1000 -->   
  54.             <property name="toplink.cache.size.default" value="1000"/>   
  55.             <!-- 缓冲配置, 缓冲类型, 可选值为{ Weak、SoftWeak、HardWeak、Full、NONE }, 不区分大小, 默认为 SoftWeak -->   
  56.             <property name="toplink.cache.type.default" value="SoftWeak"/>   
  57.             <!-- 缓冲配置, 是否共享缓冲, 默认为 false -->   
  58.             <property name="toplink.cache.shared.default" value="false"/>   
  59.                
  60.             <!-- 日志配置, 日志级别, 默认值为java.util.logging.Level在系统中的值 -->   
  61.             <property name="toplink.logging.level" value="SEVERE"/>   
  62.             <!-- 日志配置, 日志是否记录当前时间, 默认为 true -->   
  63.             <property name="toplink.logging.timestamp" value="true"/>   
  64.             <!-- 日志配置, 日志是否记录当前线程名, 默认为 true -->   
  65.             <property name="toplink.logging.thread" value="true"/>   
  66.             <!-- 日志配置, 日志是否记录当前会话名, 默认为 true -->   
  67.             <property name="toplink.logging.session" value="true"/>   
  68.             <!-- 日志配置, 日志是否记录异常堆栈, 默认为 true -->   
  69.             <property name="toplink.logging.exceptions" value="true"/>   
  70.                
  71.             <!-- 目标数据库类型, 截至目前为止可选值为{ Auto、Oracle、Attunity、Cloudscape、Database、DB2、DB2Mainframe   
  72.              、 DBase、Derby、HSQL、Informix、JavaDB、MySQL4、PostgreSQL、SQLAnyWhere、 SQLServer、Sybase、TimesTen },   
  73.              不区分大小, 默认为 Auto, 即 TopLink自动匹配对应的数据库类型 -->   
  74.             <property name="toplink.target-database" value="Auto"/>   
  75.                
  76.             <!-- 指定会话名称, 默认为系统自动产生唯一性名称-->   
  77.             <property name="toplink.session-name" value="pisces_session_name"/>   
  78.                
  79.             <!-- 设置是否为weaving, 默认为 true -->   
  80.             <property name="toplink.weaving" value="true"/>   
  81.                
  82.             <!-- 指定目标应用服务器类型, 截至目前为止可选值为{ None、OC4J_10_1_3、SunAS9 }(以后可能会扩展其他值的),   
  83.              在 Java SE环境下值为 None, 不区分大小, 默认为 None -->   
  84.             <property name="toplink.target-server" value="None"/>   
  85.                            
  86.             <!-- 指定实现 oracle.toplink.essentials.tools.sessionconfiguration.DescriptorCustomizer 的类名,   
  87.              toplink.descriptor.customizer.  为前缀, 后面跟entity名(@Entity注释中的name属性值)或者entity类名,   
  88.              该类中的customize方法在执行 了所有的属性(除了 toplink.session.customizer 之外)后运行, 如:   
  89.             <property name="toplink.descriptor.customizer.org.pisces.persist.UserInfo" value="org.pisces.persist.SimpleDescriptorCustomizer"/>   
  90.             <property name="toplink.descriptor.customizer.org.pisces.persist.Address" value="org.pisces.persist.SimpleDescriptorCustomizer"/>   
  91.             -->   
  92.             <!-- 指定实现 oracle.toplink.essentials.tools.sessionconfiguration.SessionCustomizer 的类名,   
  93.             该类中的customize方法在执行了所有的属性后运行, 如:   
  94.             <property name="toplink.session.customizer" value="org.pisces.persist.SimpleSessionCustomizer"/>   
  95.             -->   
  96.         </properties>   
  97.     </persistence-unit>   
  98. </persistence>   
  99. 3)   创建Entity的管理类       管理类SimpleManager是用来对实体Entity进行操作管理的.   
  100. /*  
  101. * SimpleManager.java  
  102. */   
  103.   
  104. package org.pisces.persist;   
  105.   
  106. import java.util.List;   
  107. import javax.persistence.EntityManager;   
  108. import javax.persistence.EntityManagerFactory;   
  109. import javax.persistence.Persistence;   
  110.   
  111. /**  
  112.  
  113. * @author kamhung  
  114. */   
  115. publicclass SimpleManager {   
  116.        
  117.     private SimpleManager(){   
  118.         //do nothing   
  119.     }   
  120.        
  121.     /**  
  122.      * 删除用户id=6的数据  
  123.      */   
  124.     publicstaticvoid delete() {   
  125.         final EntityManagerFactory emf =Persistence.createEntityManagerFactory("piscesPU");   
  126.         final EntityManager em =emf.createEntityManager();   
  127.         //找不到数据的话这里会抛异常   
  128.         UserInfo info =em.find(UserInfo.class6);   
  129.         try {   
  130.             em.getTransaction().begin();   
  131.             em.remove(info);   
  132.             em.getTransaction().commit();   
  133.         } finally {   
  134.             em.close();   
  135.         }   
  136.     }   
  137.        
  138.     /**  
  139.      * 修改用户id=6的数据  
  140.      */   
  141.     publicstaticvoid update() {   
  142.         final EntityManagerFactory emf =Persistence.createEntityManagerFactory("piscesPU");   
  143.         final EntityManager em =emf.createEntityManager();   
  144.         //找不到数据的话这里会抛异常   
  145.         UserInfo info =em.find(UserInfo.class6);   
  146.         info.setUserName("哈哈");   
  147.         info.getAddress().setStreet("坂田2");   
  148.         try {   
  149.             em.getTransaction().begin();   
  150.             //自动将info更新到数据库   
  151.             em.getTransaction().commit();   
  152.         } finally {   
  153.             em.close();   
  154.         }   
  155.     }   
  156.        
  157.     /**  
  158.      * 查询所有用户数据  
  159.      */   
  160.     publicstaticvoid query() {   
  161.         final EntityManagerFactory emf =Persistence.createEntityManagerFactory("piscesPU");   
  162.         long s =System.currentTimeMillis();   
  163.         //数据库连接失败这里会抛出异常   
  164. final EntityManager em =emf.createEntityManager();   
  165.         long e =System.currentTimeMillis();   
  166.         System.out.println("连接数据库耗时: "+ (e-s) +"毫秒" );   
  167.         //获取数据   
  168.         @SuppressWarnings("unchecked")   
  169.         List<UserInfo> list =em.createQuery("SELECT a FROM UserInfo a").getResultList();   
  170.         int i=0;   
  171.         for(UserInfo info : list) {   
  172.             System.out.println("第"+ (++i) +"个值为: "+ info);   
  173.         }   
  174.         em.close();   
  175.     }   
  176.        
  177.     /**  
  178.      * 创建用户id=6的一条数据, 地址id=6  
  179.      */   
  180.     publicstaticvoid create() {   
  181.         final EntityManagerFactory emf =Persistence.createEntityManagerFactory("piscesPU");   
  182.         final EntityManager em =emf.createEntityManager();   
  183.            
  184.         UserInfo info =new UserInfo(6);   
  185.         info.setSex("male");   
  186.         info.setUserName("张某某");   
  187.         info.setBirthday(new java.sql.Timestamp(System.currentTimeMillis()));   
  188.         Address naddr =new Address(6);   
  189.         naddr.setCity("深圳");   
  190.         naddr.setStreet("坂田");   
  191.         naddr.setZip("518000");   
  192.         info.setAddress(naddr);   
  193.            
  194.         try {   
  195.             em.getTransaction().begin();   
  196.             em.persist(info);   
  197.             em.getTransaction().commit();   
  198.         } finally {   
  199.             em.close();   
  200.         }   
  201.     }   
  202. }   
<?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 
*/ 
publicclass SimpleManager { 
     
    private SimpleManager(){ 
        //do nothing 
    } 
     
    /** 
     * 删除用户id=6的数据 
     */ 
    publicstaticvoid delete() { 
        final EntityManagerFactory emf =Persistence.createEntityManagerFactory("piscesPU"); 
        final EntityManager em =emf.createEntityManager(); 
        //找不到数据的话这里会抛异常 
        UserInfo info =em.find(UserInfo.class, 6); 
        try { 
            em.getTransaction().begin(); 
            em.remove(info); 
            em.getTransaction().commit(); 
        } finally { 
            em.close(); 
        } 
    } 
     
    /** 
     * 修改用户id=6的数据 
     */ 
    publicstaticvoid update() { 
        final EntityManagerFactory emf =Persistence.createEntityManagerFactory("piscesPU"); 
        final EntityManager em =emf.createEntityManager(); 
        //找不到数据的话这里会抛异常 
        UserInfo info =em.find(UserInfo.class, 6); 
        info.setUserName("哈哈"); 
        info.getAddress().setStreet("坂田2"); 
        try { 
            em.getTransaction().begin(); 
            //自动将info更新到数据库 
            em.getTransaction().commit(); 
        } finally { 
            em.close(); 
        } 
    } 
     
    /** 
     * 查询所有用户数据 
     */ 
    publicstaticvoid 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 
     */ 
    publicstaticvoid 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函数:
Java代码
  1. /*  
  2. * Main.java  
  3. */   
  4.   
  5. package org.pisces;   
  6.   
  7. import org.pisces.persist.SimpleManager;   
  8.   
  9. /**  
  10.  
  11. * @author kamhung  
  12. */   
  13. publicclass Main {   
  14.   
  15.     /**  
  16.      * 主函数  
  17.      */   
  18.     publicstaticvoid main(String[] args) throws Throwable {   
  19.         SimpleManager.query();   
  20.         SimpleManager.create();   
  21.         System.out.println("新增一条数据后进行查询");   
  22.         SimpleManager.query();   
  23.         SimpleManager.update();   
  24.         System.out.println("修改一条数据后进行查询");   
  25.         SimpleManager.query();   
  26.         SimpleManager.delete();   
  27.         System.out.println("删除一条数据后进行查询");   
  28.         SimpleManager.query();   
  29.     }   
  30. }   
/* 
* Main.java 
*/ 

package org.pisces; 

import org.pisces.persist.SimpleManager; 

/** 
* 
* @author kamhung 
*/ 
publicclass Main { 

    /** 
     * 主函数 
     */ 
    publicstaticvoid 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-1000:00:00.0, address
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值