1、ORM思想
主要目的:操作实体类就相当于操作数据库表
建立两个映射关系:1)实体类和表的映射关系;2)实体类中属性和表中字段的映射关系
不再重点关注:sql语句
实现了ORM思想的框架:mybatis,hibernate
2、Hibernate框架
Hibernate是一个开放源代码的对象关系映射框架
它对JDBC进行了非常轻量级的对象封装,
它将POJO与数据库表建立映射关系,是一个全自动的orm框架
3、JPA规范
JPA的全称是Java Persistence API, 即Java 持久化API,是SUN公司推出的一套基于ORM的规范,内部是由一系列的接口和抽象类构成。
JPA规范本质上就是一种ORM规范,注意不是ORM框架——因为JPA并未提供ORM实现,它只是制订了一些规范,提供了一些编程的API接口,但具体实现则由服务厂商来提供实现。(类似JDBC规范,有mysql、oracle等驱动)
JPA和Hibernate的关系就像JDBC和JDBC驱动的关系,JPA是规范,Hibernate除了作为ORM框架之外,它也是一种JPA实现。JPA怎么取代Hibernate呢?JDBC规范可以驱动底层数据库吗?答案是否定的,也就是说,如果使用JPA规范进行数据库操作,底层需要hibernate作为其实现类完成数据持久化工作。
4、JPA基本操作
4.1 搭建环境
1)创建maven工程,导入坐标
2)配置jpa的核心配置文件
位置:配置到类路径下的一个叫做 META-INF 的文件夹下
命名:persistence.xml
3)编写客户的实体类
4)配置实体类和表,类中属性和表中字段的映射关系
第一步:配置实体类和表的映射关系,通过类注解:
@Entity:声明实体类
@Table:配置实体类和表的映射关系,属性name为数据库表的名称
第二部:配置类中属性和表中字段的映射关系,通过属性注解
@Id:声明主键的配置
@GeneratedValue:配置主键的生成策略,属性strategy描述:
GenerationType.IDENTITY :自增(mysql),底层数据库必须支持自动增长
GenerationType.SEQUENCE:序列(oracle),底层数据库必须支持序列
GenerationType.TABLE:jpa提供的一种机制,通过一张数据库表(新建)的形式帮助我们完成主键自增
GenerationType.AUTO:由程序自动的帮助我们选择主键生成策略
@Column:配置属性和字段的映射关系,属性name为数据库表中字段的名称
5)执行测试
4.2 使用步骤
1)加载配置文件创建实体管理器工厂
Persisitence:静态方法(根据持久化单元名称创建实体管理器工厂)createEntityMnagerFactory(持久化单元名称)
作用:创建实体管理器工厂(EntityManagerFactory)
EntityManagerFactory内部维护了很多的内容:维护数据库信息、维护缓存信息、维护所有的实体管理器对象、在创建EntityManagerFactory的过程中会根据配置创建数据库表
EntityManagerFactory的创建过程比较浪费资源,其特点是线程安全的对象,即:多个线程访问同一个EntityManagerFactory不会有线程安全问题,所以在使用JPA编程时,我们可以对EntityManagerFactory 的创建进行优化,只需要做到一个工程只存在一个EntityManagerFactory即可
2)根据实体管理器工厂,创建实体管理器
实体管理器:EntityManager
方法:createEntityManager,获取EntityManager对象
EntityManager是完成持久化操作的核心对象
3)创建事务对象,开启事务
通过EntityManager对象
beginTransaction : 创建事务对象
4)增删改查操作
通过EntityManager对象
presist : 保存
merge : 更新
remove : 删除
find/getRefrence : 根据id查询,立即加载/延迟加载
5)提交事务
6)释放资源
4.3 实现增删改查
1)新增:persist
2)修改:先查询到对象,然后进行修改(merge)
3)删除:先查询到对象,然后进行删除(remove)
4)查询:find(立即加载)、getReference(延迟加载)
4.4 jpql查询
JPQL:全称为:Java Persistence Query Language
其特征与原生SQL语句类似,并且完全面向对象,通过类名和属性访问,而不是表名和表的属性
sql:查询的是表和表中的字段
jpql:查询的是实体类和类中的属性
4.4.1 查询步骤
1)编写jqpl语句,创建query查询对象
2)对参数进行赋值
3)查询并得到返回结果集
getSingleResult:获取唯一结果集(聚合函数)
getResultList:直接将查询结果封装为list集合
4.4.2 查询方法
1)查询全部:
sql:select * from user
jpql:from User(实体类类名)
2)分页查询
sql:select * from user limit ?, ?
jqpl:from user
对query的参数进行赋值:
query.setFirstResult(0);设置起始索引
query.setMaxResults(5);设置每页查询条数
3)统计查询
sql:select count(id) from user
jqpl:select count(id) from User
4)条件查询
sql:select * from user where username like ?
jqpl:from User where username(类中属性名) like ?
对query的参数进行赋值:
query.setParameter(1, "%王%");
第一个参数:占位符的索引参数(从1开始)
第二个参数:取值
5)排序
sql:select * from userorder by id desc
jpql:from User order by id(类中属性名) desc