看谷仓项目笔记
1.List<类> idcards= user.stream().map(User::getIdcard).collect(Collectors.toList())
效果等于for循环,性能更好,从某集合里循环得到id。
List<Integer> collect1 = num.stream().map(n -> n * 2).collect(Collectors.toList());
效果等于for循环,把某集合里每个内容*2。
List<String> collect =list.stream().map(String::toUpperCase).collect(Collectors.toList());
效果等于for循环,把某集合里每个内容变成大写。
2.(busiBase1 != null && busiBase1.getAgreementStatus() != null) ? busiBase1.getAgreementStatus() :0
如果你不希望得到null值,用三元表达式设置默认值。
3.LocalDateTime.now()
得到当前日期时间,如 2007-12-03T10:15:30
。
DateTimeFormatter.ofPattern("yyyyMMddHHmmss")
得到日期格式转换器。
4.new Random().nextInt(int n)
该方法的作用是生成一个随机的int值,该值介于[0,n)的区间,也就是0到n之间的随机int值,包含0而不包含n。
5.DoubleUtils
提供加减乘除的方法,是自己用到BigDecimal(java.math包)写的。
6.
@PathVariable Long isId
用路径传递参数。
@RequestBody Vo vo
用json传递参数,多用于类的传递。
@RequestParam(value = "locationCode", required = false, defaultValue = "0") Integer locationCode
在url传递参数,多用于传递单个字段。
7.实战心得:
建表:建表时考虑一对一(建字段在表中),一对多(新建表,加字段),多对多(建中间表,字段为两表主键)的情况。
写接口:每个接口都是可以单独被调用的,考虑问题时要考虑被多次调用的情况。
写sql:写查询条件时要考虑到是否是必填字段,如果不是,要进行判断。
要在xml配置文件里加上
<if test="类字段名 != null">
AND 表的字段名 = #{类字段名}
</if>
8.ExcelCreateUtil包。
用到反射。A.isAnnotationPresent(B.class);意思就是:注释B是否在此A上。如果在则返回true;不在则返回false。
9.
<if test="realName != null and realName != '' " >
AND bb.real_name like CONCAT("%", #{realName} ,"%")
</if>
数据库查询字符串拼接。
<if test="expectedSalary != null and expectedSalary != '' " >
<![CDATA[
AND br.expected_salary_floor <= expectedSalary
and br.expected_salary_ceil >= expectedSalary
]]>
</if>
使用这个之后,里面的<,>,=就都不会转义。
create_time < DATE_ADD(#{endTime},INTERVAL 1 DAY)
日期增加一天。
<if test="corpIdList != null and corpIdList.size() > 1" >
and first_corp_id IN
<foreach collection="corpIdList" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
collection:指定输入对象中集合属性
item:集合中元素迭代时的别名,该参数为必选。
index:在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选
open:foreach代码的开始符号,一般是(和close=")"合用。常用在in(),values()时。该参数可选
separator:元素之间的分隔符,例如在in()的时候,separator=","会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。
close: foreach代码的关闭符号,一般是)和open="("合用。常用在in(),values()时。该参数可选。
10.
@JsonIgnore
在给页面传值的类(dto)的字段上用,那个字段就不会被传。
@ApiModelProperty(hidden = true)
swagger包下,用在字段上,其作用是在接口调用,数据返回显示时,隐藏这个字段。
Vo vo = JSON.parseObject(string, Vo.class);
把页面上传来的string赋值到Vo类里。
11.
CASE
WHEN 字段名 = 某值 THEN
值1 ELSE 值2
end 字段名
查询显示赋值。
12.
List<Dto> dtos = new ArrayList<>();
list.forEach(m->{
Dto dto = new Dto();
BeanUtils.copyProperties(m,dto);
dtos.add(dto);
})
就是for循环
13.
DateUtil.dateSubtract(new Date(), 要减的时间)
返回一个布尔值,>0为true。
14.
Optional.ofNullable(user.getDept()).map(DeptSmallDTO::getDeptName).orElse(null)
ofNullable,把指定的值封装为Optional对象,如果指定的值为null,则创建一个空的Optional对象。
map,如果创建的Optional中的值存在,对该值执行提供的Function函数调用。
orElse,如果创建的Optional中有值存在,则返回此值,否则返回一个默认值。
//map方法执行传入的lambda表达式参数对Optional实例的值进行修改,修改后的返回值仍然是一个Optional对象
Optional<String> stringOptional = Optional.of("zhangsan");
System.out.println(stringOptional.map(e -> e.toUpperCase()).orElse("失败"));
stringOptional = Optional.empty();
System.out.println(stringOptional.map(e -> e.toUpperCase()).orElse("失败"));
15.
(string).trim()去空格
16.批量添加
下拉框自动选择。(数据回显)
然后数据回显
boolean
result = obj
instanceof
Class
其中 obj 为一个对象,Class 表示一个类或者一个接口,当 obj 为 Class 的对象,或者是其直接或间接子类,或者是其接口的实现类,结果result 都返回 true,否则返回false。
注意:编译器会检查 obj 是否能转换成右边的class类型,如果不能转换则直接报错,如果不能确定类型,则通过编译,具体看运行时定。
隐藏身份证:
String zx="360702199610290011";
String s1 = zx.substring(0, 1);
String mid = "****************";
String s2 = zx.substring(zx.length() - 1);
String zx2 = s1 + mid + s2;
System.out.println(zx2);
```java
//手动提交事务
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);// 事物隔离级别,开启新事务
TransactionStatus status = txManager.getTransaction(def); // 获得事务状态
try {
//更新邀请数据
if(missionInvitations.size()>0){
missionInvitationMapper.updateMissionInvitations(missionInvitations,"由管理员id:"+userId+"接受");
}
//创建订单数据
if(orderBases.size()>0){
orderBaseMapper.insertList(orderBases);
}
Example example = new Example(OrderBase.class);
example.createCriteria().andEqualTo("missionId",missionBase.getId()).andIn("busiId",busiIds);
List<OrderBase> newOrderBases = orderBaseMapper.selectByExample(example);
for (OrderBase orderBase:newOrderBases) {
queue.add(orderBase.getId());
}
txManager.commit(status);
}catch (Exception e){
log.error("exception:",e);
txManager.rollback(status);
}
//使用多线程生成转包协议
if(busiIds.size()>0){
log.info("开始执行多线程,有"+queue.size()+"条数据待生成");
generateSubcontractingAgreementThread.setQueue(queue);
executorService.execute(generateSubcontractingAgreementThread);
}
```
```java
@Override
public List<BankCardVo> bankList(Long userId) {
List<BankCardVo> bankCardVoList = busiBankCardMapper.bankList(userId);
for (BankCardVo bankCardVo : bankCardVoList) {
String cardNo = accountNumber(bankCardVo.getAccountNumber());
String regex = "(.{4})";
cardNo = cardNo.replaceAll(regex, "$1\t\t");
bankCardVo.setAccountNumber(cardNo);
}
return bankCardVoList;
}
private String accountNumber(String accountNumber) {
if (accountNumber == null || accountNumber.length() < 5) {
return accountNumber;
}
int len = accountNumber.length();
int last = len % 4 == 0 ? 4 : len % 4;
String lastNumber = accountNumber.substring(len - last);
String per = "";
for (int i = 0; i < len - last; i++) {
per = per + "*";
}
return per + lastNumber;
}
```
------------------------------------------------------
08/12
gucangApiController
得到请求者真实的ip地址。
反射
Method Class.getMethod(String name, Class<?>... parameterTypes)的作用是获得对象所声明的公开方法
该方法的第一个参数name是要获得方法的名字,第二个参数parameterTypes是按声明顺序标识该方法形参类型。
person.getClass().getMethod("Speak", null);
//获得person对象的Speak方法,因为Speak方法没有形参,所以parameterTypes为null
person.getClass().getMethod("run", String.class);
//获得person对象的run方法,因为run方法的形参是String类型的,所以parameterTypes为String.class
007
入参,string 内容,string 企业编号
把内容转换为一个list里面存了orderbaseapidto对象。
循环他们,判断出使用那种方式出款。1,记账本。2,支付宝传统支付
sql
AND date_format(create_time,'%Y%c') = date_format(now(),'%Y%c')
Java8的流处理
List<ParkInfoDto> dtoList = null;
List<ParkBase> parkBases = parkBaseMapper.selectBatchIds(parkList);
if (CollUtil.isNotEmpty(parkBases)) {
dtoList = parkBases.stream().map(m -> {
ParkInfoDto parkInfoDto = new ParkInfoDto();
BeanUtils.copyProperties(m, parkInfoDto);
return parkInfoDto;
}).collect(Collectors.toList());
}
嵌套循环
Set<String> menus = new HashSet<>();
Set<String> points = new HashSet<>();
Set<String> apis = new HashSet<>();
QueryWrapper<UserRole> roleQueryWrapper = new QueryWrapper<>();
roleQueryWrapper.eq("user_id",userId);
userRoleMapper.selectList(roleQueryWrapper).stream().map(UserRole::getRoleId).forEach(e -> {
roleService.findPermissionIds(e).stream().forEach(p -> {
if(p.getType() == 1){
menus.add(p.getCode());
}else if(p.getType() == 2){
points.add(p.getCode());
}else if(p.getType() == 3){
apis.add(p.getCode());
}
});
});
postman调用需要参数时,可以去正式环境里找入参,进行调用。
支付的回调:
String jsonBody = JSON.toJSONString(noticeSettlementVo); log.info("调用外部接口参数为:"+jsonBody); String body = "{\"flag\":\"false\"}"; try { body = HttpRequest.post(orderGrantNotifyAddress).body(jsonBody).execute().body(); }catch (Exception e){ log.info(e.getMessage()); e.printStackTrace(); } log.info("调用外部接口返回值为:"+body);