采用java8Stream对集合进行处理

//测试数据
        List<Map<Integer,Object>> list=new ArrayList<>();
        list.add((Map<Integer, Object>) new HashMap<>().put(222,"222"));
        list.add((Map<Integer, Object>) new HashMap<>().put(111,"111"));
        //筛选数据
        List<Map<Integer,Object>> a=list.stream().filter(info -> info.get("key").equals("123")).collect(Collectors.toList());
        //排序 针对String排序系统给出了更好的解决方案,如list中为自定义对象可通过以下方法进行排序
        list=list.stream().sorted(Comparator.comparing(Map::keySet)).collect(Collectors.toList());//升序
        list=list.stream().sorted(Comparator.comparing(Map::keySet).reversed()).collect(Collectors.toList());//降序
        //遍历集合进行操作,{}内可写入大量代码块
        list.forEach((Map<Integer, Object> info)->{info.put(333,"333");});
        //筛选出来的数据条数
        System.out.println(list.stream().filter(info->info.equals("123")).count());
* 当前只列举出了本人近期使用频率较高的几种语法,如无特殊的业务逻辑,以上几种的组合使用已经可以在一定程度上减少大量的开发代码
* 后续如遇到其他使用频率较高的写法会持续更新进来

采用java8新特性实现自定义lambda编程

* lambda语法 Lambda允许把函数作为一个方法的参数传递进方法中
* 适用场景:在一个大块的共用逻辑中间,穿插一块非共用的逻辑,在java8之前也可以采用传入某个字段在适当位置通过switch语句进行区分
* lambda可以应用到很多的业务场景中,本文只简要说明本人所遇到的业务场景
* 代码换环境执行一定要注意jdk的版本是否大于等于1.8
import org.junit.Test;

/**
 * @ClassName LambdaTest
 * @Author justin.Sun
 * @Date 2019/2/18 10:18
 **/
public class LambdaTest {

    //声明接口
    interface  Executor{
        String execute(String arg);
    }

    //调用时需要传入代码块的方法
    private Object runExecute(Executor executor,String arg){
        // TODO: 2019/2/18 公用代码块...

        //传入arg参数并执行代码块
        return executor.execute(arg);
    }

    @Test
    public void test(){
        //传入参数
        String param="test";
        //{}中的代码块相当于实现了上面定义的接口中的方法
        System.out.println(runExecute((String arg)->{return getResult(arg);},param));
    }

    //传入的代码块
    public String getResult(String arg){
        String result=arg;
        // TODO: 2019/2/18 逻辑块...
        return result;
    }
}
* 对于自定义lambda本人也尚处于初步阶段,上文仅用于记录,如有不正之处还请指正

实现一键部署Java服务

说一键部署有些夸张了,本文主要描述是通过linux脚本启动SpringBoot服务的一些细节
#!/bin/bash echo "---shutdown---" app_name=service-$1 dir=/A/B pid=`ps -ef | grep $app_name.jar | grep -v "grep" | awk '{print $2}'` if [ -n "$pid" ];then echo "kill -9的pid:" $pid kill -9 $pid fi echo "---upload---" cd $dir/$app_name rm -rf $dir/$app_name/$app_name.jar rz echo "---startup---" nohup java -Dactive=dev -Deureka.url=http://localhost:0001/eureka/ -jar $dir/$app_name/$app_name.jar >$dir/$app_name/nohup.out & tail -f $dir/$app_name/nohup.out

每行脚本对应的中文翻译:
1:指此脚本使用/bin/bash来解释执行。
2:输出字符串
3:声明变量为service-加上传入的第一个参数
4:声明绝对路径
5:“里面的内容表示参数输入;
管道符“|”用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入;
grep 是查找含有指定文本行的意思;
grep -v 是反向查找的意思,比如 grep -v grep 就是查找不含有 grep 字段的行;
awk是行处理器,awk ‘{print $2}’的意思是以空格作为分隔符,打印第二个字段;
第五行的意思就是:先查看app_name.jar包相关的信息并排除”grep”然后取第二个字段也是就是pid码

6:pid不为空则进入if,否则不进入
7:打印信息
8:杀掉进程
9:if结束符 read more

