JPA入门案例完成增删改查(2)

简介: JPA入门案例完成增删改查(2)

四、入门案例--增删改查

1.jpa的操作步骤

1.加载配置文件创建工厂(实体管理类工厂)对象


2.通过实体管理类工厂获取实体管理类


3.获取事务对象,开启事务


4.完成增删改查


5.提交事务(回滚事务)


6.释放资源


2.基本操作的详细介绍

1.加载配置文件创建实体管理器工厂


EntityManagerFactory myJpa = Persistence.createEntityManagerFactory("myJpa");    

根据持久化单元名称创建实体管理器工厂,持久化单元名称就是配置文件中


persistence-unit的name属性


2.根据实体管理器工厂,创建实体管理器


//通过实体管理器工厂获取实体管理器

EntityManager em = myJpa.createEntityManager();

EntityManager内部维护的很多的内容


  内部维护了数据库信息,


  维护了缓存信息


  维护了所有的实体管理器对象


EntityManagerFactory是一个线程安全的对象


3.创建事务对象,开启事务


//3.获取事务对象

EntityTransaction tx = em.getTransaction();

 Transaction 对象 : 事务


  begin:开启事务


  commit:提交事务


  rollback:回滚


4.增删改查操作


  presist : 保存


  merge  : 更新


  remove : 删除


  find/getRefrence : 根据id查询


5.提交事务或者回滚事务


tx.commit();

tx.rollback();


6.释放资源

//先申请的后释放
//先释放实体管理器--EntityManager
//后释放实体管理器工厂--EntityManagerFactory

五、代码实战

使用JPA封装好的方法

/**
 * @Author: Promsing(张有博)
 * @Date: 2021/10/16 - 8:41
 * @Description: jpa的测试类,完成增删改查操作
 * @version: 1.0
 */
public class JpaTest {
     /**
     * 保存操作
     *   persist(Object)
     *
     */
    @Test
    public void testSave(){
        //1.加载配置文件创建工厂对象
        EntityManagerFactory myJpa = Persistence.createEntityManagerFactory("myJpa");
        //2.通过实体管理器工厂获取实体管理器
        EntityManager em = myJpa.createEntityManager();
        //3.获取事务对象,开启事务
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        //4.完成增删改查操作
        Customer customer=new Customer();
        customer.setCustName("小小张自由");
        customer.setCustAddress("廊坊");
        customer.setCustIndustry("教育");
        customer.setCustLevel("高级");
        customer.setCustPhone("1502800");
        customer.setCustSource("邯郸");
        //5.保存,提交事务
        em.persist(customer);
        tx.commit();
        //7.释放资源
        em.close();
        myJpa.close();
    }
     /**
     * 根据id查询
     *   find(需要封装实体类的字节码文件,主键值)
     *     立即加载,获取实体对象,立即执行SQL语句,查询数据库
     */
    @Test
    public void testFind(){
        //1.加载配置文件创建工厂对象
        EntityManagerFactory myJpa = Persistence.createEntityManagerFactory("myJpa");
        //2.通过实体管理器工厂获取实体管理器
        EntityManager em = myJpa.createEntityManager();
        //3.获取事务对象,开启事务
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        //4.完成增删改查操作
        /**
         * find(需要封装实体类的字节码文件,主键值)
         * 立即加载,获取实体对象,立即执行SQL语句,查询数据库
         */
        Customer customer = em.find(Customer.class, 2L);
        System.out.println(customer);
        //5.保存,提交事务
        tx.commit();
        //7.释放资源
        em.close();
        myJpa.close();
    }
    /**
     * 根据id查询
     *  getReference(需要封装实体类的字节码文件,主键值)
     *   延迟加载(懒加载),获取动态代理对象,延迟执行SQL语句,
     *   当使用到代理对象时,查询数据库
     */
    @Test
    public void testReference(){
        //1.加载配置文件创建工厂对象
        EntityManagerFactory myJpa = Persistence.createEntityManagerFactory("myJpa");
        //2.通过实体管理器工厂获取实体管理器
        EntityManager em = myJpa.createEntityManager();
        //3.获取事务对象,开启事务
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        //4.完成增删改查操作
        /**
         * getReference(需要封装实体类的字节码文件,主键值)
         * 延迟加载,获取动态代理对象,延迟执行SQL语句,
         * 当使用到代理对象时,查询数据库
         */
        Customer customer = em.getReference(Customer.class, 2L);
        System.out.println(customer);
        //5.保存,提交事务
        tx.commit();
        //7.释放资源
        em.close();
        myJpa.close();
    }
    /**
     * 删除客户的案例
     *  remove(Object)
     */
    @Test
    public void testRemove(){
        //1.加载配置文件创建工厂对象
        EntityManagerFactory myJpa = Persistence.createEntityManagerFactory("myJpa");
        //2.通过实体管理器工厂获取实体管理器
        EntityManager em = myJpa.createEntityManager();
        //3.获取事务对象,开启事务
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        //4.完成增删改查操作
            //根据id先查询用户
        Customer customer = em.find(Customer.class, 2L);
            //调用remove方法,完成删除操作
        em.remove(customer);
        //5.保存,提交事务
        tx.commit();
        //7.释放资源
        em.close();
        myJpa.close();
    }
    /**
     * 更新客户的案例
     *   merge(Object)
     */
    @Test
    public void testUpdate(){
        //1.加载配置文件创建工厂对象
        EntityManagerFactory myJpa = Persistence.createEntityManagerFactory("myJpa");
        //2.通过实体管理器工厂获取实体管理器
        EntityManager em = myJpa.createEntityManager();
        //3.获取事务对象,开启事务
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        //4.完成增删改查操作
             //根据id先查询用户
        Customer customer = em.find(Customer.class, 1L);
             //调用remove方法,完成删除操作
        customer.setCustIndustry("架构师");
        em.merge(customer);
        //5.保存,提交事务
        tx.commit();
        //7.释放资源
        em.close();
        myJpa.close();
    }
}

