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();
    }
}

相关文章
|
23天前
|
SQL 数据可视化 关系型数据库
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
105 0
|
23天前
|
存储 关系型数据库 MySQL
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
|
23天前
|
关系型数据库 MySQL 数据库
轻松入门MySQL:精准查询,巧用WHERE与HAVING,数据库查询如虎添翼(7)
轻松入门MySQL:精准查询,巧用WHERE与HAVING,数据库查询如虎添翼(7)
|
19天前
|
存储 关系型数据库 MySQL
MySQL基础入门:数据库操作全攻略
MySQL基础入门:数据库操作全攻略
48 0
|
23天前
|
SQL 关系型数据库 MySQL
轻松入门MySQL:深入学习数据库表管理,创建、修改、约束、建议与性能优化(3)
轻松入门MySQL:深入学习数据库表管理,创建、修改、约束、建议与性能优化(3)
|
2天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
|
2天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
ava从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
|
2天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
|
3天前
|
NoSQL MongoDB 数据库
MongoDB数据恢复—MongoDB数据库文件被破坏的数据恢复案例
服务器数据恢复环境: 一台Windows Server操作系统服务器,服务器上部署MongoDB数据库。 MongoDB数据库故障&检测: 工作人员在未关闭MongoDB数据库服务的情况下,将数据库文件拷贝到其他分区。拷贝完成后将原MongoDB数据库所在分区进行了格式化操作,然后将数据库文件拷回原分区,重新启动MongoDB服务,服务无法启动。
|
15天前
|
SQL 存储 数据挖掘
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
服务器数据恢复环境: 一台安装windows server操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。 在windows服务器内装有SqlServer数据库。存储空间LUN划分了两个逻辑分区。 服务器故障&初检: 由于未知原因,Sql Server数据库文件丢失,丢失数据涉及到3个库,表的数量有3000左右。数据库文件丢失原因还没有查清楚,也不能确定数据存储位置。 数据库文件丢失后服务器仍处于开机状态,所幸没有大量数据写入。 将raid5中所有磁盘编号后取出,经过硬件工程师检测,没有发现明显的硬件故障。以只读方式将所有磁盘进行扇区级的全盘镜像,镜像完成后将所
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例

热门文章

最新文章