1.认识:持久层框架,操作数据库的框架,相当于是JDBC项目中的dao层
对数据库的表进行一个映射
2.jpa是规范,hibernate是jpa是实现
3.jdbc和JPA的优缺点
JDBC:转换麻烦,对对象进行封装然后在进行拆分,移植性效果差,不存在缓存,面向SQL操作
JPA:面向对象操作,操做对象,数据库移植性强,只用重新配置方言就行,存在缓存,一级缓存,二级缓存,查询缓存,不用书写 SQL语句,直接调用方法就是对数据的操作,JPA对性能的优化不是很高。
4.第一个jpa项目
CRUD:
create建表策略:先删除表名,在创建新表
update建表策略:先判断数据库是否有该表,没有就直接插入数据,如果没有该表就先创建该表,再向该表插入数据
5.SpringDataJPA的几个核心API
Persistence:用于创建EntityManagerFactory,根据传入的Persistence Unit名称来创建 对应的EntityManagerFactory。
EntityManagerFactory(线程安全的单例):负责创建EntityManager对象,负责维护数据的二级缓存,重量级对象:配置了太多东西,数据库连接池,二级缓存,预定义的JPQL语句,所有的实体和关系
EntityManager(线程不安全):实体管理对象,提供与持久化相关的操作,有类似Hibernate的Session一级缓存。如果不清空一级缓存的话,获取到的对象会是同一个对象,如果清空了一级缓存,获取到的对象会是不同的对象
EntityTransaction:事务管理对象,只能控制相同一个数据库不同表的事务管理,大多数情况都使用这种
javax.transaction.Transaction JTA事务,处理不同数据库不同表的事务管理
Tomcat默认不支持JTA事务(不过可以通过添加插件来解决),或者需要用JavaEE服务器:如jboss,weblogic服务器
6.单表映射的配置细节
要求:
private Long id; //要求:主键,使用数据库的自动生成策略
private String name; //要求:varchar(20),数据库名称为username,不能为空,唯一
private String password;
private Integer age = 25; //要求:默认值是25,在插入数据时不允许覆盖(添加数据时不操作该字段)
private Boolean sex;// 数据库没有布尔类型,bit对象
private BigDecimal salary;// 19,2 工资不能为负数 check(salary>0.0)
private Date createTime;//包含年月日时分秒,不允许修改
private Date birthday;//包含年月日
private Date time;//包含时分秒
private String text;//这是一个大文本
private String temp;//这一个字段不要同步到数据库
持久类映射的配置
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(length = 20, nullable = false, unique = true)
private String name;
private String password;
// default="25"还必须同时配置一个属性insertable ="false",表示不出现在insert语句
@Column(insertable = false, columnDefinition = "int(11) default '25'")
private Integer age = 25;
private Boolean sex;// 数据库没有布尔类型,bit对象
@Column(columnDefinition = "decimal(19,2) check(salary>0.0)")
private BigDecimal salary;// 19,2
// update=false:一经保存就不能修改属性:身份证号码,创建时间
// 如果填错了,客户不能改,上传身份证照片,找客服,客服验证:程序员留后台hql:
// update Employee set idcart=? where id=?
// 创建时间:年月日时分秒
@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;
// 如果name属性希望不持久化数据库
// @Transient // 临时属性
private String temp;