使用JPQL查询

JPQL(Java持久性查询语言)是一种面向对象的查询语言,用于对持久实体执行数据库操作。 JPQL不使用数据库表,而是使用实体对象模型来操作SQL查询。旨在以面向对象表达式语言的表达式,将SQL语法和简单查询语义绑定在一起·使用这种语言编写的查询是可移植的,可以被编译成所有主流数据库服务器上的SQL。


其特征与原生SQL语句类似,并且完全面向对象,通过类名和属性访问,而不是表名和表的属性。


package com.dynamic.test;
import org.junit.Before;
import org.junit.Test;
import javax.persistence.*;
import java.util.List;
/**
 * @Author: Promsing(张有博)
 * @Date: 2021/10/17 - 9:48
 * @Description: JPQL的测试类
 * @version: 1.0
 */
public class JpqlTest {
    private EntityManager em;
    @Before
    public void testBefore(){
        //1.加载配置文件创建工厂对象
        EntityManagerFactory myJpa = Persistence.createEntityManagerFactory("myJpa");
        //2.通过实体管理器工厂获取实体管理器
         em = myJpa.createEntityManager();
    }
    /**
     * 查询全部
     *  sql:SELECT * FROM `cst_customer`
     *  jqpl:from com.dynamic.domain.Customer 或者from Customer
     */
    @Test
    public void testFindAll(){
        //将第一第二步封装起来,
        //在@test执行之前执行Before
        //3.获取事务对象,开启事务
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        //4.完成增删改查操作
        String jqpl="from com.dynamic.domain.Customer";
        Query query = em.createQuery(jqpl);
        //发送查询,并封装结果集
        List resultList = query.getResultList();
        for (Object o : resultList) {
            System.out.println(o);
            System.out.println();
        }
        //5.提交事务
        tx.commit();
        //7.释放资源
        em.close();
//        myJpa.close();
    }
    /**
     * 排序查询,根据id倒叙
     *  sql:SELECT * FROM `cst_customer` ORDER BY cust_id desc ;
     *  jqpl:from Customer order by custId desc
     */
    @Test
    public void testOrders(){
        //将第一第二步封装起来,
        //在@test执行之前执行Before
        //3.获取事务对象,开启事务
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        //4.完成增删改查操作
        String jqpl="from Customer order by id desc";
        Query query = em.createQuery(jqpl);
        //发送查询,并封装结果集
        List resultList = query.getResultList();
        for (Object o : resultList) {
            System.out.println(o);
            System.out.println();
        }
        //5.提交事务
        tx.commit();
        //7.释放资源
        em.close();
//        myJpa.close();
    }
    /**
     * 统计查询,使用count
     *  sql:SELECT COUNT(cust_id) FROM `cst_customer`;
     *  jqpl:SELECT COUNT(id) FROM Customer
     */
    @Test
    public void testCount(){
        //将第一第二步封装起来,
        //在@test执行之前执行Before
        //3.获取事务对象,开启事务
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        //4.完成增删改查操作
        String jqpl="SELECT COUNT(id) FROM Customer";
        Query query = em.createQuery(jqpl);
        //发送查询,并封装结果集
        Object singleResult = query.getSingleResult();
        System.out.println(singleResult);
        //5.提交事务
        tx.commit();
        //7.释放资源
        em.close();
//        myJpa.close();
    }
    /**
     * 分页查询
     *   SQL语句:SELECT * FROM `cst_customer` LIMIT 0,2
     *   jpql语句:使用Query对象
     */
    @Test
    public void testPaged(){
        //将第一第二步封装起来,
        //在@test执行之前执行Before
        //3.获取事务对象,开启事务
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        //4.完成增删改查操作
        String jqpl="from Customer";
        Query query = em.createQuery(jqpl);
        //起始索引
        query.setFirstResult(0);
        //每次查询的长度
        query.setMaxResults(2);
        //发送查询,并封装结果集
        List resultList = query.getResultList();
        for (Object o : resultList) {
            System.out.println(o);
        }
        //5.提交事务
        tx.commit();
        //7.释放资源
        em.close();
//        myJpa.close();
    }
    /**
     * 条件查询
     *   SQL语句:SELECT * FROM `cst_customer` where cust_name LIKE '%自由%'
     *   jpql语句:from Customer where custName like ?
     */
    @Test
    public void testCondition(){
        //将第一第二步封装起来,
        //在@test执行之前执行Before
        //3.获取事务对象,开启事务
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        //4.完成增删改查操作
        String jqpl="from Customer where custName like ?";
        Query query = em.createQuery(jqpl);
        //给占位符赋值,占位符从1开始
        query.setParameter(1,"%自由%");
        //发送查询,并封装结果集
        List resultList = query.getResultList();
        for (Object o : resultList) {
            System.out.println(o);
        }
        //5.提交事务
        tx.commit();
        //7.释放资源
        em.close();
//        myJpa.close();
    }
}

