JPA学习

1.jpa
1.ORM思想
ORM(Object-Relational Mapping) 表示对象关系映射。 操作对象就是操作表, 尽量不写sql
ORM就是建立 实体类 和 数据库表 之间的关系,从而达到操作实体类就相当于操作数据库表的目的。(框架建立这样的关系,类名-表名,属性-列) 操作对象就是操作表;基于orm思想的, 能够建立了对应关系的框架;Mybaitis(半自动)/hibernate(全自动化) 参数自动映射/自动封装结果集 自动!!!
简化dao层写法,简化增删改查,不写sql语句 spring data jpa

2.JPA规范(sun)
JPA的全称是Java Persistence API, 即Java 持久化规范,是SUN公司推出的一套基于ORM的规范,内部是由一系列的接口和抽象类构成。一套规范, 接口 (类似于JDBC)
对所有的orm框架进行规范; 由实现了规范的框架来具体干活
JPA本身不是框架, 是规范, 要实现要干活, 需要实现了JPA规范的框架, 例如hibernate // 5.0.7版本的

3.入门测试
1.Maven工程,配置文件pom; 这里就是jpa(hibernate jpa),跟spring还无关!
测试Junit
日志Slf4j-Log4j
Hibernate对jpa的支持 hibernate-entitymanager 不是hibernate
数据库 mysql
Maven编译插件 1.8

2.建立实体类,在实体类上使用JPA注解的形式配置映射关系
@Entity // 作用:指定当前类是实体类。
@Table(name = “cst_customer”) // 作用:指定实体类和表之间的对应关系。
public class Customer implements Serializable{
@Id // 作用:指定当前字段是主键。
@GeneratedValue(strategy = GenerationType.IDENTITY) // 作用:指定主键的生成方式。 四中类型, strategy :指定主键生成策略。
@Column(name=“cust_id”) // 作用:指定实体类属性和数据库表之间的对应关系

3.JPA核心配置文件,在java工程的src路径下创建一个名为META-INF的文件夹,在此文件夹下创建一个名为persistence.xml的配置文件,没有使用spring整合, 没有spring的事 //jpa核心配置文件,类似mybatis核心配置文件,

<?xml version="1.0" encoding="UTF-8"?>
<!--配置持久化单元
  name:持久化单元名称
  transaction-type:事务类型  多个操作在一个数据库
  RESOURCE_LOCAL:本地事务管理  多个操作在多个数据库,要么都成功,要么都失败
  JTA:分布式事务管理 -->
<persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL">
  
   <!--指定JPA规范的提供商  hibernate提供支持-->
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
      //难道没有使用连接池???用的是什么连接池
        <!-- 数据库驱动 -->
        <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
        <!-- 数据库地址 -->
        <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/springdatajpa"/>
        <!-- 数据库用户名 -->
        <property name="javax.persistence.jdbc.user" value="root"/>
        <!-- 数据库密码 -->
        <property name="javax.persistence.jdbc.password" value="123456"/>
      
      
        <!--jpa提供商的可选配置:我们的JPA规范的提供商为hibernate,
        所以jpa的核心配置中兼容hibernate的配置 -->
        <!--打印sql语句-->
        <property name="hibernate.show_sql" value="true"/>
        <!--格式化sql语句-->
        <property name="hibernate.format_sql" value="true"/>
      
      
    </properties>
4.test * 创建实体管理器工厂EntityManagerFactory emf,借助Persistence的静态方法createEntityManagerFactory()来获取; * 创建实体管理器EntityManager em; * 事务 ,所有操作要放在事务里 获取事务,开启,提交 ; 重要!!! * 操作 增删改查 persist * 关闭实体管理器和工厂 em/emf @Test public void test1(){
	EntityManagerFactory emf = Persistence.createEntityManagerFactory("myJpa");
	EntityManager em = emf.createEntityManager();
	
	EntityTransaction es = em.getTransaction();
	es.begin();
	
	Customer customer = new Customer();
	customer.setCustAddress("guang拦路");
	customer.setCustName("旺旺");
	
	em.persist(customer);
	
	es.commit();
	
	em.close();
	emf.close();
	
}

5.建表语句ddl

create/ 先删表再建表, 数据会丢失
create-drop/ 删,创建,最后再删
update/ 没有表就建表, 有表会根据最新的实体进行更新
Validate/ 没有表,也不更新, 有表如果不一致,还报错

6.主键策略
IDENTITY 数据库自动生成, 自动增长 //Mysql , 自增

4.JPA-API
原生api实现增删改查:
Persistence类 获取工厂对象 得到EntityManagerFactory emf
EntityManagerFactory 接口 创建em实例 线程安全/ 重量级 可以单例下使用, 唯一的工厂对象
EntityManager : em是完成持久化操作的核心对象。实体类作为普通 java对象,只有在调用 EntityManager将其持久化后才会变成持久化对象。操作实体
getTransaction : 获取事务对象 ; EntityTransaction是完成事务操作的核心对象; 一切在事务内完成

操作的都是实体,
增删改: em.persist /em.merge /em.remove /em.find
persist : 保存操作; id如果存在会报错,只能insert不能update
merge : 1. 更新操作 (new对象,merge; 会先查id,存在就更新update,不存在就保存insert)
2. 也可以先查出来, 直接重新set值就可以了(仍然两次sql, 仍然要先查,只是确定是更新) // 查到的如果不存在去硬set会报错 null异常
remove : 删除操作 只能先查再删除 如果new一个对象然后remove会报错,//因为,可能是不存在的,此时不可删
查: em.find
find/getReference : 根据id查询 主键
Customer customer = em.find(Customer.class, 1L); Customer customer = em.getReference(Customer.class,1L);

5.JPQL实现复杂查询
查询!!! 实现的是查询!!! 可以实现复杂查询 select
持久化查询语言 java persisent query language

面向对象,通过类名和属性 不是表和列了
记住: 通过em, 创建查询对象 Query + 并且写jpql语句 em.createQuery(“写jpql语句”)
不能select * ; 不能部分字段(部分字段无法与要映射的实体相匹配,多也不行,少也不行),默认就是select所有字段from 实体 (也就是是实体对应的表,这张表包含字段大于等于这个实体) , 返回的也就是相应实体对象,不需要写XXX.class了

与写sql相区别,nativesql更灵活,只需要塞满返回的那个实体就好,多查没关系,不能少; 没有实体与表之间的映射关系了,这时候不是orm,而就是sql,从表里查字段;

查询全部
//创建查询对象,写的是JPQL语句
Query query = em.createQuery(“from Customer”);
List list = query.getResultList();
分页查询
Query query = em.createQuery(“from Customer”);
query.setFirstResult(0);
query.setMaxResults(2);
List list = query.getResultList();
条件查询 条件写在jpql里 再setparameter(),设置条件值
//创建查询对象,写的是JPQL语句
Query query = em.createQuery(“from Customer where custName like ?”);
//给占位符设置值
query.setParameter(1,"%张三%");
List list = query.getResultList();
排序查询 排序规则直接写在jpql里
//创建查询对象,写的是JPQL语句
Query query = em.createQuery(“from Customer order by custId desc”);
List list = query.getResultList();
统计查

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值