jpa全称(Java Persistence API)既java持久化API,Java EE 5.0 平台标准的 ORM 规范,使得应用程序以统一的方式访问持久层。
那么也就是说JPA其实是一组orm规范,并不是orm框架,像我们平时用过的hibernate,其实就是符合jpa规范的一个orm框架。有点像JDBC,与JDBC驱动,的关系。目前Hibernate 3.2+、TopLink 10.1+ 以及 OpenJPA 都提供了 JPA 的实现。 画一张图来更形象的说明他们的关系如下图所示:: 下面来记录一下JPA的入门程序。这里使用的jpa实现是hibernate (1)准备工作建立maven工程,导入所需的maven依赖
<!--导入相关依赖--> <dependencies> <!--引入hibernate依赖--> <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.3.6.Final</version> </dependency> <!--引入jpa依赖--> <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>5.4.0.Final</version> </dependency> <!--引入hibernate-jpa--> <!-- https://mvnrepository.com/artifact/org.hibernate.javax.persistence/hibernate-jpa-2.1-api --> <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> <version>1.0.0.Final</version> </dependency> <!--数据库驱动包--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.32</version> </dependency> <!--测试相关包--> <!--测试包--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies>在资源路径下建立一个META-INF文件夹,加入配置文件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="jpa" transaction-type="RESOURCE_LOCAL"> <!-- 配置使用什么 ORM 产品来作为 JPA 的实现 1. 实际上配置的是 javax.persistence.spi.PersistenceProvider 接口的实现类 2. 若 JPA 项目中只有一个 JPA 的实现产品, 则也可以不配置该节点. --> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <!--添加持久化类--> <class>com.kuake.Student</class> <!--配置数据库信息--> <properties> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> <property name="javax.persistence.jdbc.url" value="jdbc:mysql:///jpa"/> <property name="javax.persistence.jdbc.user" value="root"/> <property name="javax.persistence.jdbc.password" value="root"/> <!-- 配置 JPA 实现产品的基本属性. 配置 hibernate 的基本属性 --> <!--格式化sql--> <property name="hibernate.format_sql" value="true"/> <!--在控制台打印sql--> <property name="hibernate.show_sql" value="true"/> <!--自动建表--> <property name="hibernate.hbm2ddl.auto" value="update"/> </properties> </persistence-unit> </persistence>(2)编写持久化的类
@Table(name = "jsp_student")//建表名称 public class Student { private Integer id; private String name; private Integer age; private String email; @Id //主键 @GeneratedValue(strategy = GenerationType.AUTO)//主键生成策略 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } //列的名字 @Column(name = "username") public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } } @Entity表示这是一个实体类与数据库对应@Table()指定表名@Column指定对应属性在数据库的列名,(如果不设置,默认就是该字段名)(3)编写测试类
public class DemoTest { @Test public void test(){ //创建EntityManagerFactory EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("jpa"); //创建EntityManager对象 EntityManager entityManager = entityManagerFactory.createEntityManager(); // 获得并且开启事物 EntityTransaction transaction = entityManager.getTransaction(); transaction.begin(); //持久化操作 Student student = new Student(); student.setAge(12); student.setEmail("123@qq.com"); student.setName("jack"); entityManager.persist(student); //提交事务 transaction.commit(); //关闭EntityManager对象 entityManager.close(); //关闭EntityManagerFactory entityManagerFactory.close(); } }输出: *加粗样式 观察一下控制台,发现执行了一条创建表语句,跟插入数据语句 然后查看数据库: 表创建成功,数据也成功插入了,表名就是我们@Table()所设置的表面。然后除去我们@Column(name = "username")标注的列名外,默认值都是我们持久类的字段名。