文章目录
1 JPA入门
1.1 什么是JPA
- JPA是Java Persistence API的简称
- JPA是持久层API,JPA就是做持久层,操作数据库
- 它是对象映射框架(ORM)的规范
1.2 为什么需要JPA
1.3 Hibernate和JPA的关系
JPA:它是ORM的规范
Hibernate:是开放源代码的ORM框架
简单一句话:JPA是持久化规范,而Hibernate是其实现。
1.4 JDBC和JPA的优缺点
1.4.1 jdbc优缺点
优点:
- jdbc操作数据库的底层技术
- 比较简单 比较直接,就可以操作数据库
缺点: - 转换的时候特别麻烦
- 重复性代码比较多
- 移植数据库比较麻烦
- jdbc 自身没有缓存(Cache),如果性能上面需要控制的化,就需要写缓存代码
- jdbc不是面向对象的思维来操作的呀 面向sql操作,如果是sql高手,操作jdbc很爽的;
1.4.2 JPA优缺点
优点:
- 面向对象操作,操作对象 就相当于操作数据 比如 entityManager.perisit(employee)
- 移植数据比较方法,以后如果想换数据库,只需要换一个数据库方言就OK
- JPA有缓存,效率不错的 (一级缓存 二级缓存 查询缓存)
缺点: - 不能干预sql的生成 ,查询一个数据 find 默认查询所有字段 (select * from )
- 有些优化 jpa做不了,比如特别大数据量的时候,jpa也不适合,mybatis也解决不了 (架构策略 分库 分表 (分布式))
- 一个项目里面 对sql要求比较高,就不适合jpa
2 jpa的使用
2.1 导入依赖的jar包
2.2 persistence.xml的配置
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<persistence-unit name="cn.itsource" transaction-type="RESOURCE_LOCAL">
<properties>
<!-- 必须配置4个连接数据库属性 -->
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.url" value="jdbc:mysql:///db0723" />
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password" value="123456" />
<!-- 必须配置1个方言属性 -->
<!-- 实现跨数据库关键类 :查询MySQLDialect的getLimitString方法 -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<!-- 可选配置 -->
<!-- 是否自动生成表-->
<property name="hibernate.hbm2ddl.auto" value="update" />
<!-- 是否显示sql -->
<property name="hibernate.show_sql" value="true" />
<!-- 格式化sql -->
<!-- <property name="hibernate.format_sql" value="true" /> -->
</properties>
</persistence-unit>
</persistence>
2.3 使用JPA完成一个新增操作
@Test
public void testJpa() throws Exception {
//先得到entityManagerFactory
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("cn.itsource.jpa");
}
//添加
@Test
public void testAdd() throws Exception {
User user = new User();
user.setName("皮皮虾");
//先得到entityManagerFactory
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("cn.itsource.jpa");
//开启工厂生成entityManager对象
EntityManager entityManager = entityManagerFactory.createEntityManager();
//获取事物
entityManager.getTransaction().begin();//开启事物
entityManager.persist(user);
//提交事物
entityManager.getTransaction().commit();
//关闭事物
entityManager.close();
entityManagerFactory.close();
}
2.4 建表策略
create 创建策略 每次都要先删除 再创建
update 更新策略 不会删除 如果发现没有表 也会创建
如果是表里面新增字段 配置有效果
如果这个表里面已存在字段,修改属性 没有效果
create-drop 先删除 在创建 再删除 不怎么会用
validate 验证策略 如果有对应实体 但是没有对应的数据库表 会报错
数据库多字段 OK
数据库少字段 不OK
2.5 单表映射配置
@Entity
@Table(name = "t_employee")
public class Employee {
@Id
@GeneratedValue
private Long id; //要求:主键,使用数据库的自动生成策略
@Column(name = "username",length = 20,unique = true,nullable = false)
private String name; //要求:varchar(20),数据库名称为username,不能为空,唯一
private String password;
@Column(columnDefinition="int(20) default 25",updatable = false)
private Integer age = 25; //要求:默认值是25,在插入数据时不允许覆盖(添加数据时不操作该字段)
private Boolean sex;// 数据库没有布尔类型,bit对象
@Column(columnDefinition = "decimal(19,2)")
private BigDecimal salary;// 19,2
@Column(updatable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date createTime;//包含年月日时分秒,不允许修改
@Temporal(TemporalType.DATE)
private Date birthday;//包含年月日
@Temporal(TemporalType.TIME)
private Date time;//包含时分秒
@Lob
private String text;//这是一个大文本
@Transient
private String temp;//这一个字段不要同步到数据库