JPA快速入门
JPA概述:
JPA的全称是Java Persistence API, 即Java 持久化API,是SUN公司推出的一套基于ORM的规范,内部是由一系列的接口和抽象类构成。
JPA通过JDK 5.0注解描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
JPA快速入门:
由于JPA是sun公司制定的API规范,所以我们不需要导入额外的JPA相关的jar包,只需要导入JPA的提供商的jar包。
这里选择Hibernate作为JPA的提供商,所以需要导入Hibernate的maven坐标。
1.导入坐标
<properties> <project.hibernate.version>5.0.7.Final</project.hibernate.version> </properties> <dependencies> <!-- junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- hibernate对jpa的支持包 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>${project.hibernate.version}</version> </dependency> <!-- c3p0 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-c3p0</artifactId> <version>${project.hibernate.version}</version> </dependency> <!-- log日志 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!-- Mysql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> </dependencies>
2.配置JPA的核心配置文件
在工程的resources路径下创建一个名为META-INF的文件夹,在此文件夹下创建一个名为persistence.xml的配置文件
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0"> <!-- 配置持久化单元 name:持久化单元名称 transaction-type:事务类型 RESOURCE_LOCAL:本地事务管理 JTA:分布式事务管理 --> <persistence-unit name="myJPA" transaction-type="RESOURCE_LOCAL"> <!-- 配置JPA规范的服务提供商 --> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <properties> <!-- 数据库驱动 --> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> <!-- 数据库地址 --> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpa" /> <!-- 数据库用户名 --> <property name="javax.persistence.jdbc.user" value="root" /> <!-- 数据库密码 --> <property name="javax.persistence.jdbc.password" value="root" /> <!-- jpa提供者的可选配置:我们的JPA规范的提供者为hibernate,所以jpa的核心配置中兼容hibernate的配置 --> <property name="hibernate.show_sql" value="true" /> <!-- 显示SQL --> <property name="hibernate.format_sql" value="true" /> <!-- 格式化SQL语句 --> <!-- 自动创建数据库表 取值:create 如果有表先删除再创建 update 如果有表,不会创建表 none 不创建表 --> <property name="hibernate.hbm2ddl.auto" value="update" /> </properties> </persistence-unit> </persistence>
3.创建客户的数据库表(这里采用自动生成数据库表)和客户的实体类
public class Customer implements Serializable { private Long custId; private String custName; private String custSource; private String custIndustry; private String custLevel; private String custAddress; private String custPhone; /*************** get和set方法 ***************/ }
4.编写实体类和数据库表的映射配置
@Entity @Table(name = "cst_customer") public class Customer implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) // 配置主键的生成策略 @Column(name = "cust_id") private Long custId; @Column(name = "cust_name") private String custName; @Column(name = "cust_source") private String custSource; @Column(name = "cust_industry") private String custIndustry; @Column(name = "cust_level") private String custLevel; @Column(name = "cust_address") private String custAddress; @Column(name = "cust_phone ") private String custPhone;
/*************** get和set方法 ***************/ }
常用注解的说明:
@Entity
作用:指定当前类是实体类。
@Table
作用:指定实体类和表之间的对应关系。
属性:name:指定数据库表的名称
@Id
作用:指定当前字段是主键。
@GeneratedValue
作用:指定主键的生成方式。。
属性:strategy :指定主键生成策略。
取值:
IDENTITY:主键由数据库自动生成(主要是自动增长型) mysql
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。 Oracle
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator="指定序列")
AUTO:主键由程序控制
TABLE:使用一个特定的数据库表格来保存主键
@Column
作用:指定实体类属性和数据库表之间的对应关系
属性:
name:指定数据库表的列名称。
unique:是否唯一
nullable:是否可以为空
inserttable:是否可以插入
length:长度
updateable:是否可以更新
columnDefinition: 定义建表时创建此列的DDL
@secondaryTable: 指定注释的实体类的辅助表。指定一个或多个辅助表指示实体类的数据存储在多个表中。
5.测试
public class JPATest { @Test public void testSave() { /** * 创建实体管理工厂,借助Persistence 的静态方法获取 * 其中传递的参数为持久化单元名称,需要在JPA配置文件中指定 */ EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJPA"); //创建实体管理类 EntityManager em = factory.createEntityManager(); //获取事务对象 EntityTransaction tx = em.getTransaction(); //开启事务 tx.begin(); Customer c = new Customer(); c.setCustName("小明"); //保存操作 em.persist(c); //提交事务 tx.commit(); //释放资源 em.close(); factory.close(); } }