zoukankan      html  css  js  c++  java
  • 细小知识点总结

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

    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中运行多条命令(; && ||

    当你准备好了,机会来临的时候,你才能抓住
  • 相关阅读:
    css background详解
    Javascript DOM 编程艺术:ENHANCING CONTENT
    Javascript DOM 编程艺术:创建一个简单的gallery
    js prototype
    Javascript DOM 编程艺术:优雅降级
    php solutions:创建画廊
    Javascript DOM 编程艺术: popUp
    Javascript DOM 编程艺术:Creating Markup on the Fly
    转:Node和Element的区别
    javascript语言精粹:函数
  • 原文地址:https://www.cnblogs.com/studentytj/p/15574909.html
Copyright © 2011-2022 走看看