JPA
图
ORM框架,JPA是Java Persistence API的简称,中文名Java持久层API,是JDK5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中,也能自动维护数据表结构

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);

}