note1

peng试小笔记

避免对象返回null,报空指针
return orgCode == null ? "" : orgCode;

字符串的非空判断
Spring自带工具类
if(StringUtils.isNoneEmpty(obj))或者if(StringUtils.isNotBlank(obj))或者if(StringUtils.isNoneBlank(obj))
相当于if(obj != null && "".equals(obj))

集合的非空判断
if(!list.isEmpty() && list != null)

数组的非空判断
if(a.length>0 && a !=null)

BigDecimal表示大浮点数类,项目中能用BigDecimal就用BigDecimal,不要用double和float,精确度不高
BigInteger表示大整数类,比integer范围更大,
特别是银行,电商项目,经常会用BigDecimal和BigInteger

日期和字符串类型转换问题,最好在数据库存date或datetime类型,在实体类存String,这样就避免类型转换了
如果实在想转的话,用jdk1.8的LocalDateTime,因为他是线程安全的,代替了线程不安全的SimpleDateFormat

引用:?如果是JDK8的应用,可以使用instant代替Date,Localdatetime代替Calendar,Datetimeformatter代替Simpledateformatter,官方给出的解释:simple beautiful strong immutable thread-safe

下面不得不说枚举类很强大
这个是代码截图
public enum Property {
// 控股股东、实际控制人

public enum MoneyTypeValueEnum {
    MONEY_TYPE_01("01", "1", "CNY", "156","人民币"),
    MONEY_TYPE_01_1("01", "1", "CNY", "156","人民币元"),
    MONEY_TYPE_02("14", "2", "USD", "840","美元"),
    MONEY_TYPE_03("13", "3", "HKD", "344","港元"),
    MONEY_TYPE_04("27", "4", "JPY", "392","日元"),
    MONEY_TYPE_05("11", "5", "EUR", "978","欧元"),
    MONEY_TYPE_06("12", "A", "GBP","826", "英镑"),
    MONEY_TYPE_07("28", "B", "CAD","124", "加拿大元"),
    MONEY_TYPE_08("29", "C", "AUD", "036","澳大利亚元"),
    MONEY_TYPE_09("39", "D", "KRW", "410","韩元");

    private String value;
    private String pbcValue ;
    private String ccssValue ;
    private String kernelValue;
    private String valueText ;


     MoneyTypeValueEnum(String value, String pbcValue, String ccssValue,String kernelValue,
            String valueText) {
        this.value = value;
        this.pbcValue = pbcValue;
        this.ccssValue = ccssValue;
        this.kernelValue = kernelValue;
        this.valueText = valueText;
    }

    /**
     * 获取对应人行编码
     * 
     * @param value
     * @return
     */
    public static String getPbcMoneyTypeValue(String value) {
        for (MoneyTypeValueEnum enumValue : MoneyTypeValueEnum.values()) {
            if (enumValue.getValue().equals(value)) {
                return enumValue.pbcValue;
            }
        }
        return "";
    }

    /**
     * 获取对应ccss编码
     * 
     * @param value
     * @return
     */
    public static String getCcssMoneyTypeValue(String value) {
        if (StringUtils.isBlank(value)) {
            return "";
        }
        for (MoneyTypeValueEnum enumValue : MoneyTypeValueEnum.values()) {
            if (enumValue.getValue().equals(value)) {
                return enumValue.ccssValue;
            }
        }
        return "";
    }

    public static MoneyTypeValueEnum getPbcMoneyType(String value) {

        for (MoneyTypeValueEnum enumValue : MoneyTypeValueEnum.values()) {
            if (enumValue.getValue().equals(value)) {
                return enumValue;
            }
        }
        return null;
    }

    /**
     * 获取货币名称对应本系统编码编码
     * 
     * @param value
     * @return
     */
    public static String getMoneyValue(String valueText) {
        for (MoneyTypeValueEnum enumValue : MoneyTypeValueEnum.values()) {
            if (enumValue.getValueText().equals(valueText)) {
                return enumValue.value;
            }
        }
        return "";
    }

