目录
JPAUtil工具类
public class JPAUtil {
private static final EntityManagerFactory factory;
static {
factory = Persistence.createEntityManagerFactory("myJpa");
}
public static EntityManager getEntityManager(){
return factory.createEntityManager();
}
}
保存
@Test
public void testSave() {
Customer customer = new Customer();
customer.setCustName("测试");
EntityManager em = JPAUtil.getEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
em.persist(customer);
tx.commit();
em.close();
}
根据id查询
find方法是会使用缓存的
@Test
public void testFind() {
EntityManager em = JPAUtil.getEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Customer customer = em.find(Customer.class, 1L);
System.out.println(customer);
tx.commit();
em.close();
}
使用延迟加载策略 查询
延迟加载,调用getReference时,不会发送sql语句查询数据库,而是当使用这个对象时(获取对象的属性),再去查询数据库;
返回的是代理对象;
/**
* 查询一个: 使用延迟加载策略
*/
@Test
public void testFind3() {
EntityManager em = JPAUtil.getEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Customer customer = em.getReference(Customer.class,1L);
System.out.println(customer);
tx.commit();
em.close();
}
修改
先根据id查询一个对象,再更新:
@Test
public void testUpdate() {
EntityManager em = JPAUtil.getEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
//先查询
Customer customer = em.find(Customer.class, 1L);
//修改对象
customer.setCustAddress("航头");
tx.commit();//事务提交时,自动更新
em.close();
}
也可以先new一个对象,给对象指定id,指定新的属性值,再调用meger方法更新这个对象:
@Test
public void testUpdate2() {
EntityManager em = JPAUtil.getEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Customer customer = new Customer();
customer.setCustId(1L);
customer.setCustName("程序员");
customer.setCustAddress("江苏");
em.merge(customer);//更新对象
tx.commit();
em.close();
}
删除
不能直接new一个对象,然后删除。
@Test
public void testDelete() {
EntityManager em = JPAUtil.getEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
//先查询
Customer customer = em.find(Customer.class, 1L);
//再删除
em.remove(customer);
tx.commit();
em.close();
}
JPA中的复杂查询
JPQL全称Java Persistence Query Language
基于首次在EJB2.0中引入的EJB查询语言(EJB QL),Java持久化查询语言(JPQL)是一种可移植的查询语言,旨在以面向对象表达式语言的表达式,将SQL语法和简单查询语义绑定在一起·使用这种语言编写的查询是可移植的,可以被编译成所有主流数据库服务器上的SQL。
其特征与原生SQL语句类似,并且完全面向对象,通过类名和属性访问,而不是表名和列名。
查询全部
@Test
public void findAll() {
EntityManager em = JPAUtil.getEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
//创建查询对象,写的是JPQL语句 Customer 类名
Query query = em.createQuery("from Customer");
List<Customer> list = query.getResultList();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
em.close();
}
分页查询
@Test
public void findPage() {
EntityManager em = JPAUtil.getEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
//创建查询对象,写的是JPQL语句
Query query = em.createQuery("from Customer");
//开始
query.setFirstResult(0);
//查几个
query.setMaxResults(2);
List<Customer> list = query.getResultList();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
em.close();
}
条件查询
@Test
public void findLike() {
EntityManager em = JPAUtil.getEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
//创建查询对象,写的是JPQL语句 Customer 类名 custName 类中的属性名
Query query = em.createQuery("from Customer where custName like ?");
//给占位符设置值
query.setParameter(1,"%测试%");
List<Customer> list = query.getResultList();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
em.close();
}
排序查询
@Test
public void findOrder() {
EntityManager em = JPAUtil.getEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
//创建查询对象,写的是JPQL语句
Query query = em.createQuery("from Customer order by custId desc");
List<Customer> list = query.getResultList();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
em.close();
}
统计查询
@Test
public void findCount() {
EntityManager em = JPAUtil.getEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
//创建查询对象,写的是JPQL语句
Query query = em.createQuery("select count(*) from Customer");
Long total = (Long) query.getSingleResult();
System.out.println(total);
tx.commit();
em.close();
}