前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JPA的基本操作

JPA的基本操作

作者头像
暴躁的程序猿
发布2022-03-24 15:53:56
发布2022-03-24 15:53:56
79000
代码可运行
举报
运行总次数:0
代码可运行

增删改查操作

配置文件

代码语言:javascript
代码运行次数:0
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<!-- 需要配置一个persistence-unit节点
  持久化单元:
        name 持久化单元名称
        transaction-type 事务管理的方式
          两个属性:
          Jpa  分布式事务管理  (不同的表存在不同的数据库中)
          RESOURCE_LOCAL   本地事务管理   (表都存在一个数据库中)
-->
    <persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL">
        <!--jpa的实现方式-->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <properties>
            <!--数据库信息
              用户名javax.persistence.jdbc.user
               密码 javax.persistence.jdbc.password
               驱动 javax.persistence.jdbc.driver
               数据库地址 javax.persistence.jdbc.url
            -->
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="123465*"/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpa"/>

            <!-- 可选的配置 :配置jpa实现方的配置信息 hibernate
                   显示sql语句  false true
                 自动创建数据库表   create程序运行时创建数据库表如果有表先删除表在创建
                  update  程序运行时创建表 如果有表不会创建表  none 不会创建表 -->
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
        </properties>
    </persistence-unit>
</persistence>

实体类

代码语言:javascript
代码运行次数:0
运行
复制
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "cust_id")
    private Long custId;//客户主键
    @Column(name = "cust_name")
    private  String custName;//客户姓名
    @Column(name = "cust_source")
    private String custSource;//客户客户来源
    @Column(name = "cust_level")
    private String custLevel;//客户级别
    @Column(name = "cust_industry")
    private String custIndustry;//客户所属行业
    @Column(name = "cust_phone")
    private String custPhone;//客户联系方式
    @Column(name = "cust_address")
    private String custAddress;//客户地址

测试方法

JPA工具类

代码语言:javascript
代码运行次数:0
运行
复制
public class JpaUtils {

    private static EntityManagerFactory factory;
    static {
      //加载配置文件  创建EntityManagerFactory
        factory = Persistence.createEntityManagerFactory("myJpa");
    }

    /**
     * 获取EntityManager对象
     * @return
     */
    public static EntityManager getEntityManager(){
        return factory.createEntityManager();
    }

}

增加

代码语言:javascript
代码运行次数:0
运行
复制
  /**
     * 测试jpa保存
     *    案例 保存一个客户到数据库中
     * jpa的操作步骤:
     *    1.加载配置文件创建工厂 (实体管理器工厂) 对象
     *    2.通过工厂(实体管理器工厂) 获取一个实体管理器
     *    3.获取事务对象,开启事务
     *    4.完成增删改查操作
     *    5.提交或回滚事务
     *    6.释放资源
     */
    @Test
    public void testSave(){
      //  1.加载配置文件创建工厂 (实体管理器工厂) 对象
//        EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
      // 2.通过工厂(实体管理器工厂) 获取一个实体管理器
//        EntityManager em = factory.createEntityManager();
        EntityManager em = JpaUtils.getEntityManager();
        // 3.获取事务对象,开启事务
        //获取事务对象
        EntityTransaction tx = em.getTransaction();
        //开启事务
        tx.begin();
        // 4.完成增删改查操作  保存一个客户到数据库中
        Customer customer=new Customer();
        customer.setCustName("美团");
        customer.setCustIndustry("外卖");
        //保存
        em.persist(customer);//保存操作
        //5.提交事务
        tx.commit();
        //6.释放资源
        em.close();
        //factory.close();
    }

查询

代码语言:javascript
代码运行次数:0
运行
复制
 /**
     * 使用find方法查询
     *   1.查询的对象就是当前客户对象本身
     *   2.在调用find方法的时候就会发送SQL语句查询数据库
     *  立即加载
     *
     * 根据id查询用户
     */
    @Test
    public void testFind(){
        //1.通过工具类获取一个EntityManager对象
        EntityManager em = JpaUtils.getEntityManager();
        //2.开启事务
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        //3.增删改查
        /**
         * 根据id查询数据
         *     class:查询数据的结果需要包装的实体类类型的字节码
         *     id:查询的主键的取值
         *  配置文件需要改成update
         */
        Customer customer = em.find(Customer.class, 1l);
        System.out.println(customer);
        //4.提交事务
        tx.commit();
        //5.释放资源
        em.close();
    }
