• 使用JPA

    • 虽然JPA是一个标准,但spring中一般就是使用hibernate实现的
    • 使用JPA(Java Persistence API,Java持久化API,是个规范,其实是借助Hibernate实现的)操作数据库,使用其CrudRepository接口。
    • 数据库建好后,表会在使用时自动创建。
    • 依赖是通过Gradle的dependencies中加入compile('org.springframework.boot:spring-boot-starter-data-jpa'),会简介引用一些其他的包如spring.rabbit-1.7.8.RELEASE.jar等
      • 也可能是通过引入上层的配置
    • application.properties中配置数据库信息,如果是Cloud Foundry等平台,app部署后的环境变量中如果有同名参数则会覆盖properties文件
# postgresql
spring.datasource.driverClassName=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/amp
spring.datasource.username=postgres
spring.datasource.password=deb.deb
spring.jpa.database=POSTGRESQL
spring.jpa.database-platform=org.hibernate.dialect.PostgresPlusDialect
spring.jpa.show-sql=false
spring.jpa.hibernate.ddl-auto=update
* 定义用户POJO(算是数据库表的映射类)
    * 没有表、索引等时,会自动创建
    * 会用到一些数据库相关的注解,如@Entity(name = "assignment")、@Table、@Index、@NoArgsConstructor、@Id、@GeneratedValue(strategy = GenerationType.AUTO)、@Column(name = "tenant_id", nullable = false)、、
@Entity(name = "assignment")
@Table(indexes = {
        @Index(name = AMPShiftCalendarConstants.IDX_TENANT_ID_ASSET_ID_ASSIGNMENT_START_DATE, columnList = "tenant_id, asset_id, assignment_start_date"),
        @Index(name = AMPShiftCalendarConstants.IDX_TENANT_ID_ASSIGNMENT_START_DATE, columnList = "tenant_id, assignment_start_date") })
@NoArgsConstructor
@Getter
@Setter
public class Assignment {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "assignment_id")
    private Long assignmentId;

    @Column(name = "tenant_id", nullable = false)
    private String tenantId;

    @Column(name = "asset_id", nullable = false)
    private String assetId;

    @Column(name = "content", columnDefinition = "TEXT")
    private String content;

    @Column(name = "assignment_start_date", columnDefinition = "timestamp with time zone", nullable = false)
    private Timestamp assignmentStartDate;

    @Column(name = "inserted_date", columnDefinition = "timestamp with time zone", nullable = false)
    private Timestamp insertedDate;

    @Enumerated(EnumType.STRING)
    @Column(name = "status", nullable = false)
    private AssignmentStatus status;

    public Assignment(String tenantId, String assetId, ShiftCalendar content, Timestamp assignmentStartDate, Timestamp insertedDate, AssignmentStatus status) {
        this.tenantId = tenantId;
        this.assetId = assetId;
        this.setShiftCalendar(content);
        this.assignmentStartDate = assignmentStartDate;
        this.insertedDate = insertedDate;
        this.status = status;
    }

    public ShiftCalendar getShiftCalendar() {
        return content != null ? Misc.deserializeSafeJson(content, ShiftCalendar.class) : null;
    }

    public void setShiftCalendar(ShiftCalendar template) {
        Check.notNull(template, "shiftCalendar");

        this.content = Misc.serializeSafeJson(template);
    }

    @Override
    public String toString() {
        return "Assignment [assignment_id=" + assignmentId + ", asset=" + assetId + ", assignmentStatus=" + status + ", content=" + content
                + ", assignment_start_date=" + assignmentStartDate + "]";
    }
}
* 自定义Repository类
    * 基于表及其映射类,也可以直接用CrudRepository
    * 用于数据库操作,有点类似于.NET的EF的DBContext类,基类已实现了部分通用简单的基于数据库表的操作,复杂的还是要自己拼sql(用xml或动态sql或者如下的方式)。
    * 其实还有其他更具体的功能更强的子类可以用,比如可以分页什么的。
    * getAllByTenantIdAndAssetId这种其实是利用了JPA的命名查询功能,可以指定通过哪些列来查询,还可以使用like功能。
    * @Query注解其实是JPA提供查询语言的JPQL,与Hibernate提供的HQL十分接近。
    * JPA(Hibernate)其实慢慢被mybatis替代了??
@Repository
public interface AssignmentRepository extends CrudRepository<Assignment, Long> {

    List<Assignment> getAllByTenantId(String tenantId);

    List<Assignment> getAllByTenantIdAndAssetId(String tenantId, String assetId);

    @Query(value = "" +
            "  SELECT " +
            "DISTINCT a.asset_id AS asset_id" +
            "    FROM assignment a " +
            "   WHERE a.tenant_id = :tenant_id" +
            "     AND a.assignment_start_date < :end_date" +
            "     AND a.status='ACTIVE'",
            nativeQuery = true)
    List<String> getAllAssetsWithActiveWorkplan(
            @Param("tenant_id") String tenantId,
            @Param("end_date") Timestamp endDate);

}

public interface MissingWorkPieceRepository extends CrudRepository<MissingWorkPiece, Long> {

    List<MissingWorkPiece> getAllByAssetIdAndTenantIdAndDateBetweenOrderByDateDesc(String assetId, String tenantId, Timestamp from, Timestamp to);

    Optional<MissingWorkPiece> getByAssetIdAndTenantIdAndDate(String assetId, String tenantId, Timestamp date);

