Archive for java

查询语句里有个子查询,有个括号,然后就报错 unexpected token:( 发现这个异常没法查问题,就找了找跟JpaRepository子查询相关的。 有两种解决方法: 一种是@Query(value="select * from user where name like %?1" ,nativeQuery=true) 添加一个nativeQuery的参数 第二种方法是支持的是JPQL,但是我写的那个sql是不支持的。害

Continue

Java真特么的坑,一边是对象Interger,一边是int等数据结构。之前感觉还挺有用的。现在我发现基本项目里都只用对象类型,然后我也就都用这个。 想实现的功能就是Date类型的数据的减两分钟,然后把秒置0的操作。 // 日历类型操作,Date的set方法现在都废弃不用了 Calendar calendar = Calendar.getInstance(); //设置秒为0 calendar.set(Calendar.SECOND, 0); // 减去一分钟 calendar.add(Calendar.MINUTE, -1); // 转成Date类型 Date timestamp = calendar.getTime();

Continue

我要做一个东西,在spring boot的@requestBody里传了一个json数据,其中有个timestamp的字段,需要转换称java Date类型。 搞个半天我还以为成功了,然后突然发现是特么的1970年的年份,就感觉可能截断了。 搜了一下发现是需要毫秒的单位,乘了1000还是不行,后来又找了很多方法,以为只能重新写json字段解析的反序列化函数单独搞。 然后发现一个是回答的必须long型的,然后试了一下就成功了。。。 java.util.Date time=new java.util.Date((long)timeStamp*1000); time=new java.util.Date(timeStamp*1000L); Date time = new Date(TimeUnit.MILLISECONDS.convert(unixTimestamp, TimeUnit.SECONDS)); 直接改了set属性的方法就可用了

Continue

刚加完班,想想这几天学的东西挺多的,虽然都是皮毛,但感觉还挺有成就感的。 公司刚走了俩领导,留下一个坑项目,我也是刚知道。三个人开发了一年啥没开发出来,然后现在到了交付时间了。忙的从四川分公司调了俩个人。说是想三个都裁掉,然后产品说那就没人干活了,然后还把我调过去帮忙写。 项目是spring boot的,我想想我用Python写,一个是以后还得我维护,二一个,权限什么的都不好做,开始我就想只做做边角功能就行了。然后发现分给我功能不属于边角,只能Java写了。 分工还有问题,本来应该写方法的,一个流程下边的,分给俩人做,这种技术上不行,工作效率上也不行。 我这几天看了几本Springboot实战的书,基本一掠而过。知道都是什么,然后看了文档里边的几个例子,就上手写代码了。 项目代码也没有太成熟,用了一个什么renren开源的库,我问过我单独写一个模块,就见了一个Springboot 服务,都用的官方默认的模块。注册服务那里用了公用的pom之后,折腾了我一上午没搞定,我就使用官方文档推荐的starters,分分钟搞定了。 Java静态语言,又是成员变量必须private定义,写的真麻烦,发现写Java果然需要ide,能生成代码,静态语言检查语法错误也方便,复制代码,需要导入也可以自动,感觉写起来还不错。 还有一个比较麻烦的就是,解析json和返回json数据的定义。我网上查找,看了几个例子,基本就懂了。 项目里我不需要关心权限相关的,所以感觉还比较简单。 通过这几天学习,感觉Java经过发展,他相关的工具链其实已经相当的成熟了。感觉给我一年的时间熟练开发项目,我这开发效率不会比Python低,现在开发更多的是找Java或者Spring解决方法,完全不需要知道这个是怎么来的。像我用Python判断IP是否是内网IP,我有很高效的方法,可以直接找到或者复制代码,我Java写的时候,我需要看很多,找到差不多的方案,然后写成公用类。如果之前写过,就直接复制就可以了。 还有就是http返回json的封装,我看了一下他们的项目,都没有统一,比如状态码,错误信息,我就定义了自己的。因为没有看过太多代码,也没有之前写过的公司项目借鉴,我竟然从我反编译的非开源的云平台项目里复制了一个文件,搞成我自己的了,还挺好用的,,, 总得来说写增删改查,搭建一个不需要太大定制化的大型公司项目来说,Springboot的一系列产品可以很轻松的搞定。这个是Python目前的环境做不到的。但是如果Python去封装,会比Java好看好写的很多。也许是因为Python做企业开发用的少,没有人去做这个吧,大公司项目迭代的原因也独立不出来了。 我觉得这几天做的东西很了不起了,后边还得帮他们做。感觉也是因为我之前积累导致了学这些东西还是很快的。现在最欠缺的就是相关源代码原理基本不知道,如果你说微服务架构我会知道,但你说Springboot是怎么封装起来的,这个我还是一头雾水,虽然注解我查了一下大体知道了,但是能把很多库统一标准起来,想想就头大。

Continue

那些开源的都不太靠谱,同事推荐这个druid解析sql。试了一下确实给力。 打包方法: git clone https://github.com/alibaba/druid.git mvn install -Dmaven.javadoc.skip=true -Dmaven.test.skip=true 会安装到.m2目录,copy一个项目用 target/druid-1.0.27-SNAPSHOT-sources.jar 示例代码:

import java.util.*;

import com.alibaba.druid.stat.TableStat;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor;
import py4j.GatewayServer;


public class SQLParser {
    public static List get_tables(String sql){

        MySqlStatementParser parser = new MySqlStatementParser(sql);
        List statementList = parser.parseStatementList();
        SQLStatement statemen = statementList.get(0);

        MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
        statemen.accept(visitor);
        Map result = visitor.getTables();
        System.out.println("Tables : " + result);

        List list = new ArrayList<>();
        for ( TableStat.Name name : result.keySet() ) {
            System.out.println( name );
            list.add(name.getName());
        }
        return list;

    }

    public static void main(String[] args){
        GatewayServer gatewayServer = new GatewayServer(new SQLParser());
        gatewayServer.start();
        System.out.println("Gateway Server Started");

    }
}
打包命令: javac -cp .:./py4j0.10.4.jar:./druid-1.0.27-SNAPSHOT.jar:$CLASSPATH SQLParser.java java -cp .:./py4j0.10.4.jar:./druid-1.0.27-SNAPSHOT.jar:$CLASSPATH SQLParser

Continue

上一篇使用antlr解析的,发现不行,官方提供的语法文件bug太多,多到不能用的程度,还是得用专门的开源库。这次选jsqlparser了。 从github下载一个源码,mvn package 打一个jar包。将jsqlparser-0.9.6.jar拷贝到工作目录。  

import java.util.*;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.util.TablesNamesFinder;


public class ParserTest {
    public static void main(String[] args){
        System.out.println("Hello World!");

        String sql = "select NVL( (SELECT 1 FROM DUAL), 1) AS A from TEST1,test";
        try{
            Select selectStatement = (Select) CCJSqlParserUtil.parse(sql);
            TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();
            List tableList = tablesNamesFinder.getTableList(selectStatement);
            for(String s : tableList) {
                System.out.println(s);
            }
        }catch(Exception e){
            String sql1 = " TEST1";
            //e.printStacktrace();
        }

    }
}
这是调用解析table name的代码。 编译运行 javac -cp ./jsqlparser-0.9.6.jar ParserTest.java java -cp .:./jsqlparser-0.9.6.jar:$CLASSPATH ParserTest 还挺好用。

Continue

去官网下载了一个集成开发环境,直接安装。然后报错“Android Studio was unable to find a valid Jvm” google launchctl setenv STUDIO_JDK /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk 解决之。 网上还有种方法是,finder --应用程序--android studio--显示包内容--contents--info.plist,搜索1.6.将1.6*改成1.6+就ok了。 Fetching android sdk component information,这个不知道具体干嘛的,好几次不成功。 同样的目录,contents/bin/idea.properties,最后加一行disable.android.first.run=true。 打开后的配置,configure--project Defaults--Project Structure--Android SDK location 添上 /Users/a0x55aa/Library/Android/sdk

Continue

记录,说不定以后还能用到。打jar包指定main程序入口

public class Hello{
    public static void main(String[] args){
        System.out.println("hello");
    }
}
java版helloworld。保存成Hello.java。执行 javac Hello.java会生成Hello.class jar cvf hello.jar Hello.class生成hello.jar 现在直接执行java -jar hello.jar会提示“hello.jar中没有主清单属性”要先指定程序入口 解压hello.jar,会看到/META-INF/MANIFEST.MF文件 Manifest-Version: 1.0 Created-By: 1.8.0_25 (Oracle Corporation) 加上两行 Class-Path: . Main-Class: Hello 执行 jar umfv MANIFEST.MF hello.jar 更新一下jar包里边的文件 执行java -jar hello.jar 成功显示hello。

Continue