实用知识(工作中常用)

编程入门 行业动态 更新时间:2024-10-26 01:27:41

实用知识(工作中<a href=https://www.elefans.com/category/jswz/34/1769776.html style=常用)"/>

实用知识(工作中常用)

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

更多推荐

实用知识(工作中常用)

本文发布于:2023-11-15 23:15:13,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1608963.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:常用   知识   工作

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!