代码语言:javascript
代码运行次数:0
运行
复制
    /**
     * 使用getReference方法查询
     *     1.获取的对象是一个动态代理对象
     *     2.调用getReference方法不会立即发送SQL查询数据库
     *          当调用查询结果对象的时候才会发送查询的SQL语句
     *           什么时候用什么时候发送SQL语句查询数据库
     *    延迟加载(懒加载)  一般使用延迟加载
     *         得到的是一个动态代理对象
     *         什么时候用什么时候才会查询
     * 根据id查询用户
     */
    @Test
    public void testFind2(){
        //1.通过工具类获取一个EntityManager对象
        EntityManager em = JpaUtils.getEntityManager();
        //2.开启事务
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        //3.增删改查
        /**
         * 根据id查询数据
         *     class:查询数据的结果需要包装的实体类类型的字节码
         *     id:查询的主键的取值
         *  配置文件需要改成update
         */
        Customer customer = em.getReference(Customer.class, 1l);
        System.out.println(customer);
        //4.提交事务
        tx.commit();
        //5.释放资源
        em.close();
    }

修改

代码语言:javascript
代码运行次数:0
运行
复制
    /**
     * 客户的更新操作
     * merge(Object)
     */
    @Test
    public void testUpdate(){
        //1.通过工具类获取一个EntityManager对象
        EntityManager em = JpaUtils.getEntityManager();
        //2.开启事务
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        //3.增删改查    更新操作
         //先查询客户
        Customer customer = em.getReference(Customer.class, 2l);
        //更新客户
        customer.setCustIndustry("p图");
        em.merge(customer);
        //4.提交事务
        tx.commit();
        //5.释放资源
        em.close();
    }

删除

代码语言:javascript
代码运行次数:0
运行
复制
  /**
     * 删除客户的案例
     *  根据id 删除
     */
    @Test
    public void testRemove(){
        //1.通过工具类获取一个EntityManager对象
        EntityManager em = JpaUtils.getEntityManager();
        //2.开启事务
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        //3.增删改查
        //根据id查询客户
        Customer customer = em.getReference(Customer.class, 3l);
        //调用remove方法完成删除操作
        em.remove(customer);
        //4.提交事务
        tx.commit();
        //5.释放资源
        em.close();
    }

JPA中的复杂查询

JPQL全称Java Persistence Query Language

基于首次在EJB2.0中引入的EJB查询语言(EJB QL),Java持久化查询语言(JPQL)是一种可移植的查询语言,旨在以面向对象表达式语言的表达式,将SQL语法和简单查询语义绑定在一起·使用这种语言编写的查询是可移植的,可以被编译成所有主流数据库服务器上的SQL。

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

查询全部

代码语言:javascript
代码运行次数:0
运行
复制
 @Test
    /**
     * 查询全部
     *    jpql:from cn.itcast.domain.Customer
     *    sql:select * from cst_customer
     */
    public void testFindAll(){
        //1.获取EntityManager对象
        EntityManager em = JpaUtils.getEntityManager();
        //2.开启事务
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        //3.查询所有
        String jpql="from cn.itcast.domain.Customer";
        Query query = em.createQuery(jpql);//创建query查询对象 query对象才是执行jpql的对象。
        //发送查询,并封装结果集
        List list = query.getResultList();
        //遍历结果集
        for (Object object:list){
            System.out.println(object);
        }
        //4.提交事务
        tx.commit();
        //5.释放资源
        em.close();
    }

排序查询

