- 浏览: 25294 次
- 性别:
- 来自: 北京
最新评论
什么是JPA
JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据。它的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate、Toplink、JDO等ORM框架各自为营的局面。值得注意的是,JPA是在充分吸收现有Hibernate、Toplink、JDO等ORM框架的基础上发展而来的,具有易于使用、伸缩性强等优点。从目前的开发社区的反应上看,JPA受到了极大的支持和赞扬,其中就包括了Spring与EJB3.0的开发团队。着眼未来几年的技术走向,JPA作为ORM领域的标准化整合者的目标应该不难实现。
JPA的总体思想和现有Hibernate、Toplink、JDO等ORM框架大体一致。总体来说,JPA包括以下3个方面的技术:
ORM映射元数据
JPA支持XML和JDK5.0注释(也可译作注解)两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。
Java持久化API
用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有事情,开发者可以从繁琐的JDBC和SQL代码中解脱出来。
查询语言
这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语句查询数据,避免程序的SQL语句紧密耦合。
提示:JPA不是一种新的ORM框架,它的出现只是用于规范现有的ORM技术,它不能取代现有的Hibernate、Toplink、JDO等ORM框架。相反,在采用JPA开发时,我们仍将使用到这些ORM框架,只是此时开发出来的应用不再依赖于某个持久化提供商。应用可以在不修改代码的情况下在任何JPA环境下运行,真正做到低耦合,可扩展的程序设计。
下面依托Hibernate做配置:
一、首先建立一个Java项目,名为JPA,然后将hibernate下的包导入进来(需要导入的hibernate的包在下面,可供下载),同时将数据库的驱动类导入(我这里用的是MySql,驱动类也在下面,可供下载)
二、在类的根目录下新建一个文件夹:META-INF,在META-INF中新建一个xml文件:persistence.xml,内容如下:
三、新建一个类:Person,放在cn.itcast.bean包下,代码如下:
在Person类中用到了枚举类型,再在该目录下新建Gender类,代码如下:
四、测试,新建一个Junit测试类PersonTest,将其放在junit.test包下(不要忘了导入Junit的包),其代码如下:
然后运行测试即可。
JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据。它的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate、Toplink、JDO等ORM框架各自为营的局面。值得注意的是,JPA是在充分吸收现有Hibernate、Toplink、JDO等ORM框架的基础上发展而来的,具有易于使用、伸缩性强等优点。从目前的开发社区的反应上看,JPA受到了极大的支持和赞扬,其中就包括了Spring与EJB3.0的开发团队。着眼未来几年的技术走向,JPA作为ORM领域的标准化整合者的目标应该不难实现。
JPA的总体思想和现有Hibernate、Toplink、JDO等ORM框架大体一致。总体来说,JPA包括以下3个方面的技术:
ORM映射元数据
JPA支持XML和JDK5.0注释(也可译作注解)两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。
Java持久化API
用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有事情,开发者可以从繁琐的JDBC和SQL代码中解脱出来。
查询语言
这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语句查询数据,避免程序的SQL语句紧密耦合。
提示:JPA不是一种新的ORM框架,它的出现只是用于规范现有的ORM技术,它不能取代现有的Hibernate、Toplink、JDO等ORM框架。相反,在采用JPA开发时,我们仍将使用到这些ORM框架,只是此时开发出来的应用不再依赖于某个持久化提供商。应用可以在不修改代码的情况下在任何JPA环境下运行,真正做到低耦合,可扩展的程序设计。
下面依托Hibernate做配置:
一、首先建立一个Java项目,名为JPA,然后将hibernate下的包导入进来(需要导入的hibernate的包在下面,可供下载),同时将数据库的驱动类导入(我这里用的是MySql,驱动类也在下面,可供下载)
二、在类的根目录下新建一个文件夹:META-INF,在META-INF中新建一个xml文件:persistence.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <persistence 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" version="1.0"> <persistence-unit name="itcast" transaction-type="RESOURCE_LOCAL"> <properties> <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&characterEncoding=UTF-8" /> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/> <property name="hibernate.connection.driver_class" value="org.gjt.mm.mysql.Driver" /> <property name="hibernate.connection.username" value="root" /> <property name="hibernate.connection.password" value="root" /> <property name="hibernate.max_fetch_depth" value="3" /> <property name="hibernate.hbm2ddl.auto" value="update" /> </properties> </persistence-unit> </persistence>
三、新建一个类:Person,放在cn.itcast.bean包下,代码如下:
package cn.itcast.bean; import java.util.Date; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Lob; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; @Entity //标注为实体类 @Table(name="person")//对应数据库中表的名字 public class Person { private Integer id; private String name; private Date date; private Gender gender = Gender.MAN; private String info; private Byte[] file; private String imagepath; public Person(){} public Person(String name,Date date) { this.name = name; this.date = date; } /* * @Id标注为该属性为主键, * @GeneratedValue(strategy=GenerationType.AUTO) * 标注为主键的生成方式,AUTO为根据数据库类型自动设置 */ @Id @GeneratedValue(strategy=GenerationType.AUTO) public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } //@Column标注了对应列的名字,长度,和是否为空 @Column(name="name",length=10,nullable=false) public String getName() { return name; } public void setName(String name) { this.name = name; } /* * @Temporal标注Date类型,其中Temporal.DATE为只保持日期 * Temporal.TIME 只保存时间 * TemporalType.TIMESTAMP 保存日期+时间 */ @Temporal(TemporalType.TIMESTAMP) public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } /* * @Enumerated 标注枚举类型 * EnumType.STRING 将string类型保存在数据库中 */ @Enumerated(EnumType.STRING) @Column(length=5,nullable=false) public Gender getGender() { return gender; } public void setGender(Gender gender) { this.gender = gender; } /* * @Lob 标注该字段为 大文本 类型,在数据库中的类型为:longtext */ @Lob public String getInfo() { return info; } public void setInfo(String info) { this.info = info; } /* * @Lob 标注该字段为 大字节 类型,在数据库中的类型为:longblob * @Basic(fetch=FetchType.LAZY) 标注为该属性为延迟加载, * 这样只有当调用getFile()方法时,才会加载该属性--用于存储的较大的值(>1M) * @Basic(fetch=FetchType.EAGER)标注为该属性为立即加载 */ @Lob @Basic(fetch=FetchType.LAZY) public Byte[] getFile() { return file; } public void setFile(Byte[] file) { this.file = file; } /* * 如果我不希望该字段映射对应数据库表的字段: * @Transient */ @Transient public String getImagepath() { return imagepath; } public void setImagepath(String imagepath) { this.imagepath = imagepath; } }
在Person类中用到了枚举类型,再在该目录下新建Gender类,代码如下:
package cn.itcast.bean; public enum Gender { MAN,WOMEN }
四、测试,新建一个Junit测试类PersonTest,将其放在junit.test包下(不要忘了导入Junit的包),其代码如下:
package junit.test; import java.util.Date; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.persistence.Query; import org.junit.BeforeClass; import org.junit.Test; import cn.itcast.bean.Person; public class PersonTest { @BeforeClass public static void setUpBeforeClass() throws Exception { } /* * 四种状态:新建状态,托管状态,游离状态,删除状态 * 保存为新建状态 */ @Test public void savePerson(){ //类似于Hibernate中获取SessionFactory EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast"); //类似于Hibernate中获取Session EntityManager em =factory.createEntityManager(); //打开事务 em.getTransaction().begin(); em.persist(new Person("传智播客学习",new Date())); //提交事务 em.getTransaction().commit(); //类似于Hibernate中关闭Session em.close(); //类似于Hibernate中关闭SessionFactory factory.close(); } //获取一条的方法 @Test public void getPerson(){ EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast"); EntityManager em =factory.createEntityManager(); Person person = em.find(Person.class, 1);//get()--Hibernate中,如果找不到,则会返回null System.out.println(person.getName()); em.close(); factory.close(); } @Test public void getPerson2(){ EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast"); EntityManager em =factory.createEntityManager(); /* * 该方法类似于hibernate中的load()方法,先为该对象创建一个代理对象, * 当第一次使用数据时,才会初始化该对象,如果找不到,则会在“a”处返回一个例外 */ Person person = em.getReference(Person.class, 1);//load()--Hibernate中 System.out.println(person.getName());//a em.close(); factory.close(); } //修改的方法 @Test public void updatePerson(){ EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast"); EntityManager em =factory.createEntityManager(); em.getTransaction().begin(); Person person = em.find(Person.class, 1); person.setName("老张");//托管状态 em.getTransaction().commit(); em.close(); factory.close(); } @Test public void updatePerson2(){ EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast"); EntityManager em =factory.createEntityManager(); em.getTransaction().begin(); Person person = em.find(Person.class, 1); em.clear();//将实体管理器中所有的实体变成游离状态 person.setName("老黎活明");//游离状态 em.merge(person); em.getTransaction().commit(); em.close(); factory.close(); } //删除的方法 @Test public void deletePerson(){ EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast"); EntityManager em =factory.createEntityManager(); em.getTransaction().begin(); Person person = em.find(Person.class, 1); em.remove(person); em.getTransaction().commit(); em.close(); factory.close(); } //查询所有 @SuppressWarnings("unchecked") @Test public void getPersons(){ EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast"); EntityManager em =factory.createEntityManager(); Query query = em.createQuery("select o from Person o");//JQL语句 List<Person> persons = query.getResultList(); for(Person person : persons) System.out.println(person.getName()); em.close(); factory.close(); } //通过query方法查询一条 @SuppressWarnings("unchecked") @Test public void query(){ EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast"); EntityManager em =factory.createEntityManager(); Query query = em.createQuery("select o from Person o where id=?1"); query.setParameter(1, 1); //方法一: Person person = (Person) query.getSingleResult();//类似于Hibernate中的session.uniqueResult System.out.println(person.getName()); //方法二: /* List<Person> persons = query.getResultList(); for(Person person : persons) System.out.println(person.getName());*/ em.close(); factory.close(); } // 通过query方法修改 @Test public void updateQuery(){ EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast"); EntityManager em =factory.createEntityManager(); em.getTransaction().begin(); Query query = em.createQuery("update Person o set o.name=:name where o.id=:id"); query.setParameter("name", "老李"); query.setParameter("id", 1); query.executeUpdate(); em.getTransaction().commit(); em.close(); factory.close(); } //通过query方法删除 @Test public void deleteQuery(){ EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast"); EntityManager em =factory.createEntityManager(); em.getTransaction().begin(); Query query = em.createQuery("delete from Person o where o.id=:id"); query.setParameter("id",1); query.executeUpdate(); em.getTransaction().commit(); em.close(); factory.close(); } }
然后运行测试即可。
- mysql-connector-java-5.0.4-bin.jar (484.3 KB)
- 下载次数: 11
- hibernate3.3.2.rar (5.1 MB)
- 下载次数: 14
发表评论
-
JPA学习总结(五)--JPACompositePK联合主键
2010-07-28 18:17 931步骤1.新建java项目:JPACompositePK,将hi ... -
JPA学习总结(四)--JPAManyToMany双向关联
2010-07-27 21:10 2345步骤1.新建java项目:JPAManyToMany,将hib ... -
JPA学习总结(三)--JPAOneToMany双向关联
2010-07-26 12:49 1699步骤1.新建java项目:JPAOneToMany,将hibe ... -
JPA学习总结(二)--JPAOneToOne双向关联
2010-07-26 12:02 1156步骤1.新建java项目:JPAOneToOne,将hiber ...
相关推荐
Spring Boot+Jpa多数据源配置Demo,可同时支持多种数据库,不同数据库,同时支持不同数据库的JdbcTemplate
SpringBoot初学者教程 IDEA数据库配置-迅速爬...通过本教程,你将掌握如何配置 SpringBoot 项目的数据库连接信息,如何使用 IDEA 数据库工具,如何创建数据库,如何配置数据库连接信息,以及如何使用 JPA 操作数据库。
准备一个名为“ spring-data-jpa-with-rest”的mysql数据库(可以根据需要命名) 配置 更改配置 src \ main \ resources \ db.properties 更改jdbc.driver,jdbc.url,jdbc.username,jdbc.password 跑步 运行此...
本文档主要记录了一些我在项目中使用JPA时总结的一些小点,包括:配置、查询(包括动态查询+分页)、传参、基本注解等
数据库配置 spring.jpa.hibernate.ddl-auto: create 启动时生成表 spring.jpa.hibernate.ddl-auto: create-drop 启动时生成表,关闭时删除表结构 spring.jpa.hibernate.ddl-auto: update 根据实体生成表结构,实体...
Eclipse下配置JPA生成数据库表对应的已注解实体类(图文详解),自己亲自配置成功后截图讲解,通过数据库中的表直接生成已经注解好的实体类,很神奇...
spring boot简单应该,配置yml文件,实现mysql数据库的连接,对数据进行增删改查
JPA注解详解 hibernate 标注 适合各种数据库 Hibernate+JPA注解教程
克隆存储库git clone https://github.com/callicoder/spring-boot-postgresql-jpa-hibernate-rest-api-demo.git 2.配置PostgreSQL 首先,创建一个名为postgres_demo的数据库。 然后,打开src/main/resources/...
持久性 使用JPA和H2数据库进行Hibernate的最简单配置
本资源包含了两个子项目,分别进行了springboot+jpa+jdbcTemplate的多数据源独立事务配置和jta分布式事务配置,并针对不同的情况编写了事务配置测试接口,还演示了JPA的domain一对多自动生成数据库表且不生成数据库...
使用Spring Boot 2.1.6轻松实现JPA操作MySQL数据库的CRUD,以及分页和排序功能。在Spring Boot 2.x版本中可以非常轻松、快速搞定持久层的开发动作,配置比SpringBoot+MyBatis还少,偶觉得它除了执行效果不如...
NULL 博文链接:https://joknm.iteye.com/blog/443512
Spring Data JPA 是一款基于 Java 持久层 API(JPA)的框架,提供了一个通用的数据访问层解决方案,能够简化 Java 应用程序中的数据访问工作。Spring Boot 作为一个流行的 Java 框架,提供了一个快速开发的平台,...
使用 JPA,您可以将任何普通的旧式 Java 对象 (POJO) 类指定为 JPA 实体:一个应使用 JPA 持续性提供程序的服务将其非临时字段持久保存到关系数据库(在 Java EE EJB 容器的内部或在简单 Java SE 应用程序中的 EJB ...
Springboot中使用Druid+JPA,列举了在Springboot中如何搭配使用Druid+JPA操作数据库。
带有spring.jpa.open-in-view和JDBCTemplate的意外问题的复制者这个仓库是一个最小的Spring Boot应用程序,可以...并通过JDBCTemplate Foo实体该应用程序的数据库连接池大小为5,并且配置了spring.jpa.open-in-view=tr
常见数据库jndi 配置文件
spring-boot-jpa-模板 关于 这是 Spring Boot JPA 应用程序的模板。 配置文件是src/main/resources/application.yml ,它被解析。 应用程序的入口点是Application 。 密码加密 数据库密码使用以加密形式存储在...