JPA:它是java persistence api,java持久化规范
- JPA是一套ORM规范,hibernate实现了JPA规范。
- hibernate中有自己的ORM操作数据库方式(JPA没出现时),也有JPA规范实现的操作数据库方式。
- 在数据库增删改查操作中,我们hibernate和JPA的操作都要会。
1、导入jpa支持的jar包
2、在src目录下新建META-INF文件夹,然后在文件夹下创建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_2_0.xsd"
version="2.0">
<!-- 配置持久化单元,可以配置多个,但是名称不能重复
name:用于指定持久化单元名称
transaction-type:指定事务的类型
JTA:Java Transaction API
RESOURCE_LOCAL:指的是本地代码事务(我们用这个)-->
<persistence-unit name="myJPAUnit" transaction-type="RESOURCE_LOCAL">
<!-- JPA规范的提供商,可以不写 -->
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<!-- 指定由JPA注解的实体类位置,可以不写 -->
<class>org.haiwen.entity.Goods</class>
<properties>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/hibernate" />
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password" value="root" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<!-- 设置hibernate的连接池提供商 -->
<property name="hibernate.connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider" />
</properties>
</persistence-unit>
</persistence>
3、工具类JPAUtils.java
public class JPAUtils {
private static EntityManagerFactory factory;
static {
factory = Persistence.createEntityManagerFactory("myJPAUnit");// 与配置文件映射
}
// 获取JPA操作数据库的对象
public static EntityManager createEntityManager() {
return factory.createEntityManager();
}
public static void main(String[] args) {
createEntityManager();
}
}
4、实体类Goods.java
//使用的注解都是JPA规范,所以导包,都需要导入javax.persistence包下的
@Entity // 表明该类是一个实体类
@Table(name = "goods") // 建立当前类和数据库表的对应关系
public class Goods {
@Id // 表明当前字段是主键
@Column(name = "goods_id") // 表明对应数据库字段是goods_id
// @GeneratedValue:指定主键生成策略
// strategy:使用JPA中提供的主键生成策略
// generator:使用hibernate中的主键生成策略
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer goodsId;
@Column(name = "goods_name")
private String goodsName;
@Column(name = "goods_price")
private Float goodsPrice;
@Column(name = "goods_number")
private Integer goodsNumber;
保存
public void save() {
Goods goods = new Goods();
goods.setGoodsName("孟婆汤");
goods.setGoodsNumber(10);
goods.setGoodsPrice(520f);
// 1.获取EntityManager对象
EntityManager entityManager = JPAUtils.createEntityManager();
// 2.获取事务对象
EntityTransaction entityTransaction = entityManager.getTransaction();
// 3.开启事务
entityTransaction.begin();
// 4.执行保存操作
entityManager.persist(goods);
// 5.提交事务
entityTransaction.commit();
// 6.关闭资源
entityManager.close();
}
查找 - 立即加载
public void find() {
EntityManager entityManager = JPAUtils.createEntityManager();
EntityTransaction entityTransaction = entityManager.getTransaction();
entityTransaction.begin();
Goods goods = entityManager.find(Goods.class, 1);
System.out.println(goods);
entityTransaction.commit();
entityManager.close();
}
查找 - 延迟加载
public void getReference() {
EntityManager entityManager = JPAUtils.createEntityManager();
EntityTransaction entityTransaction = entityManager.getTransaction();
entityTransaction.begin();
Goods goods = entityManager.getReference(Goods.class, 1);
System.out.println(goods);
entityTransaction.commit();
entityManager.close();
}
查找 - 条件查询
public void query() {
/**
* 涉及的对象:JPA的Query
* 获取该对象:EntityManager的createQuery(String jpql);
* 参数含义:JQPL,Java Persistence Query Language
* 写实体类名和属性名
*/
EntityManager entityManager = JPAUtils.createEntityManager();
EntityTransaction entityTransaction = entityManager.getTransaction();
entityTransaction.begin();
Query query = entityManager.createQuery("select g from Goods g where goodsName = ?");
query.setParameter(1, "孟婆汤");// 占位符从1开始
List list = query.getResultList();
for (Object object : list) {
System.out.println(object);
}
entityTransaction.commit();
entityManager.close();
}
更新 - 方法一
public void updateFind() {
EntityManager entityManager = JPAUtils.createEntityManager();
EntityTransaction entityTransaction = entityManager.getTransaction();
entityTransaction.begin();
Goods goods = entityManager.find(Goods.class, 1);
goods.setGoodsName("人参果");
entityTransaction.commit();
entityManager.close();
}
更新 - 方法二
public void updateGet() {
EntityManager entityManager = JPAUtils.createEntityManager();
EntityTransaction entityTransaction = entityManager.getTransaction();
entityTransaction.begin();
Goods goods = entityManager.getReference(Goods.class, 1);
goods.setGoodsName("唐僧肉");
entityManager.merge(goods); // merge是合并(两个实体类合并)
entityTransaction.commit();
entityManager.close();
}
删除
public void remove() {
EntityManager entityManager = JPAUtils.createEntityManager();
EntityTransaction entityTransaction = entityManager.getTransaction();
entityTransaction.begin();
Goods goods = entityManager.find(Goods.class, 1);
entityManager.remove(goods);
entityTransaction.commit();
entityManager.close();
}