开发的过程中遇到了一些问题,某些问题可能花费了自己不少时间。把这种问题记录下来,第二次遇到的时候不再担心啦。
springboot test问题修改
有的时候要连接不同的库进行测试,有两种方法,一种是自己写个property文件,然后在test上写上@TestPropertySource
或者单独写个application.yml文件,使用@ActiveProfiles
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DanganlcApplication.class)
@ActiveProfiles("customProfile")
//@TestPropertySource(locations = "classpath:aa.properties")
public class ExampleTest {
@Value("${spring.datasource.url}")
private String url;
@Test
public void contextLoads() {
System.out.println(url);
}
}
postgres group by
如果使用group by + count,不巧的是,这个表的查询结果为空,则count值为空,而不是所期望的0,如果想要结果为0,则不应该使用group by.
json
如果想从一个JSONObject复制一个出来,而改动现在这个不影响原来的,可以使用putall(JSONObject)
方法,如果使用new JSONObject(jsonObject)
两个json对象引用同一个对象
零碎知识点
Collectors.toMap()
如果value是null会造成空指针异常,因此要手动去使用collect方法
(刚好,这里也提供了如果in的结果集比较大的时候要分段请求的模块)
Map<String, String> mgMap = Lists.partition(bhList, Const.PAGE_LIMIT_1000).stream()
.map(list -> ssdaDaxxMapper.selectDaxxByAjbhs(list))
.flatMap(Collection::stream)
.collect(HashMap::new, ((map, daxx) -> map
.put(daxx.getBhAj(), daxx.getSfmg())), HashMap::putAll);
- 分段请求分页接口
cycleExecute(param -> ktggHandle(ktksrq, ktjsrq, param, pageSize));
private void cycleExecute(Function<Integer, Integer> supplier) {
StopWatch watcher = new StopWatch();
watcher.start();
int j = 1;
int totalPage;
do {
totalPage = supplier.apply(j);
j++;
} while (j <= totalPage);
watcher.stop();
log.info("执行花费时间【{}】ms", watcher.getTotalTimeMillis());
}
- 分段插入数据
partitionRequest(ajbsList, list -> ajxxMapper.batchDeleteByAjbsList(list));
private <T> void partitionRequest(List<T> dataList, Consumer<? super List<T>> consumer) {
Lists.partition(dataList, 1000).forEach(consumer);
}
- 获取两个localdate之间的相差天数
(int) ajxx.getLarq().until(ajxx.getJarq(), ChronoUnit.DAYS)
等价于(int) ChronoUnit.DAYS.between(ajxx.getGdqx(), LocalDate.now())
- date转localDate
LocalDate date2 = new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
- mybatis使用bean对象作为参数,date数组不想再包一层外部参数
AND d_bzrq BETWEEN #{bzrq[0],typeHandler=org.apache.ibatis.type.LocalDateTypeHandler} AND #{bzrq[1],typeHandler=org.apache.ibatis.type.LocalDateTypeHandler}
- 某个字段等于数组任意一个值
select c_bh as bh, c_ahqc as ahqc from DB_DP.T_AJXX
where c_ahqc = any(ARRAY <foreach collection="list" item="item" open="[" close="]" separator=",">#{item}</foreach>)
- 保留两位小数,0的话显示0
DecimalFormat df = new DecimalFormat("#.##");
df.setRoundingMode(RoundingMode.HALF_UP);
- 模糊搜索 %转义
c_mc LIKE CONCAT('%', REPLACE(REPLACE('%', '%', '\%'), '_', '\_'), '%')
- 运行java -jar的-D和--参数
java [options] -jar [args] options中常见的是-Dkey1=value1 key2=value2 args是--server.port=8080这种,用空格分隔多个参数
- 远程调试
springboot jar开启远程调试:java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9093 -jar test.jar 客户端:jdb -connect com.sun.jdi.SocketAttach:hostname=172.16.15.122,port=9093
- 前端中文参数后台接收到乱码
前端encodeURIComponent()
,后端URLDecoder.decode()
swagger的一些坑
Multipart[]无法正常请求,用postman是可以的
LocalDate作为参数,指定了格式yyyyMMdd
这样在swagger无法正常请求
maven问题记录
httpclient中依赖了httpcore,但打的包就一直没有那个httpcore包,点进httpcore,pom里又不显示具体的依赖。解决办法:删除本地仓库的httpclient包,然后重新install
postgres数据库
给指定数据库用户赋予增删改查权限
grant select,insert,delete,update on all tables in schema dwjk to dev;
grant select,insert,delete,update on all tables in schema dwjk_test to dev;
grant usage on schema dwjk to dev;
grant usage on schema dwjk_test to dev;
-- 特殊的,可以创建表及更改表结构
grant create on schema dwjk to dev;
grant create on schema dwjk_test to dev;
owner: system,增删改查dev 对于新的模式要先 grant usage on schema etl to dev; 对于模式下的所有新建的表都只赋予增删改查权限:
alter default privileges for user system in schema ssda,cl,zhda grant select, insert,update, delete on tables to dev ;
正则表达式
对于每个匹配到的内容,都用函数去替换
比如初始化脚本时,原本模板有1000条sql,你要把这1000个id用全新的id来替换生成新的sql。使用replaceAll(regex, replaceText)
进行替换的话,会发现1000个相同的id。
public static final Pattern pattern = Pattern.compile("values \\('[a-z0-9]*'");
public static void main(String[] args) throws IOException {
StringBuilder codeTypeSb = new StringBuilder();
StringBuffer codeSb = new StringBuffer();
Arrays.stream(FyEnum.values()).map(FyEnum::getFjm).forEach(fy -> {
if (!StringUtils.equals(fy, "J00")) {
String wslb = UUIDHelper.getUuid() ;
String wsjg = UUIDHelper.getUuid() ;
String dzzwlb = UUIDHelper.getUuid();
String whjgdz = UUIDHelper.getUuid();
String swzl = UUIDHelper.getUuid() ;
String ywsbda = UUIDHelper.getUuid();
String sql = StringExtUtils.format(codeType, wslb, wsjg, dzzwlb, whjgdz, swzl, ywsbda).replaceAll("xxx", fy) ;
codeTypeSb.append(sql) ;
// 这里是关键点
Matcher matcher = pattern.matcher(code);
while (matcher.find()) {
matcher.appendReplacement(codeSb, "values \\('" + UUIDHelper.getUuid() + "'");
}
matcher.appendTail(codeSb);
}
});
FileUtils.writeStringToFile(new File("F:\\tmp\\t_zhda_code.sql"), codeSb.toString(), StandardCharsets.UTF_8) ;
FileUtils.writeStringToFile(new File("F:\\tmp\\t_zhda_codeType.sql"), codeTypeSb.toString(), StandardCharsets.UTF_8) ;
}
idea正则替换改变大小写
\U$0将小写转为大写 \L转为小写。实际业务开发,写正则的实际不多,但有时mybatis-generator工具生成的xml,改下相应的属性什么的,还是能用。
正则小tip
- ?在量词(比如+{n,})后面,会变成非贪婪匹配
- 判断某个字符串是否不包含"封面"、"正文"、"目录"中的任何一个?
String pattern = "((?!封面)(?!正文)(?!目录).)*"; "".matches(pattern);
- 找到所有的注释
\/\*[\s\S]*?\*\/|\/\/.*
shell
kill掉某个指定端口的进程
kill -9 $(netstat -anop | grep 8088 | awk '{print $7}' | awk -F '/' '{print $1}')
日志文件太多了,但只想看最近的日志?
ll -ht | head -n 5
参数里面的-h
是human readable
,便于转换成易读的文件大小。
docker在启动容器的情况下,要停止并删除容器再删除对应的镜像,再启动?一行脚本搞定
docker stop $(docker ps -a | grep container_name | awk '{print $1}') | xargs docker rm ; docker rmi $(docker images | grep container_name |grep 2.4.2 | awk '{print $3}') ;docker run -d -p 8092:8080 --name container_name -v /opt/soft/container_name/logs:/opt/TAS/logs -v /opt/soft/tas-license:/opt/tas-license registry.soft.com:5000/cdjd/ci/container_name:v2.4.2;
里面用到了xargs,grep,awk
及基本dokcer命令,shell中运行多条命令(; && ||
)