记一个BUG

在一次发包后,没有修改接口A的任何代码,但是接口A却不能正常返回数据,
INFO级别日志一切正常,后换为DEBUG级别日志,看到一些信息:
Could not find result map java.lang.String
于是全局扫描ResultMap标签,发现的确有一处代码写错了,位置就在A接口的下边,是一段正处于开发阶段的代码
错误的原因就是我在ResultMap中写了java.lang.String,改成ResultType后正常

造成错误的原因:
1.没有通过纯净分支发布服务,因为我所开发的服务一般都是由我发布的,所以一般情况下都是在我本地的分支上发布的,正在开发的时候需要发布的情况是会经常出现的;
2.不了解Mybatis的加载机制,没有很明确的了解到与A接口无关的代码也会影响到A接口的运行 read more

Oracle在不连表的情况下进行集合操作

--前提是两个查询的列的数量和数据类型必须完全相同

--最常用的,拼接结果集(取并集)
--去重拼接
SELECT ID FROM TABLE_A
UNION
SELECT ID FROM TABLE_B;

--不去重拼接
SELECT ID FROM TABLE_A
UNION ALL
SELECT ID FROM TABLE_B;

--取交集
SELECT ID FROM TABLE_A
INTERSECT
SELECT ID FROM TABLE_B;

--去差集
--先查第一条SQL结果集,看是否在第二条中,如果在则移除;
--再查第二条,如果在第一没有出现过,则移除
SELECT ID FROM TABLE_A
MINUS
SELECT ID FROM TABLE_B;

Spring实现数据字典翻译

在开始之前,首先我们要了解一个类:BeanPropertyWriter。
这个类是由SerializerFactory 工厂进行实例化的,其作用是对bean中的每个字段进行jackson操作的封装,其中封装了字段的一些元信息,和对此字段进行jackson序列化的操作。
采用Spring项目进行Web服务开发时,在获取到数据后,Spring会通过BeanPropertyWriter对数据进行jackson封装,将其转换为Json串。
如果我们需要在不影响逻辑的情况下对数据进行字典翻译,重写此类是较好的选择

字典翻译实现步骤:
1.实现获取字典的接口 read more

SpringBoot单元测试

在SpringBoot项目开发过程中,我们引用了大量的注解,这样导致我们在对其进行测试时需要首先对bean进行创建,那么简单的Test注解就无法实现了,这个时候加入其它注解协助实现bean的创建

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {

    @Autowired
    private Service service;

    @Test
    public void contextLoads() {
       service.test();
    }

}
* 在执行过程中可能会出现eurekaAutoServiceRegistration 创建bean异常,网上给出的错误原因是端口被占用,所以建议在进行单元测试的时候关掉对应服务
* 其实在报上述错误的时候我们已经拿到了想要的结果了,所以如果短时间内解决不掉这个错误,可以先不去处理

Oracle中的trunc函数

trunc()在操作日期时,相当于把时间格式化为零时零分零秒
select sysdate,trunc(sysdate) from dual;
通过执行以上脚本可以发现,被trunc处理过的只有日期,没有时间
trunc传参的用法:
select trunc(sysdate-1) from dual t;–昨天
select trunc(sysdate+1) from dual t;–明天

select trunc(sysdate, ‘yy’) from dual;–当年第一天
select trunc(sysdate, ‘year’) from dual;–当年第一天
select trunc(sysdate, ‘yyyy’) from dual;–当年第一天 read more

Spring集成MyBatis设置打印SQL日志

在开发过程中,如果使用MyBatis进行开发,sql是在xml文件进行维护的,我们无法通过DeBug拿到完整的执行sql;
在SpringBoot集成MyBatis的项目中,日志文件一般通过logback-spring.xml进行配置
在这个阶段,如果需要通过配置实现sql打印,则需要在与标签平级的位置添加如下信息:

<logger name="com.baomidou.mybatisplus" level="DEBUG"><!--引用的包路径,我这里引用的是MyBatisPlus-->
<logger name="java.sql.Connection" level="DEBUG">
<logger name="java.sql.Statement" level="DEBUG">
<logger name="java.sql.PreparedStatement" level="DEBUG">