public class SqlFormat{
public static void main(String[] args){
String sql="";
sqlFormat(sql);
}
public static Map<String, String> map = new HashMap<String, String>();//需要换行的字段
public static Map<String, String> bracket= new HashMap<String, String>();//括号前关键字
static{
map.put("select", "select");
map.put("from", "from");
map.put("group by", "group by");
map.put("where", "where");
map.put("order by", "order by"); bracket.put("not", "not"); map.put("(", "(");
map.put(")", ")"); } public static String SqlFormat(String sql){
sql = sql.trim().replaceAll(",", ", ").replaceAll(" +", " ").replaceAll("\\s+", " ").replace(" ", " |").replace("(", "|(|").replace(")", "|)|").replace("| |", " |").replace("||", "|");
sql = sql.toLowerCase();
int sj=0;// String[] sqlArray = sql.split("\\|");
int length = sqlArray.length;
Stack stack = new Stack();
Stack stackTemp = new Stack(); for(int i=0;i<length; i++){
if("(".equals(sqlArray[i]).trim())){
if(map.get(sqlArray[i+1].trim())!=null){//后有关键字
stack.push("(");
printlnSql(sqlArray[i], sj);
}else if(bracket.get(sqlArray[i-1].trim())!=null){//前有关键字
stack.push("(");
printlnSql(sqlArray[i], sj);
}else{
stackTemp.push("(");
System.out.println(sqlArray[i]);
}
}else if(")".equals(sqlArray[i].trim())){
if(stackTemp.size()>0){
stackTemp.pop();
System.out.println(sqlArray[i]);
}else{
stackTemp.pop();
sj=stack.size();
printlnSql(sqlArray[i], sj);
}
}else if("".equals(sqlArray[i].trim())){ }else if("(".equals(sqlArray[i].trim()) && map.get(sqlArray[i-1].trim())!=null){ }else if(map.get(sqlArray[i].trim())!=null){
printlnSql(sqlArray[i], sj);
}else{
System.out.print(sqlArray[i]);
}
}
return sql;
} pubulic static void printlnSql(String sqlSub, int i){
if(i>0){
System.out.println("\n");
for(int j=0; j<i; j++){
System.out.println("\t\t");
}
}else{
System.out.println('\n'+sqlSub);
}
}
}

java 对sql格式化的更多相关文章

  1. java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明)

    转载地址:http://www.devba.com/index.php/archives/4581.html java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明); ...

  2. (转)java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明)

    java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明);部分资料参考网络资源 1. java向MySQL插入当前时间的四种方式 第一种:将java.util.Date ...

  3. atitit.java解析sql语言解析器解释器的实现

    atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sq ...

  4. java连接sql server2000/2005

    接触Java或者JSP,难免会使用到数据库SQL Server 2000/2005(我使用2005标准版[9.0.3054]测试),经过自己的搜索和研究,使用JDBC连接SQL Server成功,特此 ...

  5. 使用java对sql server进行增删改查

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...

  6. java.text.MessageFormat格式化字符串时的小技巧

    java.text.MessageFormat格式化字符串时的小技巧 public static void main(String[] args) throws InterruptedExceptio ...

  7. jTDS Java连接SQL Server 2000数据库

    Java连接SQL Server 2000数据库时,有两种方法: (1)通过Microsoft的JDBC驱动连接.此JDBC驱动共有三个文件,分别 是mssqlserver.jar.msutil.ja ...

  8. Java 获取SQL查询语句结果

    step1:构造连接Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnec ...

  9. Java 链接SQL Server 数据库

    1 //Java 连接 SQL Server数据库 2 public static final String DRIVERNAME="com.microsoft.sqlserver.jdbc ...

随机推荐

  1. Installing Node.js via package manager

    https://nodejs.org/en/download/package-manager/

  2. hexSHA1散列加密解密(不可逆)

    1.maven引入codec和commons依赖: <dependency> <groupId>commons-codec</groupId> <artifa ...

  3. mysql16---读写分离

    读写分离(负载平衡)(读写分离肯定要用到主从复制) 如果数据库压力很大,一台机器支撑不了,那么可以用mysql复制实现多台机器同步,将数据库的压力分散. 分表不能解决并发量大的问题. Sql语句发过来 ...

  4. 并不对劲的manacher算法

    有些时候,后缀自动机并不能解决某些问题,或者解决很麻烦.这时就有各种神奇的字符串算法了. manacher算法用来O(|S|)地求出字符串S的最长的回文子串的长度.这是怎么做到的呢? 并不对劲的暴力选 ...

  5. AutoIT: 如何设置GUICtrlCreateCombo选项为不可修改状态

    GUICtrlCreateCombo中选中的选项是可修改的,也可设置为不可修改状态. #include<ComboConstants.au3> GUICtrlCreateLabel(, , ...

  6. get与post提交方式区别?

    1.get <!--表单数据作为HTTP GET请求发送给action 规定的URL,并将数据附加在URL之后,由客户端直接发送给服务器.表单数据不能太长,也不能含有非ASCII码的字符--&g ...

  7. Java多线程系列九——Atomic类

    参考资料:https://fangjian0423.github.io/2016/03/16/java-AtomicInteger-analysis/http://www.cnblogs.com/54 ...

  8. HDU4418:Time travel(高斯消元+期望)

    传送门 题意 一个人在数轴上来回走,以pi的概率走i步i∈[1, m],给定n(数轴长度),m,e(终点),s(起点),d(方向),求从s走到e经过的点数期望 分析 设E[x]是人从x走到e经过点数的 ...

  9. API+RESTful

    什么是API? API 划分了服务供需方的边界,是协调不同端开发人员的协议/框架.API两端,程序可以用不同的语言.由不同的团队开发,追求不同的目标,有不同的发布节奏.只要在 API 方面达成一致,两 ...

  10. 《windows核心编程系列》一谈谈windows中的错误处理机制

    错误处理 我们写的函数会用返回值表示程序执行的正确与否,使用void,就意味着程序一定不会出错.Bool类型标识true时为真,false时为假.其他类型根据需要可以定义成不同意义. Windows除 ...