JPA
jpa是什么
-
JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。 [1]
Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。
JPA依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
jpa配置文件
在application.yml文件中添加如下配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/mytest
type: com.alibaba.druid.pool.DruidDataSource
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver //驱动
jpa:
hibernate:
ddl-auto: update //自动更新
show-sql: true //日志中显示sql语句
jpa.hibernate.ddl-auto是hibernate的配置属性,其主要作用是:自动创建、更新、验证数据库表结构。该参数的几种配置如下:
·create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
·create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
·update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。
·validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
jpa怎么用
-
repository首先要继承 extends JpaRepository<Contract, Number> 泛型为实体类 和主键类型, JpaSpecificationExecutor 总共两个类 加上@Repository
-
service 业务逻辑实现
调用的方法都是命名规范的自带sql语句
And findByNameAndPwd where name= ? and pwd =? Or findByNameOrSex where name= ? or sex=? Is,Equals findById,findByIdEquals where id= ? Between findByIdBetween where id between ? and ? LessThan findByIdLessThan where id < ? LessThanEquals findByIdLessThanEquals where id <= ? GreaterThan findByIdGreaterThan where id > ? GreaterThanEquals findByIdGreaterThanEquals where id > = ? After findByIdAfter where id > ? Before findByIdBefore where id < ? IsNull findByNameIsNull where name is null isNotNull,NotNull findByNameNotNull where name is not null Like findByNameLike where name like ? NotLike findByNameNotLike where name not like ? StartingWith findByNameStartingWith where name like ‘?%’ EndingWith findByNameEndingWith where name like ‘%?’ Containing findByNameContaining where name like ‘%?%’ OrderBy findByIdOrderByXDesc where id=? order by x desc Not findByNameNot where name <> ? In findByIdIn(Collection<?> c) where id in (?) NotIn findByIdNotIn(Collection<?> c) where id not in (?) TRUE findByAaaTue where aaa = true FALSE findByAaaFalse where aaa = false IgnoreCase findByNameIgnoreCase where UPPER(name)=UPPER(?) Entity
@Entity @Getter @Setter public class DwSysRole { @Id @GeneratedValue private Long id; @Column(name = "name", nullable = true, length = 20) private String name; @Column(name = "agee", nullable = true, length = 4) private int age; }
Service
package com.esop.cloud.marketing.service; import com.esop.cloud.marketing.common.utils.Objectx; import com.esop.cloud.marketing.dto.SysRoleDto; import com.esop.cloud.marketing.entity.DwSysRole; import com.esop.cloud.marketing.repository.DwSysRoleRepository; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Repository; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * 服务test * @since : 2020-09-22 11:24 */ @Service @Slf4j public class TestService { @Resource DwSysRoleRepository dwSysRoleRepository; /** * 角色添加 * @param sysRoleDto */ public Page<DwSysRole> addRole(SysRoleDto sysRoleDto) { /** * eg:查询案例 */ List<DwSysRole> allRoleForOpId = dwSysRoleRepository.findAllRoleForOpId(sysRoleDto.getOpId()); log.info(sysRoleDto.getOpId()+"allRoleForOpId"+allRoleForOpId.size()); List<DwSysRole> list = dwSysRoleRepository.findAllByOpIdAndState(sysRoleDto.getOpId(), "U"); log.info(sysRoleDto.getOpId()+"list"+list.size()); /** * 分页查询 */ Page<DwSysRole> dwSysRolePage = dwSysRoleRepository.findAllByOpIdAndState(sysRoleDto.getOpId(), "U", PageRequest.of(sysRoleDto.getPage(), sysRoleDto.getPageSize())); log.info("dwSysRolePage"+dwSysRolePage.getTotalElements()); /** * 第三种,查询方式。匿名内部类,可根据条件判断 */ Page<DwSysRole> rolePage = dwSysRoleRepository.findAll(new Specification<DwSysRole>() { @Override public Predicate toPredicate(Root<DwSysRole> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) { List<Predicate> list = new ArrayList<>(); list.add(criteriaBuilder.equal(root.get(DwSysRole.FIELD_STATE).as(String.class), "U")); if (sysRoleDto.getOpId() != null) { //不为空才加入以下条件 list.add(criteriaBuilder.equal(root.get(DwSysRole.FIELD_OP_ID).as(String.class), sysRoleDto.getOpId())); } if (StringUtils.isNotEmpty(sysRoleDto.getIdOrName())) { //idOrName可能是id也可能是name用or拼接。同时用模糊查询 list.add(criteriaBuilder.or(criteriaBuilder.like(root.get(DwSysRole.FIELD_ROLE_NAME), "%" + sysRoleDto.getIdOrName() + "%"), criteriaBuilder.like(root.get(DwSysRole.FIELD_ROLE_ID), "%" + sysRoleDto.getIdOrName() + "%"))); } //时间范围查询 if (Objectx.isNotNull(sysRoleDto.getStartDate()) && Objectx.isNotNull(sysRoleDto.getEndDate())) { //传了开始时间-结束时间。查询这个范围用between list.add(criteriaBuilder.between(root.<Date>get(DwSysRole.FIELD_CREATE_DATE), sysRoleDto.getStartDate(), sysRoleDto.getEndDate())); }else if(Objectx.isNotNull(sysRoleDto.getStartDate()) && Objectx.isNull(sysRoleDto.getEndDate())) { //只传了开始时间。查询大于开始时间,用greaterThanOrEqualTo list.add(criteriaBuilder.greaterThanOrEqualTo(root.<Date>get(DwSysRole.FIELD_CREATE_DATE), sysRoleDto.getStartDate())); }else if(Objectx.isNull(sysRoleDto.getStartDate()) && Objectx.isNotNull(sysRoleDto.getEndDate())) { //只传了结束时间。查询小于结束时间,lessThanOrEqualTo list.add(criteriaBuilder.lessThanOrEqualTo(root.<Date>get(DwSysRole.FIELD_CREATE_DATE), sysRoleDto.getEndDate())); } Predicate[] p = new Predicate[list.size()]; return criteriaBuilder.and(list.toArray(p)); } }, PageRequest.of(sysRoleDto.getPage(), sysRoleDto.getPageSize(),new Sort(Sort.Direction.DESC, DwSysRole.FIELD_CREATE_DATE))); log.info("rolePage"+rolePage.getTotalElements()); /** * eg。保存 */ DwSysRole dwSysRole = sysRoleDto.toEntity(); dwSysRoleRepository.save(dwSysRole); return dwSysRolePage; } }
-
Dto 页面传来的数据封装在dto里 时间格式需要加上
@DateTimeFormat(pattern = "yyyy-MM-dd ") @JsonFormat(pattern = "yyyy-MM-dd ", timezone = "GMT+8") 主键需要加上 表名 @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "DW_MARK_BUSINESS_OPPORT") @SequenceGenerator(name = "DW_MARK_BUSINESS_OPPORT", sequenceName = "DW_MARK_BUSINESS_OPPORT_SEQ",allocationSize=1)
-
vo返回的数据封装在vo里 需要显示的页面数据 总数据之类的 分页数据放在list集合 类上加上lombok注解@data
lombok注解
@Data
@NoArgsConstructor 生成一个没有参数的构造器
@AllArgsConstructor 生成一个包含所有参数的构造器
@RequiredArgsConstructor : 生成一个包含 "特定参数" 的构造器,特定参数指的是那些有加上 final 修饰词的变量们
@Builder
@Builder注解的作用 注解赋值新对象
serInfo userInfo = UserInfo.builder()
.name("zzl")
.email("bgood@sina.com")
.build();
@Builder注解修改原对象的属性值
修改实体,要求实体上添加@Builder(toBuilder=true)
userInfo = userInfo.toBuilder()
.name("OK")
.email("zgood@sina.com")
.build();