JPA规范本质上就是一种ORM规范,但不是ORM框架
JPA 如何使用
接口继承JpaRepository
使用步骤
1 引入依赖
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.4.33.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
2. resource下配置yml文件
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/book?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
username: root
password: 123456
jpa:
hibernate:
ddl-auto: update # 是否自动生/更新成表,根据什么策略
# create 运行即创建表。覆盖之前的数据。
# create-drop 程序结束,清空表
# update 没有则创建,有表更新,元数据不清空
# validate 校验数据与数据库字段类型是否相同
# node 禁用DDL
naming:
strategy:org.hibernate.cfg.ImprovedNamingStrategy
show-sql: true # 是否在控制台展示sql语句
open-in-view: false # Spring Boot 自动加载 Spring # Data JPA
3 编写实体类entity
@Data
@Entity
@Table(name = 'nentity')
public class entity{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
/**
* strategy 参数用于 声明主键的生成策略
* TABLE: 使用一个特定的数据库表格存放主键。
* SEQUENCE:根据底层数据库的序列来生成主键
IDENTITY:主键自增
AUTO:主键由程序控制。(默认)
*/
@Column(name = "id")
private String id;
@Column(name='age',length=10,nullable=true)
private String age;
@Column(name='name',length=50,nullable=true)
private String name;
}
4 编写dao
/**
* 接口继承JpaRepository接口
**/
public interface EntityDao extends JpaRepository<Entity,Integer>{
/**
* 命名方式::
* findBy + 关键字 + 查询条件
**/
List<Users> findByName(String name);
List<Users> findByNameAndAge(String name,Integer age);
List<Users> findByNameLike(String name);
void updateNameById(@Param("id") Integer id, @Param("newName") String newName);
/**
* 根据参数位置注入
**/
@Query(value = "select id,age,name from Entity e where e.age>?1 and e.name=?2")
List<Book> findByPriceRange(int age,String name);
/**
* 根据参数名称注入
**/
@Query(value = "select name,age from Entity e where e.name = :name AND e.age =:age ")
List<Book> findByNamedParam(@Param("name") String name, @Param("age") int age,);
Page<Entity> findByage(Integer age,Pageable pageable);
}
5 编写Service
@Service
@Translation
public class EntityService{
@Autowired
private EntityDao entityDao;
public Entity saveEntity(Entity entity){
Entity entity1 = entityDao.save(entity);
return entity1;
}
public boolean deleteById(Integer id){
entityDao.deleteById(id);
}
public Page<Entity > getEmpByPage(Integer pageNum,Integer pageSize){
PageRequest pageable=PageRequest.of(pageNum-1,pageSize);
Page<Entity > page = entityDao.findAll(pageable);
return page;
}
@Query("update Entity set u.name=:newName where u.id=:id")
void updateEntityById(@Param("id") Integer id, @Param("newName") String newName);
}
CrudRepository类提供的方法:
6.编写Controller
@RestController
@RequestMapping("/jpatest")
public class EntityController{
@Autowired
private ENtityService service;
@RequestMapping("/add")
public Entity saveEntity(Entity entity){
Entity entity = entityService.saveEntity(entity);
return entity;
}
@DeleteMapping("/delete")
public boolean deleteEntity(Integer id){
return service.deleteById(id);
}
@RequestMapping(value = "/PageQuery")
public Stream<Entity> findAllOrder(@RequestParam("age") Integer age, @RequestParam("page") Integer page){
//Jpa 分页查询
Sort sort = Sort.by(Sort.Direction.DESC,"orderdate"); //通过订单日期进行排序,orderdate 是OrderBean 中的变量,不是数据库中的字段(*)
Pageable pageable = PageRequest.of(page,3,sort); // page 从 0 开始 ,3 是指每个page的大小,这个意思是按照订单日期排序分页查询,每次查询三个数据
return entityDao.findByage(age,pageable).get();
}
}
jpa 实体类相关注解
@Entity 实体类
@Table 关联实体类和表
@Column 关联实体类属性和表字段
@Id 对应表中主键id
@GeneratedValue 主键生成策略
@OneToMany 配置1对多关系
@ManyToOne 配置多对1关系
@OneToOne 配置1对1关系
@ManyToMany 配置多对多关系 多对多关系中一般不设置级联保存、级联删除、级联更新等操作。
@JoinColumn: 配置外键,参数:name:外键名称,referencedColumnName: 主表主键名称
JPA 优缺点
优点
- 1 使用jpa,与数据库交互负担降低了很多。
- 2 隐藏O / R映射和数据库访问处理, 代码容易写。
- 3 是面向对象的查询语言,可持久化
持久化对象的步骤:
1-创建尸体管理器工厂
EntityManagerFactoryemf=Persistence.createEntityManagerFactory(“Student_details”);
2- 从工厂获取尸体
EntityManager em=emf.createEntityManager();
3- 初始化实体管理器
em.getTransaction().begin();
4- 将数据持久化到关系数据库中。
Student s1 = new Student();
s1.setName(“stu”);
em.persist(s1); # 持久化,插入实体
=========
em.find
用于寻找实体
em.find(Studeng.class,args).setName(“abc”)
用于更新实体
em.remove(student)
用于删除实体
==========5 - commit
em.getTransaction().commit();
6- 释放工厂资源
emf.close();
em.close();
** Java对象
**缺点**
- 因为sql语句是自动生成的可读性是比较差的,对于一些高级业务或者复杂的查询都需要自己来实现sql
JPQL
一种面向对象的查询语言, 用于对持久性实体执行数据库操作
使用实体对象模型代替数据库表来操作SQL查询
1- 它既简单又健壮。
2- 它是与平台无关的查询语言。
3- JPQL查询可以在元数据中静态声明, 也可以在代码中动态构建。
4-它可以与任何数据库一起使用, 例如MySQL, Oracle。