JPA入门

作者: 神豪VS勇士赢 | 来源:发表于2018-08-21 19:58 被阅读45次

    JPA介绍
    JPA全称为Java Persistence API ,Java持久化API是Sun公司在Java EE 5规范中提出的Java持久化接口。JPA吸取了目前Java持久化技术的优点,旨在规范、简化Java对象的持久化工作。使用JPA持久化对象,并不是依赖于某一个ORM框架。

    JPA和Hibernate的关系
    1.JPA 是规范:JPA 本质上就是一种 ORM 规范
    2.Hibernate 是实现:Hibernate 除了作为 ORM 框架之外,它也是一种 JPA 实现

    image.png

    ORM映射文件之前使用的是配置方式,这里可以通过JPA规范,把ORM映射使用注解来替代。

    Hibernate的注解方式(HibernateJPA)

    JPA 的供应商
    1.Hibernate
    2.OpenJPA
    3.TopLink

    image.png

    JPA特点:
    1.标准化:
    2.简单易用
    3.媲美JDBC
    4.支持面向对象

    开发流程:
    第一步:创建Web项目,导入依赖
    必须创建Web项目

    同时放入jpa模板文件

    image.png

    第二步:配置JPA核心配置文件
    创建JPA的核心配置文件

    核心配置persistence.xml(名称是固定的), 在这个文件中配置持久化单元
    1.JPA 规范要求目录结构:在META-INF中

      2.需要指定 JPA 使用哪个持久化的框架以及配置该框架的基本属性
        a)需要指定跟哪个数据库进行交互;
        b)指定方言等扩展属性
    
    image.png image.png

    配置文件:
    代码:

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.0"
    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">

    <persistence-unit name="java1803" transaction-type="RESOURCE_LOCAL">
        <!-- 指定JPA的实现厂商 -->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <!-- 注册实体 -->
        <class>com.qf.pojo.JavaPhone</class>
        <!-- 配置HibernatePersistenceProvider对应的属性 -->
        <properties>
            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"></property>
            <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/qqhr?characterEncoding=utf-8"></property>
            <property name="hibernate.connection.username" value="root"></property>
            <property name="hibernate.connection.password" value=""></property>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL55Dialect"></property>
            <property name="hibernate.show_sql" value="true"></property>
            <property name="hibernate.format_sql" value="true"></property>
            <!-- 生成表 -->
            <property name="hibernate.hbm2ddl.auto" value="update"></property>
        </properties>
    </persistence-unit>  
    

    </persistence>

    注意<class>节点位置:


    image.png

    第三步:创建实体类和映射的注解
    创建实体类, 使用 annotation 来描述实体类跟数据库表之间的映射关系.
    JPA 基本注解:
    1.@Entity 标注用于实体类声明语句之前,指出该Java 类为实体类,将映射到指定的数据库表。
    2.@Table 映射表格
    a)常和@Entity配合使用。
    b)Name可选,表示表的名称,默认表名和实体名一致。
    3.@Id 映射生成主键:通常置于属性声明语句之前,也可置于属性的getter方法之前。必须有,定义了映射到数据库表的主键属性
    4.@GeneratedValue 用于标注主键的生成策略,通过 strategy 属性指定。
    (strategy=GenerationType.AUTO)主键策略:
    a)IDENTITY:采用数据库 ID自增长的方式来自增主键字段
    b)AUTO: JPA自动选择合适的策略,是默认选项;
    c)SEQUENCE:通过序列产生主键

    1. @Column 映射表格列 (可选):常用属性是 name,用于设置映射数据库表的列名。

    表和类的关联


    image.png

    @Entity //声明当前类为hibernate映射到数据库中的实体类
    @Table(name="qf_user") //声明在数据库中自动生成的表名

    行和对象的关联
    OID,在主键


    image.png

    @Id //声明此列为主键

    字段和属性的关联


    image.png

    代码:
    @Entity
    @Table(name = "my_computer")
    public class MyComputer {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long comId;//主键策略
    @Column(name = "com_name")
    private String comName;// 属性映射
    @Column(name = "com_desc")
    private String comDesc;

    public Long getComId() {
    return comId;
    }

    public void setComId(Long comId) {
    this.comId = comId;
    }

    public String getComName() {
    return comName;
    }

    public void setComName(String comName) {
    this.comName = comName;
    }

    public String getComDesc() {
    return comDesc;
    }

    public void setComDesc(String comDesc) {
    this.comDesc = comDesc;
    }
    }

    注册实体别忘记:


    image.png

    第四步:开发DAO测试
    初始化表测试:

    public void initTable(){
    //加载配置,得到工厂
    EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myjpa");
    entityManagerFactory.close();
    }

    观察控制台的输出如下所示:

    create table my_computer (
    comId bigint not null auto_increment,
    com_desc varchar(255),
    com_name varchar(255),
    primary key (comId)
    ) engine=InnoDB

    是核心配置文件中的持久化单元名称


    image.png

    添加测试:
    public void addCom(){
    //第一步:加载配置,得到工厂
    EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myjpa");
    //第二步:得到实体管理对象
    EntityManager entityManager = entityManagerFactory.createEntityManager();
    //第三步:开启事务
    EntityTransaction transaction = entityManager.getTransaction();
    transaction.begin();
    //第四步:操作数据
    MyComputer pojo = new MyComputer();
    pojo.setComName("联想");
    pojo.setComDesc("支持国产");
    entityManager.persist(pojo);
    //第五步:提交事务
    transaction.commit();
    //第六步:关闭链接
    entityManager.close();
    entityManagerFactory.close();
    }

    image.png

    完成CRUD(persist, find, merge, remove)

    public class MyComputerDAO {

    public void initTable(){
    //加载配置,得到工厂
    EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myjpa");
    entityManagerFactory.close();
    }

    public void addCom(){
    //第一步:加载配置,得到工厂
    EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myjpa");
    //第二步:得到实体管理对象
    EntityManager entityManager = entityManagerFactory.createEntityManager();
    //第三步:开启事务
    EntityTransaction transaction = entityManager.getTransaction();
    transaction.begin();
    //第四步:操作数据
    MyComputer pojo = new MyComputer();
    pojo.setComName("联想");
    pojo.setComDesc("支持国产");
    entityManager.persist(pojo);
    //第五步:提交事务
    transaction.commit();
    //第六步:关闭链接
    entityManager.close();
    entityManagerFactory.close();
    }

    public void findById(Long cid){
    EntityManager entityManager = JPAUtils.getEntityManager();
    MyComputer myComputer = entityManager.find(MyComputer.class, cid);
    System.out.println(myComputer.getComName()+"\t"+myComputer.getComDesc());
    entityManager.close();
    }

    public void updateCom(){
    EntityManager entityManager = JPAUtils.getEntityManager();
    EntityTransaction transaction = entityManager.getTransaction();
    transaction.begin();

      MyComputer myComputer = entityManager.find(MyComputer.class, 1L);
      myComputer.setComDesc("中国梦");
      entityManager.merge(myComputer);
    
      transaction.commit();
      entityManager.close();
    

    }

    public void del(){
    EntityManager entityManager = JPAUtils.getEntityManager();
    EntityTransaction transaction = entityManager.getTransaction();
    transaction.begin();
    MyComputer myComputer = entityManager.find(MyComputer.class, 1L);
    entityManager.remove(myComputer);
    transaction.commit();
    entityManager.close();
    }

    public static void main(String[] args) {
    MyComputerDAO dao = new MyComputerDAO();
    // dao.initTable();
    // dao.addCom();
    // dao.findById(1L);
    // dao.updateCom();
    dao.del();
    }

    }
    可以将上面重复的代码抽象成单例的工具类

    注意:删除必须在同样一个实体管理对象中才可以,一个entityManager查,一个新entityManager删除会失败。

    测试:


    image.png image.png

    跨Session不在同样一个事务中。
    bug:


    image.png

    相关文章

      网友评论

          本文标题:JPA入门

          本文链接:https://www.haomeiwen.com/subject/edwjiftx.html