细小知识点总结

开发的过程中遇到了一些问题,某些问题可能花费了自己不少时间。把这种问题记录下来,第二次遇到的时候不再担心啦。

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

教程bash脚本教程 语法校验:shell语法校验

kill掉某个指定端口的进程

kill -9 $(netstat -anop | grep 8088 | awk '{print $7}' | awk -F '/' '{print $1}')

日志文件太多了,但只想看最近的日志?

ll -ht | head -n 5 参数里面的-hhuman 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中运行多条命令(; && ||

posted @ 2021-11-18 22:37  Code&Fight  阅读(38)  评论(0编辑  收藏  举报