• 1. 第26章 JPA基础应用 教材:Java EE实用教程
  • 2. 主要内容26.1准备持久性提供者和准备驱动程序 26.2准备数据库及表 26.3使用Persistence.xml配置数据库信息 26.4编写实体类 26.5使用Table配置类与表的对应关系 26.6使用Id配置主键 26.7使用Column配置列与属性的关系 26.8 使用@Basic和@Transient 26.9 客户端程序 26.10在MyEclipse中开发JPA简单应用
  • 3. 26.1准备持久性提供者和准备驱动程序现在流行的对JPA支持的O/R映射工具包括TopLink、Hibernate、OpenJPA和EclipseLink,本书以TopLink为例进行介绍。 TopLink下载的地址为: http://www.oracle.com/technology/products/ias/toplink/jpa/download.html 下载之后要得到toplink-essentials-agent.jar和toplink-essentials.jar,这是持久提供者的核心API。 另外根据要使用的数据库,得到相应的JDBC驱动程序,本章数据库仍然采用MySQL。
  • 4. 26.2准备数据库及表 create table userinfo ( userid varchar(10) primary key not null, username varchar(10) not null, userpass varchar(10) not null, usertype char(1) not null )
  • 5. 26.3使用Persistence.xml配置数据库信息文档的声明如下:
  • 6. 26.3使用Persistence.xml配置数据库信息包含的元素为,主要属性包括name和transaction-type,name指出持久单元的名字,transaction-type指出事务的类型。 name="default"声明持久单元的名字为default,transaction-type="RESOURCE_LOCAL"声明当前操作不参与JTA事务。
  • 7. 26.3使用Persistence.xml配置数据库信息声明持久提供者: 持久提供者的名字 例如,使用TopLink作为持久提供者,配置方式如下: oracle.toplink.essentials.PersistenceProvider
  • 8. 26.3使用Persistence.xml配置数据库信息实体类的声明如下: 类名 假设实体类的名字为entity.Userinfo,则声明方式如下: entity.Userinfo
  • 9. 26.3使用Persistence.xml配置数据库信息数据库相关信息通过声明,使用TopLink为持久提供者,则需要配置的属性如下:
  • 10. 26.3使用Persistence.xml配置数据库信息配置实例: 完整配置代码,参见教材。
  • 11. 26.4编写实体类实体类就是普通的JavaBean。 实体类必须通过@Entity或者xml配置文件进行配置。实体类必须满足下面的要求: 必须提供一个无参数的构造方法; 可以有多个构造方法,无参数构造方法必须是public或者protected; 在类上使用@Entity声明Bean类为实体类,例如下面的代码声明Userinfo类为实体类: @Entity public class Userinfo{ … } 为了表示实体信息,需要定义与数据库表的列对应的属性,Userinfo表包含userid、username、userpass和usertype 4个属性,并且需要提供对属性操作的set方法和get方法,
  • 12. @Entity public class Userinfo { private String userid; private String username; private String userpass; private String usertype; public String getUserid() { return userid; } public void setUserid(String userid) { this.userid = userid; } public String getUsername() { return username; } … // 其他set方法和get方法 }
  • 13. 26.5使用Table配置类与表的对应关系格式: @Entity @Table(name="userinfo") public class Userinfo{ … } 如果表名和类名相同,则可以省略@Table注释: @Entity public class Userinfo{ … }
  • 14. 26.6使用Id配置主键使用@Id来标注主键属性,可以定义在属性上,也可以定义在对属性操作的get方法上,下面展示了两种用法。 方法一: @Id private String bookid; 方法二: @Id public String getBookid(){ return bookid; }
  • 15. 26.7使用Column配置列与属性的关系实体类的属性与表中列的对应关系可以通过@Column进行标注,与@Id相同,@Column可以用在属性上,也可以用在对属性进行操作的get方法上。下面是@Column用在get方法上的例子: @Column(name=”bookname”) public String getBookname(){ return bookname; }
  • 16. 26.7使用Column配置列与属性的关系Column的属性: unique,表示是否在该列上设置唯一约束,默认值为false; nullable,表示是否设置该列的值可以为空,默认值false; insertable,在插入的时候是否插入该列的值,默认值为true; updatable,在更新的时候是否作为生成的update语句中的一个列,默认值为true; columnDefinition,为这个特定列覆盖SQL DDL片段,这可能导致无法在不同数据库间移植; table,通常在有多个表的时候使用,定义对应的表,默认为主表; length列长度,默认值为255; precision,十进制精度,默认值0; scale,如果列十进制数值范围(decimal scale)可用,在此设置(默认值0) 。
  • 17. 26.8 使用@Basic和@Transient @Basic注释用于修饰属性,表示在处理某个对象的时候需要处理该属性,例如持久化该实体的时候会把该属性值添加插入到数据库中。可以直接定义在属性上,也可以定义在对属性操作的get方法上。 例1: @Basic private String username; 例2: @Basic public String getUsername() { return username; } 默认情况下,在对实体进行操作的时候,所有的属性都会处理,所以通常可以不写。
  • 18. 26.8 使用@Basic和@Transient如果不希望在处理实体的时候处理某个属性,可以使用@Transient,用法与@Basic相同。 例1: @ Transient private String username; 例2: @ Transient public String getUsername() { return username; }
  • 19. 26.9 客户端程序26.9.1 增加数据 EntityManagerFactory emf = Persistence.createEntityManagerFactory("default"); EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); em.persist(user); em.getTransaction().commit();
  • 20. 26.9 客户端程序26.9.2 删除操作 EntityManagerFactory emf = Persistence.createEntityManagerFactory("default"); EntityManager em = emf.createEntityManager(); Userinfo tempUser = em.find(Userinfo.class,user.getUserid()); em.getTransaction().begin(); em.remove(tempUser); em.getTransaction().commit();
  • 21. 26.9 客户端程序26.9.3 修改操作 修改可能只是修改某个属性,也可能是修改很多属性。如果要修改某个属性需要先找到该实体,然后使用set方法修改即可。如果要修改很多属性,可以使用merge方法。 EntityManagerFactory emf = Persistence.createEntityManagerFactory("default"); EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); em.merge(user); em.getTransaction().commit();
  • 22. 26.9 客户端程序26.9.3 修改操作 修改特定的属性 EntityManagerFactory emf = Persistence.createEntityManagerFactory("default"); EntityManager em = emf.createEntityManager(); Userinfo user = em.find(Userinfo.class, userid); em.getTransaction().begin(); user.setUsername(username); em.getTransaction().commit();
  • 23. 26.9 客户端程序26.9.4 查询操作 EntityManagerFactory emf = Persistence.createEntityManagerFactory("default"); EntityManager em = emf.createEntityManager(); Query query = em.createQuery("select userinfo from Userinfo userinfo"); List users = query.getResultList(); for(Userinfo user:users){ System.out.println(user.getUsername()); }
  • 24. 26.10在MyEclipse中开发JPA简单应用26.10.1 为工程添加JPA支持 26.10.2 根据数据库表生成实体类及辅助文件 演示。(具体过程参见教材)
  • 25. Java EE实用教程(第二版)——电子工业出版社——李绪成——http://blog.csdn.net/javaeeteacher小结26.1准备持久性提供者和准备驱动程序 26.2准备数据库及表 26.3使用Persistence.xml配置数据库信息 26.4编写实体类 26.5使用Table配置类与表的对应关系 26.6使用Id配置主键 26.7使用Column配置列与属性的关系 26.8 使用@Basic和@Transient 26.9 客户端程序 26.10在MyEclipse中开发JPA简单应用
  • 26. 谢谢!