JPA原生配置和使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chenbetter1996/article/details/85544532

概述

JPA(Java Persistence API), JPA是一个ORM的标准规范,而不是一个具体的ORM框架

不知道是不是版本问题,直接使用org.eclipse.persistence的包稍加配置可以直接使用无连接池的JPA


使用

  • 配置
  1. 导包
 <!-- https://mvnrepository.com/artifact/org.eclipse.persistence/org.eclipse.persistence.jpa -->
<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>org.eclipse.persistence.jpa</artifactId>
    <version>2.7.3</version>
</dependency>
  1. 配置持久化单元对应的配置文件,classpath下的META-INF/persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="hotel">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>com.lusr.entity.Member</class>
        <class>com.lusr.entity.Manager</class>
        <class>com.lusr.entity.Room</class>
        <class>com.lusr.entity.Transaction</class>
        <properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql:///db_name?useSSL=true&amp;characterEncoding=utf-8"/>
            <property name="javax.persistence.jdbc.user" value=""/>
            <property name="javax.persistence.jdbc.password" value=""/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
        </properties>
    </persistence-unit>
</persistence>

1.<persistence-unit name=“hotel”>的"hotel"是接下来创建EntityManager的工厂参数
2.上面的<claas>是需要持久化的JPA的Entity实体类

  1. 创建Enity
import javax.persistence.*;

@Entity
@Table(name = "member")
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String phone;
    private String identity;
    private String username;
    private String password;

    /** getter and setter **/
}
  1. 和JavaBean很像,但是必须满足一些条件
    1.1. 用注解@Entity标注
    1.2. 用@ID标注对应数据表的主键(JPA很多操作都要主键)
  2. @GeneratedValue(strategy = GenerationType.IDENTITY)这是主键自增的一类策略
  3. 这些就是刚刚在persistence.xml里面的<class>
  4. @Table可以映射指定的数据表
  1. 获取EntityManager
import javax.persistence.EntityManager;
import javax.persistence.Persistence;

public class EMUtil {
    public static EntityManager getEM() {
        return Persistence.createEntityManagerFactory("hotel").createEntityManager();
    }
}
  1. "hotel"就是刚刚配置文件的属性值,有了em就可以进行增删改查。
  2. 这里只是一个数据库连接(没有使用连接池,原始的JPA不用其它ORM框架实现的话,连接池不会弄)
  3. 此外这里还有个很大的问题,这里的Entity属性命名得和数据库字段名一致,没有做映射处理。
  • 增(持久化)
import javax.persistence.EntityManager;
import javax.persistence.Persistence;
import javax.persistence.Query;

public void insertMember(Member member) {
    em.getTransaction().begin();
    em.persist(member);
    em.getTransaction().commit();
    // 仅仅一个数据库连接,就不关了
//  em.close();
}
  1. 需要用em对象开启一个事物,增删改是直接提交到数据库的,因为JPA还有二级缓存,在JAVA程序到数据库中有个缓冲区,一般默认的的话,查询都是从缓冲区检索,而不是直接从数据库。
  2. em.persist(obj)直接持久化到数据库
public void updateStatusZero(Integer id) {
    // 更新transaction的状态(只能通过主键id更新)
    em.getTransaction().begin();
    Transaction t = em.find(Transaction.class, id);
    em.remove(t);
    em.getTransaction().commit();
}

通过find获取到直接remove即可

public void updateStatusZero(Integer id) {
    // 更新transaction的状态(只能通过主键id更新)
    em.getTransaction().begin();
    Transaction t = em.find(Transaction.class, id);
    t.setStatus(0);

    // 更新room的状态(只能通过id更新)
    Room r = em.find(Room.class, t.getRoom_id());
    r.setStatus(0);
    em.getTransaction().commit();
}

需要用em.find通过主键获取到对象,然后直接修改提交即可。对象无需保存。

public Member findMemberByPhone(String phone) {
    // JPQL不同SQL,需要位置号,需要别名,等等(IDEA这里别开语法检测,不能识别会报错)
    Query query = em.createQuery("SELECT c FROM Member c WHERE c.phone = ?1");
    query.setParameter(1, phone);
    List<Member> members = query.getResultList();
    return members.size() == 0 ? null : members.get(0);
  1. 查询可以使用Query和em.find(Member.class, 主键); 显然用Query灵活
  2. JPQL和SQL不一样,必须别名,而且表名写的是Entity名(即首字母记得大写)
  3. 参数设置可以采用 ?index也可以使用 :str
  4. 这样默认是在缓冲区检索,想直接到数据库查询可以创建Query前加一句 em.clear() [em.flush()没用]

猜你喜欢

转载自blog.csdn.net/chenbetter1996/article/details/85544532