Skip to content

Latest commit

 

History

History
190 lines (131 loc) · 4.41 KB

JPA.md

File metadata and controls

190 lines (131 loc) · 4.41 KB

JPA的全称是Java Persistence API, 即Java 持久化API,是SUN公司推出的一套基于ORM的规范,内部是由一系列的接口和抽象类构成

Persistence对象

Persistence对象主要作用是用于获取EntityManagerFactory对象的

EntityManagerFactory

EntityManagerFactory 接口主要用来创建 EntityManager 实例

EntityManager

在 JPA 规范中, EntityManager是完成持久化操作的核心对象

getTransaction : 获取事务对象
persist : 保存操作
merge : 更新操作
remove : 删除操作
find/getReference : 根据id查询

EntityTransaction

begin,commit,rollback

使用

创建classpath:META-INF/persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">

    <!--持久化单元名称-->  <!--事务类型-->
    <persistence-unit  name="jpa" transaction-type="RESOURCE_LOCAL">
        <!--实现方式-->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

        <properties>
            <!--数据库信息-->
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="123"/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql:///ssm"/>
            <!--实现方信息-->
            <property name="hibernate.show_sql" value="true"/>
            <!--create:每次启动都会创建(存在则删除) update:不存在表则创建 none:不操作-->
            <property name="hibernate.hbm2ddl.auto" value="update"/>
        </properties>
    </persistence-unit>
</persistence>

创建实体类

@Entity
@Table(name = "cst_customer")
@Data
public class Customer {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "cust_id")
    /*
    * IDENTITY:底层数据库必须支持自动增长
    * SEQUENCE: 底层数据库必须支持序列
    * TABLE:jpa提供的机制
    * AUTO:由程序自动选择策略
    * */
    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;
    
}

操作

  • 添加
        EntityManager manager = Persistence
        .createEntityManagerFactory("jpa").createEntityManager();
        EntityTransaction tx = manager.getTransaction();
        tx.begin();

        Customer customer = new Customer();
        customer.setCustName("老王");
        customer.setCustIndustry("隔壁");
        manager.persist(customer);

        tx.commit();
        manager.close();
  • 根据ID查询
Customer customer = entityManager.find(Customer.class, 1L); // 立即加载
Customer customer = entityManager.getReference(Customer.class, 1L); // 延迟加载
  • 删除
Customer customer = entityManager.find(Customer.class, 1L);
entityManager.remove(customer);
  • 更新
Customer customer = entityManager.find(Customer.class, 2L);
customer.setCustName("老王八");
entityManager.merge(customer);

JPQL

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

  • 查询全部
String jpql = "FROM Customer ";
List list = entityManager.createQuery(jpql).getResultList();
for (Object o : list) {
    System.out.println(o);
}
  • 倒序查询
FROM Customer ORDER BY custId DESC
  • 统计查询
SELECT COUNT(custId) FROM Customer
  • 分页查询
String jpql = "FROM Customer";
List list = entityManager.createQuery(jpql)
                .setFirstResult(0)
                .setMaxResults(2).getResultList();
  • 条件查询
String jpql = "FROM Customer WHERE custName LIKE ?1";
List list = entityManager.createQuery(jpql)
                .setParameter(1,"%李%")
                .getResultList();