- 使用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的更多相关文章
-
Spring Boot + Spring Data + Elasticsearch实例
Spring Boot + Spring Data + Elasticsearch实例 学习了:https://blog.csdn.net/huangshulang1234/article/detai ...
-
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 ...
-
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 ...
-
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 ...
-
springboot成神之——spring boot,spring jdbc和spring transaction的使用
本文介绍spring boot,spring jdbc和spring transaction的使用 项目结构 依赖 application model层 mapper层 dao层 exception层 ...
-
spring Boot+spring Cloud实现微服务详细教程第二篇
上一篇文章已经说明了一下,关于spring boot创建maven项目的简单步骤,相信很多熟悉Maven+Eclipse作为开发常用工具的朋友们都一目了然,这篇文章主要讲解一下,构建spring bo ...
-
spring Boot+spring Cloud实现微服务详细教程第一篇
前些天项目组的大佬跟我聊,说项目组想从之前的架构上剥离出来公用的模块做微服务的开发,恰好去年的5/6月份在上家公司学习了国内开源的dubbo+zookeeper实现的微服务的架构.自己平时对微服务的设 ...
-
Spring boot +Spring Security + Thymeleaf 认证失败返回错误信息
[Please make sure to select the branch corresponding to the version of Thymeleaf you are using] Stat ...
-
Cola Cloud 基于 Spring Boot, Spring Cloud 构建微服务架构企业级开发平台
Cola Cloud 基于 Spring Boot, Spring Cloud 构建微服务架构企业级开发平台: https://gitee.com/leecho/cola-cloud
-
spring boot + spring batch 读数据库文件写入文本文件&;读文本文件写入数据库
好久没有写博客,换了一家新公司,原来的公司用的是spring,现在这家公司用的是spring boot.然后,项目组布置了一个任务,关于两个数据库之间的表同步,我首先想到的就是spring batch ...
随机推荐
-
C# 获取当前,相对,绝对路径
一.C#获取当前路径的方法: 1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName -获取模块的完整路径. 2. ...
-
python之I/O多路复用
python IO多路复用 一.多路复用概念: 监听多个描述符(文件描述符(windows下暂不支持).网络描述符)的状态,如果描述符状态改变 则会被内核修改标志位,进而被进程获取进而进行 ...
-
如何把匿名类型.GetType()返回的对象传进泛型里面[转]
//怎么取得匿名类型的Type放到 //泛型T当中?? var 匿名 = new { A = 0, B = 1 }; Type t = 匿名.GetType(); //然后下面 var xx = db ...
-
prop()、attr()和data()
设置元素属性,用attr()还是prop()? 对于取值为true /false的属性,如 checked/selected/readonly或者disabled,使用prop(),其他属性使用 at ...
-
Visual Studio 2017离线安装包下载、安装
1. 首先下载在线安装exe,官网地址https://www.visualstudio.com/zh-hans/downloads/ 2. 运行CMD, 执行脚本 vs_enterprise.exe ...
-
MarkDownPad2基本语法
一.换行和空格 (1)换行 行尾加两个空格 (2)空格 二.标题 在#后跟个空格再写文字,一个#是一级标题,两个#是二级标题,以此类推,支持六级标题. 示例: # 一级标题 ...
-
socket关闭状态问题
下面是对 譬如 “CLOSE_WAIT” 现象的一些解释: 主动关闭方和被动方经历的状态:FIN_WAIT_1(主动关闭一方): 当SOCKET在ESTABLISHED状态时,它想主动关 闭 ...
-
django网站地图sitemap
网站地图是根据网站的结构.框架.内容,生成的导航网页,是一个网站所有链接的容器.很多网站的连接层次比较深,蜘蛛很难抓取到,网站地图可以方便搜索引擎或者网络蜘蛛抓取网站页面,了解网站的架构,为网络蜘蛛指 ...
-
001.hadoop及hbase部署
一 环境准备 1.1 相关环境 系统:CentOS 7 #CentOS 6.x系列也可参考,转换相关命令即可. hadoop包:hadoop-2.7.0.tar.gz #下载官方地址:http://w ...
-
Selenium+java上传文件
自动化调用: AutoIT脚本编译成可执行文件后,放在本地的某一个目录下 上传文件时,首先定位到[上传]字样文本,点击该按钮 执行编辑后的可执行文件,实现文件上传 一.安装AutoIT3,主要用到的工 ...