本篇文章为黑马程序员传智播客的记录,方便自己复习
- 简单介绍:
ORM思想:
Object Relationship Mapping -----对象关系映射
目的:操作POJO(实体类)等价于操作数据库的表
①POJO类和表的映射关系
②POJO类中属性与表中字段的映射关系
JDBC:
只需要修改一下连接接口的规则和其他的少量的地方即可使用多个数据库
hibernate:
一个开源的对象关系映射框架,他对JDBC进行了非常轻量级的对象封装,他将POJO(实体类)与数据库的表建立映射关系,是一个全自动的ORM框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以专注的随心所欲的使用面向对象编程思维来操纵数据库。
【图片摘自 黑马程序员 传智播客】
Spring Data Jpa:
是基于ORM框架 与 Jpa规范的基础上的一套Jpa应用框架,可以使开发者极简的代码即可实现对数据库的访问与操作,包括CURD在内的基本操作,并且容易扩展。使用Spring Data Jpa 可以极大的提高开发效率。
Spring Data Jpa 让我们脱离了Dao层的操作,基本上所有的CURD都可以通过他来实现,在实际的工作中,
推荐使Spring Data Jpa+ORM(如:hibernate)完成操作,这样在切换不同的框架时提供了极大的方便同时也使数据库的操作变得简便,方便解耦。
【图片摘自 黑马程序员 传智播客】
hibernate Jpa规范 Spring Data Jpa的关系
JPA是一套规范,内部有接口和抽象类组成。hibernate是一个成熟的ORM框架,并且hibernate实现了JPA规范,是JPA的一种实现方式,我们通过使用JPA的API进行编程,意味着站在了一个更高的角度(面向接口)看待问题。
SpringDataJpa是Spring提供的一套对于JPA规范更高级的封装,是在JPA规范下用来进行数据库持久化的解决方案。
真正发挥作用的位置:在程序执行的过程中通过使用动态代理的方式来生成了实现类(不需要我们自己去实现接口的方法)
Jpa提供的注解:
-
修饰类的注解
@Entity 标明为POJO类
@Table 默认为以POJO类名为表名的表
@Table(name=" ") 可以自己起表的名字 -
修饰成员变量的注解
@Id 声明为主键
@GeneratedValue 配置主键生成策略[推荐使用前2种]
① @GeneratedValue(strategy =GenerationType.IDENTITY)mysql
底层数据库必须支持主键自增的方式
② @GeneratedValue(strategy = GenerationType.SEQUENCE) oracle
底层数据库必须支持主键序列自增的方式
*③@GeneratedValue(strategy = GenerationType.TABLE)
jpa提供的通过创建一张表来提供自增
*④@GeneratedValue(strategy = GenerationType.AUTO)
自动帮选择主键生成策略
@Column 默认通过成员变量名来创建字段(映射关系)
@Column(name=" ")自定义字段名
DAO接口层
继承了两个接口:
①JpaRepository<POJO类类型,主键类型 >,
封装了基本的CURD操作
②JpaSpecificationExecutor<POJO类类型>
封装了复杂查询(多条件查询,分页查询等)
直接使用dao层的接口的对象d
d.exists(id); //是否存在 (实际上也是通过count sql语句去判断的)
d.count(); //统计个数
参数懒得写了
d对象内置的方法(包括查询):
d.save(); //先看看有没有这个id的记录,true 进行修改,false进行插入保存
d.delete();
d.findAll();
d对象可以使用命名规则的查询方法 :(find以后的首字母大写 And表示并列 Or表示 任意)
d.findById();
d.findByIdAndUserName();
d.findUserByIdAndPassWord();
可以插入sql 语句 或jpql语句进行查询:
此时需要在Dao层中定义方法,并且在方法上使用@Query注解
注解: @Query
value:jpql语句|sql语句
nativeQuery:false (使用jpql查询) | true (使用本地查询: sql查询)
默认为false
public interface HistoryRepository extends JpaRepository<History,Long> {
History findByUseridAndBlogid(Long userid, Long blogid);
@Transactional
@Modifying
//nativeQuery为true说明是sql语句
@Query(value = "delete from history where id order by id limit 1", nativeQuery = true)
void deleteByQueryQuery();
}
占位符与参数问题
案例①:
@modifying //如果是修改操作要加上这句
update Customer set custName=? where custId=?
public void up(String custName, Long custId);
位置是对应的,就没问题
案例②:
@modifying //如果是修改操作要加上这句
update Customer set custName=?2 where custId=?1
public void up( Long custId,String custName);
位置不对应,要在Query语句中使用以1为起始的编号手动对应
当要使用jpql语句进行操作时,要加上
@Transactional //标注为事务
@Rollback(value=“false”) //默认为true ,若为true则执行不出错,但并没有修改
JpaSpecificationExecutor详解
Spring data JPA中的onetomore 的级联操作
创建一对多(多余的语句)
放弃对外键的维护(解决方法)
创建多对多
放弃对外键的维护