实用知识(工作中常用)

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

去掉字符串中的空格(包括空格及tab等空数据)

StringUtils.deleteWhitespace(str);

获取JSON中某个字段值

String access_token = JSONObject.parseObject(generalResponse.getResult()).getJSONObject("data").getString("access_token");
String refresh_token = JSONObject.parseObject(generalResponse.getResult()).getJSONObject("data").getString("refresh_token");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员正正

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值