spring data jpa

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语句

    AndfindByNameAndPwdwhere name= ? and pwd =?
    OrfindByNameOrSexwhere name= ? or sex=?
    Is,EqualsfindById,findByIdEqualswhere id= ?
    BetweenfindByIdBetweenwhere id between ? and ?
    LessThanfindByIdLessThanwhere id < ?
    LessThanEqualsfindByIdLessThanEqualswhere id <= ?
    GreaterThanfindByIdGreaterThanwhere id > ?
    GreaterThanEqualsfindByIdGreaterThanEqualswhere id > = ?
    AfterfindByIdAfterwhere id > ?
    BeforefindByIdBeforewhere id < ?
    IsNullfindByNameIsNullwhere name is null
    isNotNull,NotNullfindByNameNotNullwhere name is not null
    LikefindByNameLikewhere name like ?
    NotLikefindByNameNotLikewhere name not like ?
    StartingWithfindByNameStartingWithwhere name like ‘?%’
    EndingWithfindByNameEndingWithwhere name like ‘%?’
    ContainingfindByNameContainingwhere name like ‘%?%’
    OrderByfindByIdOrderByXDescwhere id=? order by x desc
    NotfindByNameNotwhere name <> ?
    InfindByIdIn(Collection<?> c)where id in (?)
    NotInfindByIdNotIn(Collection<?> c)where id not in (?)
    TRUEfindByAaaTuewhere aaa = true
    FALSEfindByAaaFalsewhere aaa = false
    IgnoreCasefindByNameIgnoreCasewhere 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(); 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值