JPA

JPA 的全称是 Java Persistence API, 即 Java 持久化 API,是 SUN 公司推出的一套基于 ORM 的规范,
内部是由一系列的接口和抽象类构成。

ORM(Object-Relational Mapping) 表示对象关系映射.

简单的说: ORM 就是建立实体类和数据库表之间的关系,从而达到操作实体类就相当于操作数据库表的目的。

JPA 定义了独特的 JPQL(Java Persistence Query Language)它是针对实体的一种查询语言,操作对象是实体
JPA 与 hibernate

第一步:导入jar包

第二步:创建客户的数据库表和客户的实

第三步:实体类和数据库表的映射配置

* 所有的注解都是使用 JPA 的规范提供的注解,
* * 所以在导入注解包的时候,一定要导入 javax.persistence 下的
常用注解的说明
@Entity
作用:指定当前类是实体类。
@Table
作用:指定实体类和表之间的对应关系。
属性:
name:指定数据库表的名称
@Id
作用:指定当前字段是主键。
@GeneratedValue
作用:指定主键的生成方式。。
属性:
strategy :指定主键生成策略。
generator:指定引用 hibernate 中声明的主键策略
@Column
作用:指定实体类属性和数据库表之间的对应关系
属性:
name:指定数据库表的列名称。
unique:是否唯一
nullable:是否可以为空
inserttable:是否可以插入
updateable:是否可以更新
columnDefinition: 定义建表时创建此列的 DDL
secondaryTable: 从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字
第四步:配置 JPA 的核心配置文件

在 maven 工程的 resources 路径下创建一个名为 META-INF 的文件夹persistence.xml
<!--配置持久化单元
name:持久化单元名称
transaction-type:事务类型
RESOURCE_LOCAL:本地事务管理
JTA:分布式事务管理 -->
<persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL">
<!--配置 JPA 规范的服务提供商 -->
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<!-- 数据库驱动 -->
<property name="javax.persistence.jdbc.driver"
value="com.mysql.jdbc.Driver" />
<!-- 数据库地址 -->
<property name="javax.persistence.jdbc.url"
value="jdbc:mysql://localhost:3306/ssh" />
<!-- 数据库用户名 -->
<property name="javax.persistence.jdbc.user" value="root" />
<!-- 数据库密码 -->
<property name="javax.persistence.jdbc.password" value="1234" />
<!--jpa 提供者的可选配置:我们的 JPA 规范的提供者为 hibernate,所以 jpa 的核心配
置中兼容 hibernate 的配 -->
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>
</persistence-unit>


JPA 的 API 介绍
Persistence 对象
作 用 是 用 于 获 取 EntityManagerFactory 对 象 的 。 通 过 调 用 该 类 的
createEntityManagerFactory 静态方法,根据配置文件中持久化单元名称创建 EntityManagerFactory
EntityManagerFactory
主要用来创建 EntityManager 实例,由于 EntityManagerFactory 是一个线程安全的对象只需要做到一个工程只存在一 个即可

EntityManager
是完成持久化操作的核心对象实体类作为普通 java 对象,只有在调用EntityManager 将其持久化后才会变成持久化对象
方法说明:

getTransaction : 获取事务对象
persist : 保存操作
merge : 更新操作
remove : 删除操作
find/getReference : 根据 id 查询

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

begin:开启事务
commit:提交事务
rollback: 回滚事务


-------jpa的CRUD
----查询操作
    1 按照id查询//注意id的类型
         find 和 getReference 
         区别:
         第一个:查询的时机不一样。 find 是立即加载 ,只要一调用方法,马上发起查询。getReference 是延迟加载,什么时候使用什么时候加载。 
         第二个:返回的结果不一样 find 返回的是实体类类型   getReference 返回的是实体类的代理对象 
         hibernate 中  *  get 和 load 方法的区别和 jpa 中的 find 和 getReference 是一样的 
    2 查询所有
        // 创建 query 对象  
        String jpql = "from Customer";  
        //jpql的语法表明变成实体名,字段名变成属性名,不支持*需要用别名select c from Customer c
        Query query = em.createQuery(jpql); 
        // 查询并得到返回结果    
        List list = query.getResultList(); 
    3 查询一行一列
        // 1.创建 query 对象  
        String jpql = "select count(custId) from Customer";  
        Query query = em.createQuery(jpql); 
       // 2.查询并得到返回结果 
       Object count = query.getSingleResult(); 
    4    条件查询
        //创建 query 对象   
        String jpql = "from Customer where custName like ? ";   
        Query query = em.createQuery(jpql); 
       //对占位符赋值,从 1 开始   
       query.setParameter(1, "传智播客%");   
       //查询并得到返回结果   
       Object object = query.getSingleResult(); //得到唯一的结果集对象 
    5 分页查询
        //创建 query 对象   
        String jpql = "from Customer";  
        Query query = em.createQuery(jpql); 
        //起始索引 
        query.setFirstResult(0); 
       //每页显示条数  
       query.setMaxResults(2); 
       //查询并得到返回结果  
       List list = query.getResultList(); //得到集合返回类型   
    6 排序查询
         // 创建 query 对象  
         String jpql = "from Customer order by custId desc";   
         Query query = em.createQuery(jpql); 
        // 查询并得到返回结果  
        List list = query.getResultList(); // 得到集合返回类型
----更新操作(先查询再修改)
    //执行操作 
    Customer c1 = em.find(Customer.class, 6L);        
    c1.setCustName("江苏学院");         
    em.clear();
    //把 c1 对象从缓存中清除出去    
    em.merge(c1);
-----删除操作(先查询再删除)
    // 执行操作   
    Customer c1 = em.find(Customer.class, 6L);   
    em.remove(c1); //此处只能传入查询的实体类对象但是hibernate没这个要求
------ JPA 中 RESOURCE_LOCAL 和 JTA 事务说明 
    JTA 事务(Java Transaction API)是 J2EE 规范中有关事务的标准。它是容器级别的事务,最大优势是可以支持分布式的事务
    RESOURCE_LOCAL 事务数据库本地的事务。在 J2SE 环境中, 它是数据库级别的事务
-----persistence.xml配置文件
    注意事项:
    <property name="hibernate.hbm2ddl.auto" value="update" /> 
    四种取值
        update:只是更新数据不会更改表结构,因此如果的表结构发生了变化重新生成表
        create:每次加载hibernate,如果数据库中存在表,将所有表删除,然后重新生成表
                    一般情况下只要用到查询会报错因为重新生成表没有数据、
        createdrop:一开始数据库中有几个表,整个流程执行结束之后,还是几个表。
                        加载hibernate时创建,退出时删除表结构
        validate:验证创建数据库表结构,这样 spring在加载之初,如果model层和
                    数据库表结构不同,就会报错,这样有助于技术运维预先发现问题
   

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值