JPA详解

一、JPA是什么

  1. PA(Java Persistence API)是Java持久化规范,是ORM框架的标准,主流ORM框架都实现了这个标准。

  2. ORM是一种思想,是在应用程序与JDBC API之间插入的一个中间层
  3. JDBC并不能很好地支持面向对象的程序设计,ORM解决了这个问题,通过JDBC将字段高效的与对象进行映射

 二、使用步骤

1.创建maven项目、导入Maven坐标

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.hibernate.version>5.0.7.Final</project.hibernate.version>
  </properties>

  <dependencies>

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.26</version>
    </dependency>
    <!-- junit -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>

    <!-- hibernate对jpa的支持包 -->
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-entitymanager</artifactId>
      <version>${project.hibernate.version}</version>
    </dependency>

    <!-- c3p0 -->
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-c3p0</artifactId>
      <version>${project.hibernate.version}</version>
    </dependency>

    <!-- log日志 -->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>

    <!-- Mysql and MariaDB -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.31</version>
    </dependency>
  </dependencies>

2.创建配置文件,在META-INF文件夹中创建persistence.xml

3.在persistence.xml配置持久化单元,底层供应商,数据库信息(驱动、url、用户名、密码), Hibernate个性化配置(显示sql、格式化sql、自动建表)

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">
    <!--配置持久化单元
        name:持久化单元名称
        transaction-type:事务类型
             RESOURCE_LOCAL:本地事务管理
             JTA:分布式事务管理 -->
    <persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL">
        <!--配置JPA规范的服务提供商 -->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <properties>
            <!-- 数据库驱动 -->
            <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver" />
            <!-- 数据库地址 -->
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpa" />
            <!-- 数据库用户名 -->
            <property name="javax.persistence.jdbc.user" value="root" />
            <!-- 数据库密码 -->
            <property name="javax.persistence.jdbc.password" value="123sa" />

            <!--jpa提供者的可选配置:我们的JPA规范的提供者为hibernate,所以jpa的核心配置中兼容hibernate的配 -->
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
        </properties>
    </persistence-unit>
</persistence>

4.数据库、数据表创建,实体类的创建

package com.yy.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;

/**
 * @Author 杨 
 * @CreateDate 2023-07-04 11:20
 **/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "t_users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String username;
    private String pwd;
    private int age;

    public User(String username, String pwd, int age) {
        this.username = username;
        this.pwd = pwd;
        this.age = age;
    }
}

5.测试

@Test
    public void aa(){
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
        //创建实体管理类
        EntityManager em = factory.createEntityManager();
        //获取事务对象
        EntityTransaction tx = em.getTransaction();
        //开启事务
        tx.begin();
        User u = new User("杨","456",24);
        //保存操作
        em.persist(u);

        //提交事务
        tx.commit();
        //释放资源
        em.close();
        factory.close();
    }

三、基本增删改查操作

  1. 增加:persist(临时对象)
    public void aa(){
            EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
            //创建实体管理类
            EntityManager em = factory.createEntityManager();
            //获取事务对象
            EntityTransaction tx = em.getTransaction();
            //开启事务
            tx.begin();
            User u = new User("杨滢","456",24);
            //保存操作
            em.persist(u);
            //提交事务
            tx.commit();
            //释放资源
            em.close();
            factory.close();
        }
  2. 删除:remove(持久化对象)
    public void del(){
            EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
            //创建实体管理类
            EntityManager em = factory.createEntityManager();
            //获取事务对象
            EntityTransaction tx = em.getTransaction();
            //开启事务
            tx.begin();
            User u = em.find(User.class, 1);
            //删除操作
            em.remove(u);
    
            //提交事务
            tx.commit();
            //释放资源
            em.close();
            factory.close();
        }
  3. 修改:merge(持久化对象)
    通过查询方法先查询对象,修改属性,调用merge方法
    通过查询方法先查询对象,修改属性,entityManager提交之后,发送修改语句
    通过new对象数据,没有id的对象执行添加操作,有id的对象
           如果id存在,属性有所变动,执行修改语句
           如果id不存在,执行添加操作
    public void upd(){
            EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
            //创建实体管理类
            EntityManager em = factory.createEntityManager();
            //获取事务对象
            EntityTransaction tx = em.getTransaction();
            //开启事务
            tx.begin();
            User u = em.find(User.class, 1);
            u.setAge(18);
            //修改操作
            em.merge(u);
    
            //提交事务
            tx.commit();
            //释放资源
            em.close();
            factory.close();
        }
  4. 查询:find(反射类型,主键) 及时加载,如果主键对象不存在,得到null
               getReference(反射类型,主键),懒加载,如果主键对象不存在,报错空指针
    public void sel(){
            EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
            //创建实体管理类
            EntityManager em = factory.createEntityManager();
            //获取事务对象
            EntityTransaction tx = em.getTransaction();
            //开启事务
            tx.begin();
            User user = em.find(User.class, 1);
            System.out.println(user);
            
            //提交事务
            tx.commit();
            //释放资源
            em.close();
            factory.close();
        }

四、复杂查询操作

  1. 查询全部
    public void sel(){
            EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
            //创建实体管理类
            EntityManager em = factory.createEntityManager();
            //获取事务对象
            EntityTransaction tx = em.getTransaction();
            //开启事务
            tx.begin();
            String jpa1="from User";
            Query query = em.createQuery(jpa1);
            // 查询并得到返回结果
            List list = query.getResultList(); // 得到集合返回类型
            for (Object object : list) {
                System.out.println(object);
            }
    
            //提交事务
            tx.commit();
            //释放资源
            em.close();
            factory.close();
        }
  2. 分页查询
    public void limit(){
            EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
            //创建实体管理类
            EntityManager em = factory.createEntityManager();
            //获取事务对象
            EntityTransaction tx = em.getTransaction();
            //开启事务
            tx.begin();
            String jpa1="from User";
            Query query = em.createQuery(jpa1);
            query.setFirstResult(0);
            query.setMaxResults(2);
    
            // 查询并得到返回结果
            List list = query.getResultList(); // 得到集合返回类型
            for (Object object : list) {
                System.out.println(object);
            }
    
            //提交事务
            tx.commit();
            //释放资源
            em.close();
            factory.close();
        }
  3. 条件查询

    public void where(){
            EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
            //创建实体管理类
            EntityManager em = factory.createEntityManager();
            //获取事务对象
            EntityTransaction tx = em.getTransaction();
            //开启事务
            tx.begin();
            String jpa1="from User where username like ?1";
            Query query = em.createQuery(jpa1);
            query.setParameter(1, "%杨%");
    
            // 查询并得到返回结果
            List list = query.getResultList(); // 得到集合返回类型
            for (Object object : list) {
                System.out.println(object);
            }
    
            //提交事务
            tx.commit();
            //释放资源
            em.close();
            factory.close();
        }

五、对象的状态转换

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值