细小知识点总结
开发的过程中遇到了一些问题,某些问题可能花费了自己不少时间。把这种问题记录下来,第二次遇到的时候不再担心啦。
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中运行多条命令(; && || )

                
            
        
浙公网安备 33010602011771号