2019-7-9
1.System.exit(参数) 不管参数为什么,都会退出主线程
0:表示正常退出
非零参数:表示非正常退出
当放在线程中时,如果没有睡眠,主线程会继续执行下去,不会退出主线程。需要等线程执行完成之后才会执行System.exit,退出程序,也就是需要等线程返回才会继续下去。
当前方法可以用在程序启动时,加载某些参数不符合规范时,需要停止执行时,可用到,
但是一但使用,他会直接关停整个服务。
例:
2.Json字符串和Json对象的相互转换工具
用在http请求时,转换参数,jsonString=>Objiet,Objiet=>jsonString互转。
主要使用到:objectMapper,对其简单封装了一下
Include枚举:
ALWAYS 不过滤为空的 属性
NON_NULL 过滤为空的对象 (T)属性
NON_DEFAULT 过滤拥有默认值的 属性
NON_EMPTY 过滤String ,list ,map这三种为空时的 属性
<!-- json注解 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.3</version>
</dependency>
切记:当使用内部类时,新建的内部类必需为静态的(static),
不然会出现没有权限访问当前内部类。
2019-8-1
1.数据库的三范式
第一范式:强调的是列的原子性,也就是当前列不能再分割为其它几列
比如,电话有公司电话和家庭电话,这个时候我们就要对这个电话再分开表明意思,不能单独使用叫电话这样的字眼。
第二范式:表必须要有主键,也就是对数据能做唯一性的判别,二是没有包含在朱建忠的列必须完全依赖于主键,而不能只依赖于主键的一部分。
比如,有订单这样的一张表,每个用户下单都会选择商品,然后生成订单,可能一笔订单包含多个商家并且多个商品,这个时候我们需要对每个商品区别开来,不能把关于商品的所有信息全部涌入到订单表中,这时候就需要对订单做二范式的处理,需要生成子订单,要用到联合主键。
第三范式:首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。
考虑一个订单表【Order】(OrderID,OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity)主键是(OrderID)。其中 OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity 等非主键列都完全依赖于主键(OrderID),所以符合 2NF。不过问题是 CustomerName,CustomerAddr,CustomerCity 直接依赖的是CustomerID(非主键列),而不是直接依赖于主键,它是通过传递才依赖于主键,所以不符合 3NF。通过拆分【Order】为【Order】(OrderID,OrderDate,CustomerID)和【Customer】(CustomerID,CustomerName,CustomerAddr,CustomerCity)从而达到 3NF
2019-8-17
vue学习笔记
1.需要化境和工具:
环境:安装nodejs
工具: Visual Studio Code
2.创建地一个vue项目
2019-8-23
1.使用ApplicationContextAware实现bean的初始化
当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean。换句话说,就是这个类可以直接获取spring配置文件中,所有有引用到的bean对象。
可以使用@Component来进行注册,也可以再web.xml中申明bean,如下:
<bean id="appUtil" class="com.htsoft.core.util.SpringUtil"/>
加载Spring配置文件时,如果Spring配置文件中所定义的Bean类实现了ApplicationContextAware 接口,那么在加载Spring配置文件时,会自动调用ApplicationContextAware 接口中的
public void setApplicationContext(ApplicationContext context) throws BeansException;
获得ApplicationContext对象,ApplicationContext对象是由spring注入的。前提必须在Spring配置文件中指定该类。
使用当前方法,必需要在spring加载成功后方可。
代码案例:
2.线程池-ExecutorService:
使用完之后,使用ApplicationListener监听策略,执行线程池的销毁,
案例如下:
java.util.co
ncurrent; ExecutorService;
3.如果想使用多态,则可以使用创建接口,实现多集成。不一定全是实现
4.java8配合Stream和lambda使用的表达式
-> :断言表达式
如:list.stream().filter(x -> x >= 30)
() ->:function表达式
如:list.map((x) -> x + 10)
关键名字解释:
list.stream():获取list的stream的流
stream()优点:1.无存储。stream不是一种数据结构,它只是某种数据源的一个视图,数
据源可以是一个数组,Java容器或I/O channel等。2.为函数式编程而生。对stream的任
何修改都不会修改背后的数据源,比如对stream执行过滤操作并不会删除被过滤的元
素,而是会产生一个不包含被过滤元素的新stream。3.惰式执行。stream上的操作并不
会立即执行,只有等到用户真正需要结果的时候才会执行。4.可消费性。stream只能
被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新
生成。
filter:筛选
map:做一个function映射
sort:排序,里面是compartor
collect:
lanbda原理:
比如List里面存个个人的年龄,现在筛选出年龄大于等于18的人。
此时我们就可以用 list.stream().filter((x) -> x >= 18) 这就是一个典型的lambda表达式
(x) -> x >= 18 传给 Predicate 函数式接口。原理其实是:JVM帮我们动态生成了一个内部
类,然后这个内部类实现了 Predicate 这个函数式 接口。重写了里面的test方法。生成的类
似如下:
static final class Main$$Lambda$1 implements Predicate<Integer> {
private Main$$Lambda$1() {}
@Override
public boolean test(Integer x) {return x >= 18;}
}
分组:
//根据某一字段进行分组,可以附加filter等操作
Map<String,List<T>> groupBy=tList.stream().collect(Collectors.groupingBy(T::getName));
筛选:
2019-8-28
1.递归处理业务
如:1.树状结构获取
2019-09-04
1.ETL学习之kettle工具的使用。
ETL简单介绍:分别是“Extract”、“ Transform” 、“Load”三个单词的首字母缩写也就是“抽取”、“转换”、“装载”,但我们日常往往简称其为数据抽取
分为转换 和 作业 ,作业可自动执行,转换需要手动点击,作业可以包含多个转换,转换之间有依赖关系需要串行,没有依赖关系可以并行。
在linux上启动作业(.job)使用的脚本是kitchen.sh,启动转换(.ktr)使用的是pan.sh
2.学习到使用js脚本做验证并且生成唯一主键脚本
(固定编码+时间戳+随机数),例:
//需要二十位的纯数字字符,简单沉睡10毫秒,可达到效果
function getUserType(s){
return s
}
var user_type = getUserType(APPLY_TYPE);
var cert_type = "";
if(CERTIFICATE_TYPE=="idcard"){
cert_type = "10";
}else{
cert_type = CERTIFICATE_TYPE;
}
//生成随机数
function rnd(n, m){
var random = Math.floor(Math.random()*(m-n+1)+n);
return random;
}
//使用循环阻止同时生成一个id(并发可支持毫秒级)
function sleep(n) {
var start = new Date().getTime();
while(true) if(new Date().getTime()-start > n) break;
return new Date().getTime();
}
var t = "s"+"4"+sleep(rnd(0,9))+rnd(10000,99999)
//1495302061441
var user_id = t.replace("s","");
2019-09-17
1.git命令回温
git clone (git地址) 克隆远程代码到本地
git add . 添加所有数据到本地版本库
git commit “初始化” 提交数据到本地版本库
git branch 查询本地分支
git branch -a 查询远程分支
git rm -r 文件夹 删除文件或者文件夹允许递归删除 (如果需要同步到远程需要执行 commit 然后 执行
push)
git checkout -b 本地分支名字 origin/远程分支名字 切换分支
2.ridis分布式锁的使用
锁实现
锁对象
主要是通过redis缓存,获取是否存在ridis key值,然后通过过期释放时间来确定是否已经释放锁资源。最好需要设置一个默认的国企时间,以防出现死锁。
3.mysqlexcle字段处理
SELECT
COLUMN_NAME 列名,
COLUMN_COMMENT 名称 ,
COLUMN_TYPE 数据类型,
DATA_TYPE 字段类型,
CHARACTER_MAXIMUM_LENGTH 长度,
IS_NULLABLE 是否必填,
COLUMN_DEFAULT 描述
FROM
INFORMATION_SCHEMA.COLUMNS
where