    @Transactional
    void deleteByAssetIdAndTenantIdAndDate(String assetId, String tenantId, Timestamp date);

}

Spring Boot - Spring Data的更多相关文章

  1. Spring Boot + Spring Data + Elasticsearch实例

    Spring Boot + Spring Data + Elasticsearch实例 学习了:https://blog.csdn.net/huangshulang1234/article/detai ...

  2. 255.Spring Boot+Spring Security:使用md5加密

    说明 (1)JDK版本:1.8 (2)Spring Boot 2.0.6 (3)Spring Security 5.0.9 (4)Spring Data JPA 2.0.11.RELEASE (5)h ...

  3. 256.Spring Boot+Spring Security: MD5是加密算法吗?

    说明 (1)JDK版本:1.8 (2)Spring Boot 2.0.6 (3)Spring Security 5.0.9 (4)Spring Data JPA 2.0.11.RELEASE (5)h ...

  4. Spring Boot+Spring Security:获取用户信息和session并发控制

    说明 (1)JDK版本:1.8(2)Spring Boot 2.0.6(3)Spring Security 5.0.9(4)Spring Data JPA 2.0.11.RELEASE(5)hiber ...

  5. springboot成神之——spring boot,spring jdbc和spring transaction的使用

    本文介绍spring boot,spring jdbc和spring transaction的使用 项目结构 依赖 application model层 mapper层 dao层 exception层 ...

  6. spring Boot+spring Cloud实现微服务详细教程第二篇

    上一篇文章已经说明了一下,关于spring boot创建maven项目的简单步骤,相信很多熟悉Maven+Eclipse作为开发常用工具的朋友们都一目了然,这篇文章主要讲解一下,构建spring bo ...

  7. spring Boot+spring Cloud实现微服务详细教程第一篇

    前些天项目组的大佬跟我聊,说项目组想从之前的架构上剥离出来公用的模块做微服务的开发,恰好去年的5/6月份在上家公司学习了国内开源的dubbo+zookeeper实现的微服务的架构.自己平时对微服务的设 ...

  8. Spring boot +Spring Security + Thymeleaf 认证失败返回错误信息

    [Please make sure to select the branch corresponding to the version of Thymeleaf you are using] Stat ...

  9. Cola Cloud 基于 Spring Boot, Spring Cloud 构建微服务架构企业级开发平台

    Cola Cloud 基于 Spring Boot, Spring Cloud 构建微服务架构企业级开发平台: https://gitee.com/leecho/cola-cloud

  10. spring boot + spring batch 读数据库文件写入文本文件&读文本文件写入数据库

    好久没有写博客,换了一家新公司,原来的公司用的是spring,现在这家公司用的是spring boot.然后,项目组布置了一个任务,关于两个数据库之间的表同步,我首先想到的就是spring batch ...

随机推荐

  1. [leetcode]721. Accounts Merge账户合并

    Given a list accounts, each element accounts[i] is a list of strings, where the first element accoun ...

  2. 源码安装php时出现configure: error: xml2-config not found. Please check your libxml2 installation

    1.检查是否安装了libxml 包 > rpm -qa|grep libxml2 2.如果没有则安装 > yum install libxml2 > yum install libx ...

  3. JSP的内置对象application、session、request、page的作用域

    1.application内置对象的类型名称为ServletContext. 2.session内置对象的类型名称为HttpSession. 3.application作用域:对应整个应用上下文. a ...

  4. WCF的例子

    Demo的 “Service端”以本机IIS为宿主,“Client端”以WebForm项目为例. 1.新建项目:WCF>WCF Service Application: 2.删除默认文件ISer ...

  5. Halcon的一维条码解码步骤和解码技巧

    一.图像预处理和条码增强 对比度太低:scale_image(或使用外部程序scale_image_range),增强图像的对比度. 图像模糊:emphasize锐化图像,使条码看起来更清晰. 深色背 ...

  6. 『SpringMVC』<context:include-filter>&<context:exclude-filter>爬坑

    原文地址:https://segmentfault.com/a/1190000012972619 大家好,我是猪弟,猪在我心中从来不是蠢的代名词,而是懒的代名词,本次准备记录一个在开发测试过程中遇到的 ...

  7. 对FPKM/RPKM以及TPM的理解

    对FPKM/RPKM以及TPM的理解 2018年07月03日 16:05:53 sixu_9days 阅读数:559 标签: FPKM/RPKMTPMRNA-Seq 更多 个人分类: RNA-Seq ...

  8. Vue.js 2.0 跨域请求数据

    Vuejs由1.0更新到了2.0版本.HTTP请求官方也从推荐使用Vue-Resoure变为了 axios .接下来我们来简单地用axios进行一下异步请求.(阅读本文作者默认读者具有使用npm命令的 ...

  9. 通过BeanShell获取UUID并将参数传递给Jmeter

    有些HTTPS请求报文的报文体中包含由客户端生成的UUID,在用Jmeter做接口自动化测试的时候,因为越过了客户端,直接向服务器端发送报文,所以,需要在Jmeter中通过beanshell获取UUI ...

  10. Mockplus是如何节省你的原型时间的?

    还在用老牌原型工具一点点绘制产品原型吗?还在为实现一个满意的交互而绞尽脑汁吗?还在为无法和用户高效沟通而发愁吗?朋友,现在是快速原型的时代了.时间不等人,当你精雕细琢完成产品启动页的时候,别人的原型已 ...