相关文章
|
27天前
|
Java 数据库连接 测试技术
SpringBoot入门 - 添加内存数据库H2
SpringBoot入门 - 添加内存数据库H2
38 3
SpringBoot入门 - 添加内存数据库H2
|
13天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
23天前
|
SQL 数据库
GBase8a 数据库集群v953扩容案例问题分享
GBase8a 数据库集群v953扩容案例问题分享
|
23天前
|
SQL 数据库
gbase 8a 数据库 SQL优化案例-关联顺序优化
gbase 8a 数据库 SQL优化案例-关联顺序优化
|
23天前
|
存储 SQL 数据库
Sybase数据恢复—Sybase数据库常见问题之数据库无法启动的恢复案例
Sybase数据库数据恢复环境: Sybase数据库版本:SQL Anywhere 8.0。 Sybase数据库故障&分析: Sybase数据库无法启动。 使用Sybase Central连接报错。 数据库数据恢复工程师经过检测,发现Sybase数据库出现故障的原因是:异常断电造成Sybase数据库无法回写正常数据,导致多个存储页数据不一致,系统表描述和存储表不一致,部分存储页底层数据完全杂乱。
|
24天前
|
Oracle 关系型数据库 数据库
Oracle数据恢复—Oracle数据库文件有坏快损坏的数据恢复案例
一台Oracle数据库打开报错,报错信息: “system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。管理员联系我们数据恢复中心寻求帮助,并提供了Oracle_Home目录的所有文件。用户方要求恢复zxfg用户下的数据。 由于数据库没有备份,无法通过备份去恢复数据库。
|
1月前
|
存储 Oracle 关系型数据库
oracle数据恢复—Oracle数据库文件大小变为0kb的数据恢复案例
存储掉盘超过上限,lun无法识别。管理员重组存储的位图信息并导出lun,发现linux操作系统上部署的oracle数据库中有上百个数据文件的大小变为0kb。数据库的大小缩水了80%以上。 取出&并分析oracle数据库的控制文件。重组存储位图信息,重新导出控制文件中记录的数据文件,发现这些文件的大小依然为0kb。
|
1月前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
66 13
|
1月前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
47 4
|
17天前
|
存储 Oracle 关系型数据库
服务器数据恢复—华为S5300存储Oracle数据库恢复案例
服务器存储数据恢复环境: 华为S5300存储中有12块FC硬盘,其中11块硬盘作为数据盘组建了一组RAID5阵列,剩下的1块硬盘作为热备盘使用。基于RAID的LUN分配给linux操作系统使用,存放的数据主要是Oracle数据库。 服务器存储故障: RAID5阵列中1块硬盘出现故障离线,热备盘自动激活开始同步数据,在同步数据的过程中又一块硬盘离线,RAID5阵列瘫痪,上层LUN无法使用。
下一篇
DataWorks