查询语句里有个子查询,有个括号,然后就报错 unexpected token:(
发现这个异常没法查问题,就找了找跟JpaRepository子查询相关的。
有两种解决方法:
一种是@Query(value="select * from user where name like %?1" ,nativeQuery=true)
添加一个nativeQuery的参数
第二种方法是支持的是JPQL,但是我写的那个sql是不支持的。害
Read more...
Archive for java
Java日期时间操作相关Calendar,Date
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();
Read more...
java里unix time 转换成Date对象
我要做一个东西,在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属性的方法就可用了
Read more...
最近开发spring boot项目去了
刚加完班,想想这几天学的东西挺多的,虽然都是皮毛,但感觉还挺有成就感的。
公司刚走了俩领导,留下一个坑项目,我也是刚知道。三个人开发了一年啥没开发出来,然后现在到了交付时间了。忙的从四川分公司调了俩个人。说是想三个都裁掉,然后产品说那就没人干活了,然后还把我调过去帮忙写。
项目是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是怎么封装起来的,这个我还是一头雾水,虽然注解我查了一下大体知道了,但是能把很多库统一标准起来,想想就头大。
Read more...
使用druid解析sql
那些开源的都不太靠谱,同事推荐这个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
示例代码:
Read more...
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
mysql语法解析之使用jsqlparser
上一篇使用antlr解析的,发现不行,官方提供的语法文件bug太多,多到不能用的程度,还是得用专门的开源库。这次选jsqlparser了。
从github下载一个源码,mvn package 打一个jar包。将jsqlparser-0.9.6.jar拷贝到工作目录。
Read more...
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
还挺好用。
osx上安装Android开发环境
去官网下载了一个集成开发环境,直接安装。然后报错“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
Read more...
java打jar包记录
记录,说不定以后还能用到。打jar包指定main程序入口
Read more...
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。