实用知识(工作中常用)

mybatis-plus联表查询

pom.xml坐标

<!-- mybatis-plus-join -->
<dependency>
    <groupId>com.github.yulichang</groupId>
    <artifactId>mybatis-plus-join</artifactId>
    <version>1.2.4</version>
</dependency>

使用步骤:

  1. 新建Mapper(SmsAssetConsumableOutStorageApplyProcessDetailMPJMapper)

    @Component(value = "SmsAssetConsumableOutStorageApplyProcessDetailMPJMapper")
    public interface SmsAssetConsumableOutStorageApplyProcessDetailMPJMapper extends MPJBaseMapper<SmsAssetConsumableOutStorageApplyProcessDetail> {
    }
    
  2. 注入

    @Autowired
    SmsAssetConsumableOutStorageApplyProcessDetailMPJMapper smsAssetConsumableOutStorageApplyProcessDetailMPJMapper;
    

使用示例:

//SELECT
//	*
//FROM
//	sms_asset_consumable_in_storage_apply_process_detail
//	LEFT JOIN sms_asset_consumable_in_storage_apply ON sms_asset_consumable_in_storage_apply.id = sms_asset_consumable_in_storage_apply_process_detail.apply_id
//WHERE
//	sms_asset_consumable_in_storage_apply_process_detail.allow_user_id = '1670620062848978945'
//ORDER BY
//	sms_asset_consumable_in_storage_apply.create_time,
//	sms_asset_consumable_in_storage_apply_process_detail.end_time
MPJLambdaWrapper<SmsAssetConsumableInStorageApplyProcessDetail> mpjLambdaWrapper = new MPJLambdaWrapper<>();
mpjLambdaWrapper.selectAll(SmsAssetConsumableInStorageApplyProcessDetail.class)
        .selectAll(SmsAssetConsumableInStorageApply.class)
        .selectAs(SmsAssetConsumableInStorageApply::getCreateTime, "applyCreateTime")
        .selectAs(SmsAssetConsumableInStorageApplyProcessDetail::getId, "detailId")
        .leftJoin(SmsAssetConsumableInStorageApply.class, SmsAssetConsumableInStorageApply::getId, SmsAssetConsumableInStorageApplyProcessDetail::getApplyId)
        .eq(SmsAssetConsumableInStorageApplyProcessDetail::getAllowUserId, userId)
        .orderByDesc(SmsAssetConsumableInStorageApply::getCreateTime)
        .orderByDesc(SmsAssetConsumableInStorageApplyProcessDetail::getEndTime);

数据校验(@Valid 和 @Validated)

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>xxx</version>
</dependency>

使用案例

package com.zyq.beans;
 
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
 
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;
 
/**
 * 员工对象
 * 
 * @author sunnyzyq
 * @since 2019/12/13
 */
@Data
public class Employee {
 
    /** 姓名 */
    @NotBlank(message = "请输入名称")
    @Length(message = "名称不能超过个 {max} 字符", max = 10)
    public String name;
 
    /** 年龄 */
    @NotNull(message = "请输入年龄")
    @Range(message = "年龄范围为 {min} 到 {max} 之间", min = 1, max = 100)
    public Integer age;
    
}

@Valid

在这里插入图片描述
在这里插入图片描述

@Validated

首先我们创建一个校验异常捕获类 ValidExceptionHandler ,然后打上 @RestControllerAdvice 注解,该注解表示他会去抓所有 @Controller 标记类的异常,并在异常处理后返回以 JSON 或字符串的格式响应前端。

package com.zyq.config;
 
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
 
@RestControllerAdvice
public class ValidExceptionHandler {
 
    @ExceptionHandler(BindException.class)
    public String validExceptionHandler(BindException exception) {
        return exception.getAllErrors().get(0).getDefaultMessage();
    }
 
}

实体类字段常用注解

在这里插入图片描述

Java实体类的属性类型与数据库表字段类型对应表

