JPA简介
Java Persistence API:用于对象持久化的API,JavaEE5.0平台标准的ORM规范,使得应用程序以统一的方式访问持久层
JPA是规范,不是ORM框架,真实实现由ORM厂商提供,JAP的始作俑者就是Hibernate的作者
配置
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
配置
# 配置
spring:
jpa:
hibernate:
# 表机构更新方式: | update | create-drop | none | validate
# create 每次启动删除已有重新生成表结构
# create-drop 每次启动删除已有重新生成结构,sessionFactory一关闭就删除
# update 检查表结构不一致再更新,已有不删除(常用)
# none 不对表进行任何操作
# validate 每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值
ddl-auto: update
# SQL日志显示
show-sql: true
# 页面缓存
open-in-view: false
实体类
import javax.persistence.Entity;
@Data
@TableName("test_entity") // 可选
@Entity
public class TestEntity {
@Id
private String id;
@Id
@Column(name = "id",columnDefinition="int unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID' ")
@TableId(value="id", type= IdType.AUTO)
private Integer id;
/**
* 名称
* 不能为空
*/
@Column(nullable = false)
private String name;
/**
* 排序号
* 默认0
*/
private Integer sort = 0;
/**
* 接口数据
* 大数据
*/
@Lob
private String data;
}
- @Entity:指定为表中实体类
- @Id:主键
- @Table(name="t_user"):指定表名
- @Column(name="username"):指定列名
- @Transient:用户忽略字段
没有指定表名、列名的情况下按驼峰命名转化下划线
主键生成策略
@GeneratedValue(strategy = GenerationType.IDENTITY)
GenerationType.IDENTITY:自增
GenerationType.SEQUENCE:序列(oracle)
GenerationType.TABLE:JPA提供的一种机制,通过一张数据库表的形式完成主键自增
GenerationType.AUTO:由程序自动选择
JPA使用SQL
/**
* 根据类型查询
*/
@Query(value = "select name,sort from Category where type=?", nativeQuery = true)
List<Category> selectListByType(Integer type);
/**
* 重命名
*/
@Query(value = "update category set name=? where id=?", nativeQuery = true)
@Modifying
Integer updateCategoryName(Integer id, String newName);
注意:根据参数顺序拿,nativeQuery为true才不会转义,更新必须加@Modifying
Repository
包含了增删改查,分页
其中save()
根据是否有主键进行添加和修改
/**
* JpaRepository继承了CRUD和Page,JpaSpecificationExecutor实现了条件查询
*/
public interface ModuleRepository extends JpaRepository<Module, String>, JpaSpecificationExecutor<Module> {
}
分页
条件查询
// 条件查询
List<Module> list = moduleRepository.findAll(new Specification<Module>() {
@Override
public Predicate toPredicate(Root<Module> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
// 获取条件对象
Predicate predicate = criteriaBuilder.conjunction();
// 模糊查询(不加%精确查询)
// root.get("实体属性名(不是表列名)")
predicate.getExpressions().add(criteriaBuilder.like(root.get("name"), "%" + req.getName() + "%"));
// 大于
predicate.getExpressions().add(criteriaBuilder.ge(root.get("sort"), req.getSort()));
return predicate;
}
});
可以改为lambda
// 条件查询
List<Module> list = moduleRepository.findAll((Specification<Module>) (root, query, builder) -> {
// 获取条件对象
Predicate predicate = builder.conjunction();
// 模糊查询(不加%精确查询)
// root.get("实体属性名(不是表列名)")
predicate.getExpressions().add(builder.like(root.get("name"), "%" + req.getName() + "%"));
// 大于
predicate.getExpressions().add(builder.ge(root.get("sort"), req.getSort()));
return predicate;
});
方法命名查询
/**
* 模块
*/
public interface ModuleRepository extends JpaRepository<Module, String>, JpaSpecificationExecutor<Module> {
/**
* 根据名称模糊查询
*/
List<Module> findByNameLike(String name);
/**
* 大于等于
*/
List<Module> findBySortGreaterThanEqual(Integer sort);
}