代码语言:javascript
代码运行次数:0
运行
复制
   @Test
   /**
    * 排序查询 倒序查询全部客户(根据id倒序)
    *  jpql:from Customer order by custId desc
    *  sql:select * from cst_customer order by cust-id desc
    *
    *  进行jpql查询
    *    1.创建query查询对象
    *    2.对参数进行赋值
    *    3.查询并得到返回结果集
    *
    */
    public void testOrder(){
        //1.获取EntityManager对象
        EntityManager em = JpaUtils.getEntityManager();
        //2.开启事务
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        //3.查询所有
        String jpql="from Customer order by custId desc";
        Query query = em.createQuery(jpql);//创建query查询对象 query对象才是执行jpql的对象。
        //发送查询,并封装结果集
        List list = query.getResultList();
        //遍历结果集
        for (Object object:list){
            System.out.println(object);
        }
        //4.提交事务
        tx.commit();
        //5.释放资源
        em.close();
    }

统计查询

代码语言:javascript
代码运行次数:0
运行
复制
  @Test
    /**
     * 使用jpql查询,统计客户的总数
     *    sql: select count(cust_id) from cst_customer
     *    jpql:select count(custId) from Customer
     */
    public void testCount(){
        //1.获取EntityManager对象
        EntityManager em = JpaUtils.getEntityManager();
        //2.开启事务
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        //3.查询所有
        // 根据jpql语句创建query查询对象
        String jpql="select count(custId) from Customer";
        Query query = em.createQuery(jpql);//创建query查询对象 query对象才是执行jpql的对象。
        //对参数赋值  没参数可以省略
        //发送查询,并封装结果集
        /**
         * getResultList:直接将查询结果封装为list集合
         *
         * getSingleResult:得到唯一的结果集
         */
        Object o = query.getSingleResult();
        System.out.println(o);
        //4.提交事务
        tx.commit();
        //5.释放资源
        em.close();
    }

分页查询

代码语言:javascript
代码运行次数:0
运行
复制
 /**
     * 分页查询
     *
     * jpql: from Customer
     */
    @Test
    public void testPaged() {
        //1.获取EntityManager对象
        EntityManager em = JpaUtils.getEntityManager();
        //2.开启事务
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        //3.查询所有
        // 根据jpql语句创建query查询对象
        String jpql = " from Customer";
        Query query = em.createQuery(jpql);//创建query查询对象 query对象才是执行jpql的对象。
        //对参数赋值  没参数可以省略---分页参数
        //起始索引  从零开始查 不包含零
        query.setFirstResult(0);
        //每页显示的条数
        query.setMaxResults(3);
        //发送查询,并封装结果集
        /**
         * getResultList:直接将查询结果封装为list集合
         *
         * getSingleResult:得到唯一的结果集
         */
        List list = query.getResultList();
        for (Object obj : list) {
            System.out.println(obj);
        }
        //4.提交事务
        tx.commit();
        //5.释放资源
        em.close();
    }

select * from cst_customer limit ?,?

条件查询

代码语言:javascript
代码运行次数:0
运行
复制
 /**
     * 条件查询
     * 查询客户名称 以美图开头的客户
     * jpql: from Customer where
     */
    @Test
    public void testCondition() {
        //1.获取EntityManager对象
        EntityManager em = JpaUtils.getEntityManager();
        //2.开启事务
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        //3.查询所有
        // 根据jpql语句创建query查询对象
        String jpql = "from Customer where custName like ?";
        Query query = em.createQuery(jpql);//创建query查询对象 query对象才是执行jpql的对象。
        //对参数赋值  没参数可以省略---占位符参数\
        //第一个参数 占位符的索引位置(从1开始),第二个参数:占位符的取值
        query.setParameter(1, "美图%");
        //发送查询,并封装结果集
        /**
         * getResultList:直接将查询结果封装为list集合
         *
         * getSingleResult:得到唯一的结果集
         */
        List list = query.getResultList();
        for (Object obj : list) {
            System.out.println(obj);
        }
        //4.提交事务
        tx.commit();
        //5.释放资源
        em.close();
    }

sql:select * from cst_customer where cust_name like ‘%美图%’ select * from cst_customer where cust_name like ?

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/02/21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 增删改查操作
  • JPA中的复杂查询
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档