Java数据类型Hibernate数据类型标准SQL数据类型 (PS:对于不同的DB可能有所差异)
byte、java.lang.BytebyteTINYINT
short、java.lang.ShortshortSMALLINT
int、java.lang.IntegerintegerINGEGER
long、java.lang.LonglongBIGINT
float、java.lang.FloatfloatFLOAT
double、java.lang.DoubledoubleDOUBLE
java.math.BigDecimalbig_decimalNUMERIC
char、java.lang.CharactercharacterCHAR(1)
boolean、java.lang.BooleanbooleanBIT
java.lang.StringstringVARCHAR
boolean、java.lang.Booleanyes_noCHAR(1)(‘Y’或‘N’)
boolean、java.lang.Booleantrue_falseCHAR(1)(‘Y’或‘N’)
java.util.Date、java.sql.DatedateDATE
java.util.Date、java.sql.TimetimeTIME
java.util.Date、java.sql.TimestamptimestampTIMESTAMP
java.util.CalendarcalendarTIMESTAMP
java.util.Calendarcalendar_dateDATE
byte[]binaryVARBINARY、BLOB
java.lang.StringtextCLOB
java.io.SerializableserializableVARBINARY、BLOB
java.sql.ClobclobCLOB
java.sql.BlobblobBLOB
java.lang.ClassclassVARCHAR
java.util.LocalelocaleVARCHAR
java.util.TimeZonetimezoneVARCHAR
java.util.CurrencycurrencyVARCHAR

数据库存JSON数据

存基本数据类型

//创建分支节点(上下虚拟节点及两个审批节点)并处理节点间关系
ArrayList<AppProcessNodeConfig> nodeList = new ArrayList<>();
AppProcessNodeConfig approverLeft = initializeApproverNode(prevNode.getAppId());
AppProcessNodeConfig approverRight = initializeApproverNode(prevNode.getAppId());
AppProcessNodeConfig dummyUp = initializeDummyNode(prevNode.getAppId());
AppProcessNodeConfig dummyDown = initializeDummyNode(prevNode.getAppId());

approverLeft.setPrevId(JSON.toJSONString(Arrays.asList(dummyUp.getId())));
approverLeft.setNextId(JSON.toJSONString(Arrays.asList(dummyDown.getId())));
approverRight.setPrevId(JSON.toJSONString(Arrays.asList(dummyUp.getId())));
approverRight.setNextId(JSON.toJSONString(Arrays.asList(dummyDown.getId())));
dummyUp.setPrevId(JSON.toJSONString(Arrays.asList(prevNodeId)));
dummyUp.setNextId(JSON.toJSONString(Arrays.asList(approverLeft.getId(), approverRight.getId())));
dummyDown.setPrevId(JSON.toJSONString(Arrays.asList(approverLeft.getId(), approverRight.getId())));
dummyDown.setNextId(JSON.toJSONString(Arrays.asList(nextNodeId)));

取基本数据类型

//获取父节点及其子idList
AppProcessNodeConfig prevNode = appProcessNodeConfigMapper.selectById(prevNodeId);
if (isNullOrEmpty(prevNode)) {
    return CommonResult.failed(CommonCodeEnum.NODE_NOT_EXIST);
}
List<String> prevNodeSonIdList = JSON.parseArray(prevNode.getNextId(), String.class);

存对象

@Data
@EqualsAndHashCode(callSuper = false)
public class AuthorityResp implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @ApiModelProperty(value = "控件名称")
    private String name;
    @ApiModelProperty(value = "是否可读")
    private Boolean readable;
    @ApiModelProperty(value = "是否可编辑")
    private Boolean editable;
}
private String getAuthority(String appId, Boolean readable, Boolean editable) {
    List<AuthorityResp> authorityRespList = new ArrayList<>();
    AppTextControlConfig textControlConfig = appTextControlConfigMapper.selectOne(new LambdaQueryWrapper<AppTextControlConfig>()
                .eq(AppTextControlConfig::getControlOrderId, controlOrder.getId()));
    AuthorityResp authorityResp = new AuthorityResp();
    authorityResp.setName(textControlConfig.getName());
    authorityResp.setReadable(readable);
    authorityResp.setEditable(editable);
    authorityRespList.add(authorityResp);
    return JSON.toJSONString(authorityRespList);
}

private AppProcessNodeConfig initializeApproverNode(String appId) {
    AppProcessNodeConfig approver = new AppProcessNodeConfig();
    approver.setAppId(appId);
    approver.setName("审批");
    approver.setType(APPROVE_NODE);
    approver.setApproverType(DYNAMIC_APP_SUBMITTER);
    //设置权限
    String authority = getAuthority(appId, true, true);
    approver.setAuthority(authority);
    approver.setIsDeliver(true);
    approver.setIsRollback(true);
    approver.setIsSign(true);
    approver.setIsStamp(true);
    approver.setIsOpinion(true);
    appProcessNodeConfigMapper.insert(approver);
    return approver;
}

传统的SimpleDateFormat类计算时间差

用SimpleDateFormat计算时间差的方法,网上找了一份,自己跑了一遍,可以使用,贴在下面

