zoukankan      html  css  js  c++  java
  • jpa01

    JPA

    Java Persistence API, 即Java 持久化API

    JPA规范本质上就是一种ORM规范,提供了一些编程的API接口,但具体实现则由服务厂商来提供实现。   

     

    入门案例

    1.创建maven ,导入坐标

    2.配置jpa的核心配置文件,创建在META-INFO目录下,persistence.xml

    3.编写客户实体类

    4.配置实体类和表

    5.保存

    pom.xml

     1   <properties>
     2         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     3         <project.hibernate.version>5.0.7.Final</project.hibernate.version>
     4     </properties>
     5 
     6     <dependencies>
     7         <!-- junit -->
     8         <dependency>
     9             <groupId>junit</groupId>
    10             <artifactId>junit</artifactId>
    11             <version>4.12</version>
    12             <scope>test</scope>
    13         </dependency>
    14 
    15         <!-- hibernate对jpa的支持包 -->
    16         <dependency>
    17             <groupId>org.hibernate</groupId>
    18             <artifactId>hibernate-entitymanager</artifactId>
    19             <version>${project.hibernate.version}</version>
    20         </dependency>
    21 
    22         <!-- c3p0 -->
    23         <dependency>
    24             <groupId>org.hibernate</groupId>
    25             <artifactId>hibernate-c3p0</artifactId>
    26             <version>${project.hibernate.version}</version>
    27         </dependency>
    28 
    29         <!-- log日志 -->
    30         <dependency>
    31             <groupId>log4j</groupId>
    32             <artifactId>log4j</artifactId>
    33             <version>1.2.17</version>
    34         </dependency>
    35 
    36         <!-- Mysql and MariaDB -->
    37         <dependency>
    38             <groupId>mysql</groupId>
    39             <artifactId>mysql-connector-java</artifactId>
    40             <version>5.1.6</version>
    41         </dependency>

    persistence.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
     3 
     4 <!--需要配置persistence-unit节点
     5         持久化单元,name 持久化单元名称
     6         transaction-type:事务管理方式
     7             JTA:分布式事务管理
     8             RESOURCE_lOCAL 本地事务管理
     9 -->
    10  <persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL">
    11     <!-- -jpa实现方式-->
    12     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    13 
    14     <!-- 数据库信息-->
    15     <properties>
    16         <property name="javax.persistence.jdbc.user" value="root"/>
    17         <property name="javax.persistence.jdbc.password" value="root"/>
    18         <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
    19         <property name="javax.persistence.jdbc.url" value="jdbc:mysql:///jpa"/>
    20 
    21         <!--配置jpa实现方的(hibernate)的配置信息
    22         显示sql false |true
    23         create :程序运行时创建数据库,表,有表,先删除
    24         update : 程序运行时,如果有表,不会创建表
    25         none :不会创建表
    26         -->
    27         <property name="hibernate.show_sql" value="true"/>
    28         <property name="hibernate.hbm2ddl.auto" value="update"/>
    29     </properties>
    30     <!--可选配置,配置jpa实现方的配置信息-->
    31  </persistence-unit>
    32 </persistence>

    创建domain实体类,jpa注解配置映射关系

    实体类和表的映射关系
    实体类的属性和表的字段映射关系


    @Entity:声明实体类
    @Table:声明实体类和表的映射关系   name="表名"
    @Id 声明主键

    @Column 属性和表字段的映射关系 name="字段名"
    @GeneratedValue:配置主键生成策略   @GeneratedValue(strategy = GenerationType.IDENTITY)

    GenerationType.IDENTITY :自增,mysql ,底层数据库必须支持自动增长(底层数据库支持的自动增长方式,对id自增)
    GenerationType.SEQUENCE : 序列,oracle ,底层数据库必须支持序列
    GenerationType.TABLE : jpa提供的一种机制,通过一张数据库表的形式帮助我们完成主键自增
    GenerationType.AUTO : 由程序自动的帮助我们选择主键生成策略

    Persistence对象主要作用是用于获取EntityManagerFactory对象的 。通过调用该类的createEntityManagerFactory静态方法,根据配置文件中持久化单元名称创建EntityManagerFactory。

    EntiryManagerFactory

    EntityManagerFactory 接口主要用来创建 EntityManager 实例,是一个线程安全的对象,并且EntityManagerFactory 的创建极其浪费资源,创建时只需要做到一个工程只存在一个EntityManagerFactory 即可

    EntityManager

    EntityManager是完成持久化操作的核心对象。实体类作为普通 java对象,只有在调用 EntityManager将其持久化后才会变成持久化对象。EntityManager对象在一组实体类与底层数据源之间进行 O/R 映射的管理

    通过调用EntityManager的方法完成获取事务,以及持久化数据库的操作

    getTransaction : 获取事务对象

    persist : 保存操作

    merge : 更新操作

    remove : 删除操作

    find/getReference : 根据id查询

    EntityTransaction

    EntityTransaction是完成事务操作的核心对象

    begin:开启事务

    commit:提交事务

    rollback:回滚事务

    解决实体管理器工厂的浪费资源和耗时问题

    通过静态代码块的形式,当程序第一次访问此工具类时,创建一个公共的实体管理器工厂对象

     1 public class JpaUtils {
     2 
     3     private static EntityManagerFactory factory;
     4 
     5     static  {
     6         //1.加载配置文件,创建entityManagerFactory
     7         factory = Persistence.createEntityManagerFactory("myJpa");
     8     }
     9     /**
    10      * 获取EntityManager对象
    11      */
    12     public static EntityManager getEntityManager() {
    13        return factory.createEntityManager();
    14     }
    15 }

    save

     1     /**
     2      * 测试jpa的保存
     3      * jpa的操作步骤
     4          * 1.加载配置文件创建工厂
     5          * 2.通过实体管理类创建实体管理器
     6          * 3.获取事务对象开启事务
     7          * 4.完成增删改查操作
     8          * 5.提交事务
     9          * 6.释放资源
    10      */
    11 
    12     @Test
    13     public void testSave(){
    14 //        EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
    15 //        EntityManager em = factory.createEntityManager();
    16 
    17         EntityManager em = JpaUtils.getEntityManager();
    18 
    19         EntityTransaction tx = em.getTransaction();
    20         tx.begin();
    21         Customer customer = new Customer();
    22         customer.setCustName("金立手机");
    23         customer.setCustIndustry("金立");
    24         em.persist(customer);
    25         //提交事务
    26         tx.commit();
    27         em.close();
    28  //    factory.close();
    29     }

    Test

     1     /**
     2      * 根据id查询客户
     3      * 通过工具类获取entityManager
     4          开启事务
     5          增删改差
     6          提交事务
     7          释放资源
     8      */
     9 
    10     @Test
    11     public void testFind(){
    12         EntityManager entityManager = JpaUtils.getEntityManager();
    13         EntityTransaction tx = entityManager.getTransaction();
    14         tx.begin();
    15 
    16         Customer customer = entityManager.find(Customer.class,1l);
    17         System.out.println(customer);
    18 
    19 //     entityManager.remove(customer)
    20 
    21 //        customer.setCustName("zhangsan");
    22 //        entityManager.merge(customer);
    23 
    24         tx.commit();
    25         entityManager.close();
    26     }

    fing与getReference

    find立即查找

    getReference 延迟加载,得到的时一个动态代理对象,不会立即发送sql语句

    jpql

    Java Persistence Query Language,其特征与原生SQL语句类似,并且完全面向对象,通过类名和属性访问,而不是表名和表的属性。

    sql 查询的是表和表中的字段

    jpql 查询的是实体类和类中的属性

    findall

     1     /**
     2      * 查询全部
     3      *   jpql:from com.jpa.domain.Customer
     4      *              类的全限定名
     5      *   sql:select * from cst_customer
     6      *
     7      *   1.获取entiryManager对象
     8      *   2.开启事务
     9      *   3.查询全部
    10      *   4.提交事务
    11      *   5.释放资源
    12      */
    13     @Test
    14     public void testFindAll(){
    15         EntityManager em = JpaUtils.getEntityManager();
    16         EntityTransaction tx = em.getTransaction();
    17         tx.begin();
    18         String jpal = "from com.jpa.domain.Customer";
    19         Query query = em.createQuery(jpal);
    20 
    21         List list  = query.getResultList();
    22 
    23         for (Object obj :list){
    24             System.out.println(obj);
    25         }
    26         tx.commit();
    27         em.close();
    28     }

    条件查询

    /**
    * 1.创建query查询对象
    * 2.对参数进行赋值
    * 3.查询,并得到返回结果
    */

    排序查询

    1  String jpal = "from Customer order by custId desc";
    2         Query query = em.createQuery(jpal);
    3 
    4         List list  = query.getResultList();
    5 
    6         for (Object obj :list){
    7             System.out.println(obj);
    8         }

    分页查询

     1         String jpal = " from Customer";
     2         Query query = em.createQuery(jpal);
     3         
     4         //起始索引
     5         query.setFirstResult(0);
     6         //每页查询条数
     7         query.setMaxResults(1);
     8 
     9         List list = query.getResultList();
    10         for (Object obj :list){
    11             System.out.println(obj);
    12         }

    条件查询

    1       // sql   select * from cst_customer where cust_name like ?
    2       String jpal = " from Customer where custName like ? ";
    3          Query query = em.createQuery(jpal);
    4          query.setParameter(1,"金立%");

         

  • 相关阅读:
    elastic
    Leetcode题库 第十行
    Leetcode题库-实现strStr()
    Redis持久化
    Redis的数据结构及应用场景
    Redis缓存的淘汰策略
    Redis缓存常见问题
    Redis面试题1
    消息队列的原理及选型
    【转载】java高并发/mysql/mybatis/spring博客
  • 原文地址:https://www.cnblogs.com/quyangyang/p/11439050.html
Copyright © 2011-2022 走看看