01-Jpa入门
1.JPA(Java Persistence API)
定义:意即Java持久化API,是Sun官方在JDK5.0后提出的java持久化规范,这些接口在javax.persistence里定义。
JPA的出现主要是为了简化持久层开发以及整合ORM技术,结束Hibernate、TopLink、JDO等ORM框架各自为营的局面。
JPA包括以下3方面的技术:
ORM映射元数据:支持xml和注解两种元数据的形式,元数据描述对象和表之间的映射关系
API:操作实体对象来操作CRUD操作
查询语言:通过面向对象而非面向数据库的查询语言(JPQL)查询数据,避免程序的SQL语句紧密耦合
Jpa、Spring Data Jpa、 Hibernate 之间的关系:
总的来说JPA是ORM规范,Hibernate、TopLink、OpenJpa等是JPA规范的具体实现,
这样的好处是开发者可以面向JPA规范进行持久层的开发,而底层的实现则是可以切换的。
Spring Data Jpa则是在JPA之上添加另一层抽象(Repository层的实现),类似于Slf4j
2.SpringDataJpa
并不是jpa规范的实现,基于原生jpa的api进行再次的封装,提供更简单的使用方法,和更好的用户体验
一般底层的实现还是用选择Hibernate
3.jpa入门程序
1.创建一个maven的java工程
2.在resources/META-INF/persistence.xml创建jpa的配置文件,路劲有规定
常用配置:
persistence-unit:持久化单元,必须要有一个
name:持久化单元名称
transaction-type:事务类型
RESOURCE_LOCAL:但数据库事务
JTA:分布式事务,跨数据库事务,多数据库事务
property:
hibernate.show_sql:是否在控制台输出sql语句
hibernate.format_sql:是否格式化sql语句
hibernate.hbm2ddl.auto:是否自动创建表
create:自动创建表,先删除,再创建
update:自动创建表,如果表存在直接使用,不存在就创建
none:不自动创建表,如果表存在直接使用,如果不存在则报错
3.创建一个Entity类,对应数据库表的字段
类上添加:
@Entity
@Table(name ="数据库表名")
属性上添加
@Id :指明主键对应的字段
@GeneratedValue:指明主键的生成策略,如果手动生成主键,可以没有此注解;如果主键需要框架生成需要配置此注解
GenerationType.IDENTITY:自增长主键,推荐在mysql下使用,不能在Oracle使用
GenerationType.SEQUENCE:使用序列生成主键,一般在Oracle下使用,不推荐在mysql使用
GenerationType.AUTO:有框架自动选择
@SequenceGenerator:序列生成器,Oracle下使用多
@TableGenerator:表生成器,会新建一张表来专门生成主键id
4.编写测试程序,实现数据添加
1)创建一个EntityManagerFactory对象,单例
2)通过EntityManagerFactory获取EntityManager
3)EntityManager获得事务并开启
4)构造数据对象
5)使用EntityManager对象的persist方法向数据库插入数据
6)事务提交
7)关闭连接
增加:entityManager.persist();
删除:entityManager.remove();
修改:entityManager.merge();
根据id查询:
entityManager.find();//即时加载
entityManager.getReference();//延迟加载,用到的时候再加载
4.jpql
jpql相当于sql语句的变种,只是把表名换成实体类的类名,字段名换成实体类的属性名
例如:
查询全部:
sql: select * from customer
jpql:from Customer
使用方法:
1):创建一个EntityManager对象
2):使用entityManager创建一个Query对象
3):使用Query查询
4):关闭连接
1.查询全部
sql:select * from customer;
jpql:from Customer
2.使用jpql分页
使用Query对象的方法设置分页信息
起始行号:query.setFirstResult
每页的条数:query.setMaxResult
Query query = entityManager.createQuery("from Customer");
query.setFirstResult(5);//设置起始行号
query.setMaxResult(5);//设置每一页查询个数
List<Customer> customerList = query.getResultList();
jpa底层会根据数据库类型,自动转换成相应的sql语句
3.带条件的查询
sql:select * from customer where id = ?
jpql:from Customer where id=?
query.setParameter(jpql中第几个参数的,对应的值)
例如:query.setParameter(1,2L)
4.查询带排序
sql:select * from customer order by id desc
jpql:from Customer order by id desc
5.聚合查询:count sum max min avg
sql:select count(*) from customer
jpql:select count(*) from Customer
总结:Query对象的常用方法
Query query = entityManager.createQuery("from Customer");
query.setFirstResult(5);//设置起始行号
query.setMaxResult(5);//设置每一页查询个数
query.setParameter(jpql中第几个参数的,对应的值)
query.getResultList //获得结果集
query.getSingleResult //获得单个结果
5.
Last updated
Was this helpful?