/**
* 用SimpleDateFormat计算时间差
* @throws ParseException 
*/
public static void calculateTimeDifferenceBySimpleDateFormat() throws ParseException {
    SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm");
    /*天数差*/
    Date fromDate1 = simpleFormat.parse("2018-03-01 12:00");  
    Date toDate1 = simpleFormat.parse("2018-03-12 12:00");  
    long from1 = fromDate1.getTime();  
    long to1 = toDate1.getTime();  
    int days = (int) ((to1 - from1) / (1000 * 60 * 60 * 24));  
    System.out.println("两个时间之间的天数差为:" + days);

    /*小时差*/
    Date fromDate2 = simpleFormat.parse("2018-03-01 12:00");  
    Date toDate2 = simpleFormat.parse("2018-03-12 12:00");  
    long from2 = fromDate2.getTime();  
    long to2 = toDate2.getTime();  
    int hours = (int) ((to2 - from2) / (1000 * 60 * 60));
    System.out.println("两个时间之间的小时差为:" + hours);

    /*分钟差*/
    Date fromDate3 = simpleFormat.parse("2018-03-01 12:00");  
    Date toDate3 = simpleFormat.parse("2018-03-12 12:00");  
    long from3 = fromDate3.getTime();  
    long to3 = toDate3.getTime();  
    int minutes = (int) ((to3 - from3) / (1000 * 60));  
    System.out.println("两个时间之间的分钟差为:" + minutes);
}

两个时间之间的天数差为:11
两个时间之间的小时差为:264
两个时间之间的分钟差为:15840

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/120981.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【可视化Java GUI程序设计教程】第5章 Swing容器的使用

Swing采用自顶向下的方式构建GUI&#xff0c;即先创建容器&#xff0c;再向容器中添加组件。 “组件”面板中的Swing容器 5.1 面板容器&#xff08;JPanel&#xff09; 5.5.1 使用方法 创建面板有以下两种方法 &#xff08;1&#xff09;创建一个窗体&#xff08;JFrame&…

SAP BASIS SET_PARAMETER_ID_TOO_LONG

ji 原因 DATA:curvbelnid(40) TYPE c,"问题在这里curposnrid(40) TYPE c. "问题在这里curvbelnid sy-uname && VN.curposnrid sy-uname && PR.SET PARAMETER ID curvbelnid FIELD i_vbeln . SET PARAMETER ID curposnrid FIELD i_posnr . 改成 D…

ci-cd的流程

1、项目在gitlab上&#xff0c;从gitlab上使用git插件获取源码&#xff0c;构建成war包&#xff0c;所以使用tomcat作为运行环境 发布 &#xff1a;使用maven插件发布&#xff0c;使用ssh连接。

【Android】画面卡顿优化列表流畅度一

卡顿渲染耗时如图&#xff1a; 卡顿表现有如下几个方面&#xff1a; 网络图片渲染耗时大上下滑动反应慢&#xff0c;甚至画面不动新增一页数据加载渲染时耗时比较大&#xff0c;上下滑动几乎没有反应&#xff0c;画面停止没有交互响应 背景 实际上这套数据加载逻辑已经运行…

支持向量机 (SVM):初学者指南

照片由 Unsplash上的 vackground.com提供 一、说明 SVM&#xff08;支持向量机&#xff09;简单而优雅用于分类和回归的监督机器学习方法。该算法试图找到一个超平面&#xff0c;将数据分为不同的类&#xff0c;并具有尽可能最大的边距。本篇我们将介绍如果最大边距不存在的时候…

Failed to connect to github.com port 443:connection timed out

解决办法&#xff1a; 步骤1&#xff1a; 在这里插入图片描述 步骤2&#xff1a; -步骤3 &#xff1a;在git终端中执行如下命令&#xff1a; git config --global http.proxy http:ip:port git config --global https.proxy http:ip:port git config --global http.proxy htt…

重磅发布 OpenAI 推出用户自定义版 ChatGPT

文章目录 重磅发布 OpenAI 推出用户自定义版 ChatGPT个人简介 重磅发布 OpenAI 推出用户自定义版 ChatGPT OpenAI 首届开发者大会 (OpenAI DevDay) 于北京时间 11 月 7 日凌晨 02:00 开始&#xff0c;大会上宣布了一系列平台更新。其中一个重要更新是用户可以创建他们自己的自定…

智慧农业:农林牧数据可视化监控平台

数字农业是一种现代农业方式&#xff0c;它将信息作为农业生产的重要元素&#xff0c;并利用现代信息技术进行农业生产过程的实时可视化、数字化设计和信息化管理。能将信息技术与农业生产的各个环节有机融合&#xff0c;对于改造传统农业和改变农业生产方式具有重要意义。 图扑…

