版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chenbetter1996/article/details/85544532
概述
JPA(Java Persistence API), JPA是一个ORM的标准规范,而不是一个具体的ORM框架
不知道是不是版本问题,直接使用org.eclipse.persistence的包稍加配置可以直接使用无连接池的JPA
使用
- 配置
- 导包
<!-- 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>
- 配置持久化单元对应的配置文件,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&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实体类
- 创建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 **/
}
- 和JavaBean很像,但是必须满足一些条件
1.1. 用注解@Entity标注
1.2. 用@ID标注对应数据表的主键(JPA很多操作都要主键)- @GeneratedValue(strategy = GenerationType.IDENTITY)这是主键自增的一类策略
- 这些就是刚刚在persistence.xml里面的<class>
- @Table可以映射指定的数据表
- 获取EntityManager
import javax.persistence.EntityManager;
import javax.persistence.Persistence;
public class EMUtil {
public static EntityManager getEM() {
return Persistence.createEntityManagerFactory("hotel").createEntityManager();
}
}
- "hotel"就是刚刚配置文件的属性值,有了em就可以进行增删改查。
- 这里只是一个数据库连接(没有使用连接池,原始的JPA不用其它ORM框架实现的话,连接池不会弄)
- 此外这里还有个很大的问题,这里的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();
}
- 需要用em对象开启一个事物,增删改是直接提交到数据库的,因为JPA还有二级缓存,在JAVA程序到数据库中有个缓冲区,一般默认的的话,查询都是从缓冲区检索,而不是直接从数据库。
- 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);
- 查询可以使用Query和em.find(Member.class, 主键); 显然用Query灵活
- JPQL和SQL不一样,必须别名,而且表名写的是Entity名(即首字母记得大写)
- 参数设置可以采用 ?index也可以使用 :str
- 这样默认是在缓冲区检索,想直接到数据库查询可以创建Query前加一句 em.clear() [em.flush()没用]