    /**
     * 根据货币名称获取对应人行系统编码编码
     * 
     * @param value
     * @return
     */
    public static String getPbcValueByText(String valueText) {
        if (StringUtils.isBlank(valueText)) {
            return "";
        }
        for (MoneyTypeValueEnum enumValue : MoneyTypeValueEnum.values()) {
            if (valueText.trim().contains(enumValue.getValueText())) {
                return enumValue.pbcValue;
            }
        }
        return "";
    }
View Code

 

请问阁下看懂的么,枚举真的很强大,它跟map很像,它可以将属性以k-v存储,通过key可以取它的value,我们这个项目(桂林银行项目)经常拿他做字典用,因为银行项目嘛,避免不了调三方接口(其他系统的接口),
三方接口和我们对接,对接的属性不能保证全部能一一对应,因此这时候枚举就可以派上用场了,用来将自己系统和三方系统做个映射,将属性一一对应(映射),当然除了枚举做映射还有一种方式那就是redis,
重点来了:重点来了:重点来了:
reids本身就是一个做缓存的工具类,也是存储键值对,巧了,也跟map很像,原理就不说了,当然他跟枚举一样,既然是键值对存储的方式,就可以拿他做字典,它是将数据放入缓存里,当然第一次是没有的,所以如果是第一次
他会将数据放入缓存中,以后不管多少人来拿,他都是先看看缓存有没有,算了,废话不多写了,

 

最后再提一嘴很重要的东东:
耍朋友,
不好意思,说错了,应该是刷数据文件,大家都知道银行项目嘛,数据量都是特别庞大的,我们这个项目,单单是子系统都接近一百,数据量百亿级别,所有读入数据库是非常耗时的,
就不能用以前的方式一行一行的读了,效率极低,万一有一亿的数据怎么办,读几个小时么,这当然不行啊,因此我们要做优化,
如下图,我弄个缓存流,让他初始化一百万的大小(StringBuilder content = new StringBuilder(1000000);),
然后他一直读是肯定不行的,因为有种东西叫内存溢出,如果你一直让他读,数据量特大的时候就会发生内存溢出错误(moneyException哎呀,单词好像拼错了,不管了),
所以你要指定读到什么地方,释放一下内存,以下是我的做法
if(i==600000*x){
FileUtil.export4TXT(path, name, content.toString());
content.delete(0, content.length());
System.out.println("StringBuilder 清空"+i);
x++;
}
i++;
当他每读60万条数据时,释放一下内存,这样不管多少级别的数据,妈妈再也不担心我内存溢出啦
当然我是这样做的,如果你有更好的方法可以告诉我,我也想了解了解

BufferedReader bf = null;
List<AddCurrentAcctRequestBody> list = new ArrayList<>();
String localPath ="C:\\Users\\hxqd_040\\Desktop\\temp\\2.txt";
//String localPath ="Z:\\账户管理入场安装包\\NCS_NEWOLDCUSTNO.dat";
//String localPath ="C:\\Users\\hxqd_040\\Desktop\\temp\\1.txt";
String path ="P:\\生产的sql文件";
String name = "data.sql";
File file = new File(localPath);
Map<String,String> maps = new HashMap<String, String>();
/*maps.put("BP_TASK_SEQ_TB", "CUSTNO");
maps.put("BUSINESSINFO_PD_WARNING", "CUSTNO");
maps.put("CREDENTIALS_PD_WARNING", "CUSTNO");
maps.put("PD_WARNING_MAINTAIN", "CUSTNO");
maps.put("Sheet1", "BRCHNAM");
maps.put("Sheet2", "CUSTNO");
maps.put("T_AC_IACOC", "CUSTNO");
maps.put("T_AC_IACOD", "CUSTNO");
maps.put("T_ACCOUNT_INFO", "CLIENT_NO");
maps.put("T_ACCOUNT_INFO_OPEN", "CUSTNO");
maps.put("T_ADD_INFO_OPEN", "CUSTNO");
maps.put("T_AGREEMENT_INFO", "CUSTNO");
maps.put("T_CLIENT_INFO", "CLIENT_NO");
maps.put("T_CUST_INFO_OPEN", "CUSTNO");
maps.put("T_RG_AGNTTRAN", "CACCNO");
maps.put("T_RG_PWDSIGN", "CUSTNO");
maps.put("T_RG_SLEPAC", "CUSTNO");
maps.put("T_RG_TELSIGN", "CUSTNO");
maps.put("T_VO_VOUCARD", "CUSTNO");*/
maps.put("T_ACCOUNT_INFO_OPEN", "CUSTNO");
maps.put("T_CUST_INFO_OPEN", "CUSTNO");
long time1 = System.currentTimeMillis(); 
for (String key : maps.keySet()) {
StringBuilder content = new StringBuilder(1000000);
try {
bf = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
String line = null;
name =key+".sql";
//name ="text.sql";
int i =0;
int x =1;
while ((line = bf.readLine()) != null) {
// 开户和销户的数据文件解析
line = line.replace("$$", ",");
String[] fieldValues = line.split(",", -1);
content.append("UPDATE "+key+" set "+maps.get(key)+"= \'"+fieldValues[1]+"\' where "+maps.get(key)+" =\'"+fieldValues[0]+"\'; \r\n");
//content.append("INSERT INTO \"text\" VALUES(\'"+fieldValues[0]+"\',\'"+fieldValues[1]+"\');\r\n");
if(i==600000*x){
FileUtil.export4TXT(path, name, content.toString());
content.delete(0, content.length());
System.out.println("StringBuilder 清空"+i);
x++;
}
i++;
}
FileUtil.export4TXT(path, name, content.toString());

/*PrintWriter pw = ServletActionContext.getResponse().getWriter();
pw.write("success");*/
System.out.println("执行结束"+key);
} catch ( IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

System.out.println("已全部生成 耗时:" + (System.currentTimeMillis() - time1));
View Code

 

posted @ 2019-10-06 17:11  小澳  阅读(400)  评论(0编辑  收藏  举报