SysML理论知识

概述 由来 长期以来系统工程师使用的建模语言、工具和技术种类很多&#xff0c;如行为图、IDEF0、N2图等&#xff0c;这些建模方法使用的符号和语义不同&#xff0c;彼此之间不能互操作和重用。系统工程正是由于缺乏一种强壮的标准的建模语言&#xff0c;从而限制系统工程师和…

Makefile 介绍

目录 一、Makefile 的规则 二、一个示例 三、make 是如何工作的 四、makefile 中使用变量 五、让 make 自动推导 六、另类风格的 makefile 七、清空目标文件的规则 make 命令执行时&#xff0c;需要一个 Makefile 文件&#xff0c;以告诉 make 命令需要怎么样的去编译和…

用Python实现朴素贝叶斯垃圾邮箱分类

一、实验目的 通过本实验&#xff0c;旨在使用朴素贝叶斯算法实现垃圾邮箱分类&#xff0c;并能够理解并掌握以下内容&#xff1a; 了解朴素贝叶斯算法的基本原理和应用场景。 学习如何对文本数据进行预处理&#xff0c;包括去除标点符号、转换为小写字母、分词等操作。 理解特…

git 生成公钥

1、通过命令 ssh-keygen 生成 SSH Key&#xff1a; ssh-keygen -t ed25519 -C "Gitee SSH Key" 三次回车 2、查看生成的 SSH 公钥和私钥&#xff1a; ls ~/.ssh/ 3、把公钥设置到git id_ed25519.pub 4、测试 ssh -T gitgitee.com 成功&#xff01;&#xff01;&…

Hive3 on Spark3配置

1、软件环境 1.1 大数据组件环境 大数据组件版本Hive3.1.2Sparkspark-3.0.0-bin-hadoop3.2 1.2 操作系统环境 OS版本MacOSMonterey 12.1Linux - CentOS7.6 2、大数据组件搭建 2.1 Hive环境搭建 1&#xff09;Hive on Spark说明 Hive引擎包括&#xff1a;默认 mr、spark、…

从vue源码中看diff算法

一、v-for必须要指定key&#xff0c;其作用是什么&#xff1f; 在源码中有一个函数为&#xff0c;其中就是通过判断两个vnode的type和key进行判断&#xff0c;如果这两个属性相同&#xff0c;那么这两个vnode就是相同&#xff0c;所以在设置key的时候也不可以设置为object等无…

Fortigate SSL VPN路径遍历漏洞(CVE-2018-13379)

Fortigate SSL VPN路径遍历漏洞&#xff08;CVE-2018-13379&#xff09; 免责声明漏洞描述漏洞影响漏洞危害网络测绘Fofa: body"FortiToken clock drift detected" 漏洞复现1. 访问链接查看是否存在漏洞2. 查看用户名密码3. 登录后台 免责声明 仅用于技术交流,目的是…

Spring Cloud - 手写 Gateway 源码,实现自定义局部 FilterFactory

目录 一、FilterFactory 分析 1.1、前置知识 1.2、分析源码 1.2.1、整体分析 1.2.2、源码分析 1.3、手写源码 1.3.1、基础框架 1.3.2、实现自定义局部过滤器 1.3.3、加参数的自定义局部过滤器器 一、FilterFactory 分析 1.1、前置知识 前面的学习我们知道&#xff0c…

OpenAI开源全新解码器,极大提升Stable Diffusion性能

在11月7日OpenAI的首届开发者大会上&#xff0c;除了推出一系列重磅产品之外&#xff0c;还开源了两款产品&#xff0c;全新解码器Consistency Decoder&#xff08;一致性解码器&#xff09;和最新语音识别模型Whisper v3。 据悉&#xff0c;Consistency Decoder可以替代Stabl…

CROS错误 403 preflight 预检

预检 403 响应 Response for preflight 403 forbidden 如上图&#xff0c;配置了请求接口一直报错&#xff0c;前端看了没有什么问题&#xff0c;不知道哪里报错了&#xff0c;那么可能是后端没有设置跨域。&#xff08;或者是设置了&#xff0c;但是可能需要换一种方式&#…

基于springboot实现致远汽车租赁平台管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现致远汽车租赁平台管理系统演示 摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统…

mysql 全文检索 demo

mysql5.6.7之后开始支持中文全文检索一直没用过&#xff0c;这次试试。 创建表 CREATE TABLE articles (id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,title VARCHAR (200),body TEXT,FULLTEXT (title, body) WITH PARSER ngram ) ENGINE INNODB DEFAULT CHARSETut…