导入jar包,jpa和hibernate required
新建文件夹和xml文件
引用的库下找到xsd文件
XML文件配置
将提示信息导入
主配置persistence.xml
org.hibernate.jpa.HibernatePersistenceProvider
com.itheima.domain.Customer
数据库新建数据库
创建工具类
JPAUtils.java
package com.itheima.utils;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/*
* JPA工具类
* */
public class JPAUtil {
//就相当于SessionFactory
private static EntityManagerFactory factory;
static {
//到配置文件中找
factory = Persistence.createEntityManagerFactory("myJPAUnit");
}
/*
* 获取JPA操作数据库的对象
* */
public static EntityManager createEntityManager() {
return factory.createEntityManager();
}
public static void main(String[] args) {
createEntityManager();
}
}
运行生成表
增删改查
package com.itheima.test;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import org.junit.Test;
import com.itheima.domain.Customer;
import com.itheima.utils.JPAUtil;
/*
* JPA的入门案例
* JPA单表操作数据库
*
* */
public class JPADemo1 {
//保存
@Test
public void test1() {
//创建客户对象
Customer c = new Customer();
c.setCustName("JPA haha");
//获取EntityManager对象
EntityManager em = JPAUtil.createEntityManager();
//获取事务对象,并开启事务
EntityTransaction tx = em.getTransaction();
tx.begin();
//执行保存操作
em.persist(c);
//提交事务
tx.commit();
//关闭资源
em.close();
}
//查询一个实体
@Test
public void test2() {
//获取EntityManager对象
EntityManager em = JPAUtil.createEntityManager();
//获取事务对象,并开启事务
EntityTransaction tx = em.getTransaction();
tx.begin();
//执行更新操作(需要把更新的对象先查询出来)
Customer c = em.find(Customer.class, 1L);
System.out.println(c);
//提交事务
tx.commit();
//关闭资源
em.close();
}
//查询一个实体,延迟加载
@Test
public void test2_1() {
//获取EntityManager对象
EntityManager em = JPAUtil.createEntityManager();
//获取事务对象,并开启事务
EntityTransaction tx = em.getTransaction();
tx.begin();
//执行更新操作(需要把更新的对象先查询出来)
Customer c = em.getReference(Customer.class, 1L);
System.out.println(c);
//提交事务
tx.commit();
//关闭资源
em.close();
}
//查询一个实体
@Test
public void test3() {
//获取EntityManager对象
EntityManager em = JPAUtil.createEntityManager();
//获取事务对象,并开启事务
EntityTransaction tx = em.getTransaction();
tx.begin();
//执行更新操作(需要把更新的对象先查询出来)
Customer c = em.find(Customer.class, 1L);
System.out.println(c);
//修改客户地址为:顺义区
c.setCustAddress("顺义区");
//提交事务
tx.commit();
//关闭资源
em.close();
}
//更新的另一种操作方式
//merge合并(两个实体合并)
@Test
public void test4() {
//获取EntityManager对象
EntityManager em = JPAUtil.createEntityManager();
//获取事务对象,并开启事务
EntityTransaction tx = em.getTransaction();
tx.begin();
//执行更新操作(需要把更新的对象先查询出来)
Customer c = em.find(Customer.class, 1L);
//修改客户地址为:顺义区
c.setCustAddress("北京市顺义区");
em.merge(c);
//提交事务
tx.commit();
//关闭资源
em.close();
}
//删除操作
@Test
public void test5() {
//获取EntityManager对象
EntityManager em = JPAUtil.createEntityManager();
//获取事务对象,并开启事务
EntityTransaction tx = em.getTransaction();
tx.begin();
//执行更新操作(需要把更新的对象先查询出来)
Customer c = em.find(Customer.class, 1L);
//删除
em.remove(c);
//提交事务
tx.commit();
//关闭资源
em.close();
}
//查询所有
/*
* 涉及的对象:
* JPA的Query
* 用EntityManager的createQuery(String jpql)
*参数含义:
* JQPL:Java Persistence Query Language
* 写法和HQL很相似,也是把表明换成类名,把字段名换成属性名称
* 它在写查询所有时,不能直接用
* from 实体类
* 需要select使用关键字
* select c from Customer c
* */
@Test
public void test6() {
//获取EntityManager对象
EntityManager em = JPAUtil.createEntityManager();
//获取事务对象,并开启事务
EntityTransaction tx = em.getTransaction();
tx.begin();
//执行更新操作(需要把更新的对象先查询出来)
Query query = em.createQuery("select c from Customer c where custName like ? and custLevel = ?");
//给占位符赋值
query.setParameter(1, "%集%");
query.setParameter(2, "23");
//执行方法获取结果集
List list = query.getResultList();
for(Object o : list) {
System.out.println(o);
}
//提交事务
tx.commit();
//关闭资源
em.close();
}
}
merge方法的实际作用
package com.itheima.domain;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.itheima.utils.HibernateUtils;
/*
* 演示hibernate的update方法的问题
* */
public class HibernateDemo7 {
/*
* 查询id为1的客户
* 关闭session(清空一级缓存和快照)
* 修改id为1的客户名称为 hahaha
* 再次获取session
* 再次查询id为1的客户
* 更新刚才修改的客户
*
* */
@Test
public void test1() {
Session s = HibernateUtils.openSession();
Transaction tx = s.beginTransaction();
Customer c = s.get(Customer.class, 1L);
tx.commit();
s.close();//关闭
c.setCustName("hahaha");//托管态
Session s1 = HibernateUtils.openSession();
Transaction tx1 = s1.beginTransaction();
//再次查询
Customer c1 = s.get(Customer.class, 1L);//持久态
//更新修改对象
//s1.update(c);//把托管态转换成持久态
// 只能用merge
s1.merge(c);
tx1.commit();
s1.close();
}
}
当我们更改托管态的值时,update就会出错,出现两个OID一样,值却不一样的数据,只能用merge