这里就滤过Spring Data JPA我的项目部署,不分明的能够看一下开源我的项目AutoAdmin。

Entity(表实体类)

一个表对应一个实体类,这里以AutoAdmin的sys_user表为例:

import cn.songhaiqing.autoadmin.base.BaseEntity;import org.hibernate.annotations.Where;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.Table;@Entity@Table(name = "sys_user")@Where(clause = "deleted=0")public class SysUser extends BaseEntity {    // 账号    @Column(name = "account")    private String account;    // 明码    @Column(name = "password")    private String password;    // 姓名    @Column(name = "name")    private String name;    // 明码加密盐    @Column(name = "salt")    private String salt;    public String getAccount() {        return account;    }    public void setAccount(String account) {        this.account = account;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getSalt() {        return salt;    }    public void setSalt(String salt) {        this.salt = salt;    }}

备注

  • @Table注解:写表名,如果表是刚好应用驼峰命名的话能够不写,倡议写上。
  • @Where :查问该表时会主动加个的条件,用来做软删除过滤是十分好的抉择,然而在@ManyToOne get该实体时如果数据已删除就会有问题,留神区别应用。
  • @Column 字段申明,能够写在不同的地位,但集体习惯写在字段上一行。属性名能够和数据库表字段名不一样。

BaseEntity
实体类继承了BaseEntity,该类写一些通用的字段,像ID、创立工夫、更新工夫、删除标注等。

import javax.persistence.*;import java.util.Date;@MappedSuperclasspublic class BaseEntity {    @Id    @GeneratedValue(strategy = GenerationType.AUTO)    private Long id;    @Column(name = "create_time", nullable = false,updatable = false)    private Date createTime = new Date();    @Column(name = "update_time", nullable = false)    private Date updateTime = new Date();    @Column(name = "deleted", nullable = false)    private boolean deleted = false;    public Date getCreateTime() {        return createTime;    }    public Date getUpdateTime() {        return updateTime;    }    public void setUpdateTime(Date updateTime) {        this.updateTime = updateTime;    }    public Long getId() {        return id;    }    public void setId(Long id) {        this.id = id;    }    public void setCreateTime(Date createTime) {        this.createTime = createTime;    }    public boolean isDeleted() {        return deleted;    }    public void setDeleted(boolean deleted) {        this.deleted = deleted;    }}

备注
* @Id @GeneratedValue(strategy = GenerationType.AUTO) ID 自增
* 默认值:间接给变量设置初始值就能够了,create_time(创立工夫)有点不一样,因为我不想当前扭转值,因为须要设置updatable = false。

Repository(表操作接口)

有人习惯叫DAO或其余,JPA很重要的中央,应用JPA的语法简略间接的代替了大部分SQL。

示例

import cn.songhaiqing.autoadmin.entity.SysUser;import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.data.jpa.repository.JpaSpecificationExecutor;import org.springframework.stereotype.Repository;@Repositorypublic interface SysUserRepository extends JpaRepository<SysUser, Long>,JpaSpecificationExecutor<SysUser> {    SysUser findByAccount(String account);    long countByAccount(String account);    long countByAccountAndIdNot(String account, Long id);}

查问

依据单查问(一条后果)

SysUser findByAccount(String account);

须要确保返回的后果最多只有一条,否则会报错

依据单查问(多条后果)

List<SysUser> findByAccount(String account);

多条件查问

SysUser findByAccountAndPassword(String account, String password);

查问第一条

SysUser findFirstByAccount(String account);

查问前10条

SysUser findTop10ByAccount(String account);

排序

SysUser findTop10ByAccount(String account);

JPA语法

KeywordSampleJPQL snippet
AndfindByLastnameAndFirstname… where x.lastname = ?1 and x.firstname = ?2
OrfindByLastnameOrFirstname… where x.lastname = ?1 or x.firstname = ?2
Is,EqualsfindByFirstname… where x.firstname = ?1
findByFirstnameIs
findByFirstnameEquals
BetweenfindByStartDateBetween… where x.startDate between ?1 and ?2
LessThanfindByAgeLessThan… where x.age < ?1
LessThanEqualfindByAgeLessThanEqual… where x.age <= ?1
GreaterThanfindByAgeGreaterThan… where x.age > ?1
GreaterThanEqualfindByAgeGreaterThanEqual… where x.age >= ?1
AfterfindByStartDateAfter… where x.startDate > ?1
BeforefindByStartDateBefore… where x.startDate < ?1
IsNullfindByAgeIsNull… where x.age is null
IsNotNull,NotNullfindByAge(Is)NotNull… where x.age not null
LikefindByFirstnameLike… where x.firstname like ?1
NotLikefindByFirstnameNotLike… where x.firstname not like ?1
StartingWithfindByFirstnameStartingWith… where x.firstname like ?1(parameter bound with appended %)
EndingWithfindByFirstnameEndingWith… where x.firstname like ?1(parameter bound with prepended %)
ContainingfindByFirstnameContaining… where x.firstname like ?1(parameter bound wrapped in %)
OrderByfindByAgeOrderByLastnameDesc… where x.age = ?1 order by x.lastname desc
NotfindByLastnameNot… where x.lastname <> ?1
InfindByAgeIn(Collection ages)… where x.age in ?1
NotInfindByAgeNotIn(Collection ages)… where x.age not in ?1
TRUEfindByActiveTrue()… where x.active = true
FALSEfindByActiveFalse()… where x.active = false
IgnoreCasefindByFirstnameIgnoreCase… where UPPER(x.firstame) = UPPER(?1)

分页简单查问

示例

List<Sort.Order> orders = new ArrayList<>();orders.add(new Sort.Order(Sort.Direction.DESC,"id"));Sort sort = new Sort(orders);Page<SysUser> page = sysUserRepository.findAll(new Specification<SysUser>(){    @Override    public Predicate toPredicate(Root<SysUser> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {        List<Predicate> predicate = new ArrayList<>();        // 此处增加过滤条件        Predicate[] pre = new Predicate[predicate.size()];        return criteriaQuery.where(predicate.toArray(pre)).getRestriction();    }},new PageRequest(query.getPage() - 1, query.getLimit(),sort));BaseResponseList<SysUserViewModel> result = new BaseResponseList<>();result.setCount(page.getTotalElements());List<SysUserViewModel> models = new ArrayList<>();for (SysUser sysUser : page.getContent()) {    SysUserViewModel model = new SysUserViewModel();    model.setId(sysUser.getId());    model.setAccount(sysUser.getAccount());    model.setName(sysUser.getName());    models.add(model);}result.setData(models);return result;

此例中联合了分页、排序、过滤性能。

参考

  • Spring Data JPA官网文档