JPA概述及helloworld

一、JPA概述

1. 是什么

  • JPA全称Java Persistence API:意思是 Java 持久化 API
    • 它是Java EE5.0平台指定的的 ORM 规范,使得应用程序以统一的方式访问持久层

2. JPA和 hibernate 的关系(JPA是hibernate的创作者提出的...)

  • JPA 是 hibernate 的一个抽象(就像是 JDBC 和 JDBC 驱动之间的关系)
    • JPA是规范:JPA是一种ORM规范,而不是ORM框架,它只是提供了接口,具体的实现由ORM厂商实现
    • hibernate 是实现:hibernate 除了是 ORM 框架以外,也是JPA的实现
  • 从功能上说,JPA是hibernate的子集

3. JPA有哪些实现

  • hibernate(毕竟JPA就是它的作者提出来的)、OpenJPA、TopLink

4. JPA 包括什么

  1. ORM 映射元数据:主要学习注解方式
  2. API
  3. 查询语言(JPQL):类似于 hibernate 的 hql

二、hello world

1. 创建项目

  1. 导包(依赖)

    <properties>
        <hibernate.version>5.0.7.Final</hibernate.version>
        <slf4j.version>1.6.6</slf4j.version>
        <log4j.version>1.2.12</log4j.version>
        <c3p0.version>0.9.5.4</c3p0.version>
        <mysql.version>5.1.28</mysql.version>
    </properties>
    
    <dependencies>
        <!-- junit单元测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    
        <!-- hibernate -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.18.Final</version>
        </dependency>
    
        <!-- c3p0 -->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>${c3p0.version}</version>
        </dependency>
    
        <!-- log -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
    
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
    
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
    
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
    
    </dependencies>
    
  2. 编写配置文件

    1. log4j

      # 为了直观的看输出结果和sql,我设置了打印级别为ERROR级
      log4j.rootLogger=ERROR
      log4j.appender.stdout=org.apache.log4j.ConsoleAppender
      log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
      log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
      
    2. JPA配置文件:路径必须是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">
          <!-- transaction-type:指定 JPA  的事务处理策略。
               RESOURCE_LOCAL:默认值,数据库级别的事务,只能针对一种数据库,不支持分布式事务。
                            如果需要支持分布式事务,使用JTA:transaction-type="JTA"
               name 属性用于定义持久化单元的名字, 必选			 
           -->
          <persistence-unit name="jpa01" transaction-type="RESOURCE_LOCAL">
      
              <!-- 配置ORM映射产品来实现JPA映射 
                   实际上是 javax.persistence.spi.PersistenceProvider的实现类
                   如果项目中只有一个JPA实现产品,则不需要配置该节点
              -->
              <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
              <!-- 添加持久化类 -->
              <class>cn.ann.entity.User</class>
      
              <properties>
                  <!-- 连接数据库的基本信息 -->
                  <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
                  <property name="javax.persistence.jdbc.url"	value="jdbc:mysql://localhost:3307/jpa_test?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false&amp;serverTimezone=Asia/Shanghai" />
                  <property name="javax.persistence.jdbc.user" value="root" />
                  <property name="javax.persistence.jdbc.password" value="password" />
                  <!-- ORM 框架的基本信息 -->
                  <property name="hibernate.hbm2ddl.auto" value="update"/>
                  <property name="hibernate.show_sql" value="true"/>
                  <property name="hibernate.format_sql" value="true"/>
              </properties>
          </persistence-unit>
      </persistence>
      
  3. 创建实体类(getter和setter略)

    @Entity					// 表明这是一个与数据库表对应的实体类
    @Table(name = "t_user")	  // 表明关联的表名称
    public class User implements Serializable {
        private static final long serialVersionUID = -5201721404180914044L;
    
        @Id		// 表明该字段是主键
        private Long id;
        @Column(name = "last_name")
        private String lastName;
        private Integer age;
        private String email;
    }
    

2. 测试

  • 编写测试类

    public class JpaDemo {
        @Test
        public void JpaTest_persistence() {
            // 1. 创建实体管理工厂:EntityManagerFactory
            EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa01");
            // 2. 创建实体管理类:EntityManager
            EntityManager entityManager = factory.createEntityManager();
            // 3. 获取事务
            EntityTransaction tx = entityManager.getTransaction();
            try {
                // 4. 开启事务
                tx.begin();
                // 5. 操作
                for (int i = 1; i <= 100; i++) {
                    User user = new User();
                    user.setLastName("程序员"+i+"号");
                    user.setAge(20 + i%20);
                    user.setEmail("john"+i+"@ann.cn");
                    entityManager.persist(user);
                }
                // 6.1 提交事务
                tx.commit();
            } catch (Exception e) {
                // 6.2 发生异常就回滚事务
                tx.rollback();
                e.printStackTrace();
            } finally {
                // 7. 释放资源
                entityManager.close();
                factory.close();
            }
        }
    }
    

本节代码:点击此处

posted @ 2019-12-11 13:59  _ann  阅读(305)  评论(0编辑  收藏  举报