Hibernate之FormatStyle SQL格式化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010323023/article/details/52692232

最近遇到一个需求需要格式化Sql,这可难倒我了。我的解决思路如下:
1、自己写代码解析SQL,这个工作量有点大。
2、寻找能提供解决方案的工具。

如上所述,第一种工作量比较大,所以选择了第二种。在网上找了很多格式化SQL的工具。后面一对比发现都是源自于Hibernate。后面干脆自己来研究一下Hibernate。先来看看美化SQL的代码:

import org.hibernate.engine.jdbc.internal.FormatStyle;

/**
 * @param
 * @author wu.lin
 * @description
 * @create 2016年09月13日 19:53
 * @throws
 */
public class Test {

    public static void main(String[] args) {

        String sql = "SELECT" +
                "        D.VERSION_ID AS D_VERSION_ID," +
                "        D.CREATE_DATE AS D_CREATE_DATE," +
                "        D.MODEL_TYPE AS D_MODEL_TYPE," +
                "        D.MODEL_CODE AS D_MODEL_CODE," +
                "        D.CONN_CODE AS D_CONN_CODE," +
                "        D.DOMAIN_CODE AS D_DOMAIN_CODE," +
                "        D.REMARK AS D_REMARK,\n" +
                "        D.REMARK_LOCAL AS D_REMARK_LOCAL,"+
                "        D.MODEL_FREQUENCY AS D_MODEL_FREQUENCY," +
                "        L.DOMAIN_CODE AS L_DOMAIN_CODE," +
                "        L.MODEL_CODE AS L_MODEL_CODE," +
                "        L.MODEL_TYPE AS L_MODEL_TYPE," +
                "        L.CONN_CODE AS L_CONN_CODE," +
                "        L.REMARK AS L_REMARK," +
                "        L.REMARK_LOCAL AS L_REMARK_LOCAL," +
                "        L.VERSION_ID AS L_VERSION_ID," +
                "        L.CREATE_DATE AS L_CREATE_DATE " +
                "    FROM" +
                "        TMD_MODEL_OBJECTS D " +
                "    JOIN" +
                "        TMD_MODEL_OBJECTS_TEST L";

        String sqlBeautify =   FormatStyle.BASIC.getFormatter().format(sql);
        System.out.println(sqlBeautify);
    }
}

代码很简单,来我们先看看效果:
这里写图片描述

嗯大致就是我想要的结果,忘了一件事,就是关于Hibernate的版本,
这里写图片描述

我用3和4的版本都试了一下其实效果都一样只是写法不太一样,看一下FormatStyle的代码就明白了我为什么这么写:

package org.hibernate.engine.jdbc.internal;

import org.hibernate.engine.jdbc.internal.BasicFormatterImpl;
import org.hibernate.engine.jdbc.internal.DDLFormatterImpl;
import org.hibernate.engine.jdbc.internal.Formatter;

public enum FormatStyle {
    BASIC("basic", new BasicFormatterImpl()),
    DDL("ddl", new DDLFormatterImpl()),
    NONE("none", new FormatStyle.NoFormatImpl());

    private final String name;
    private final Formatter formatter;

    private FormatStyle(String name, Formatter formatter) {
        this.name = name;
        this.formatter = formatter;
    }

    public String getName() {
        return this.name;
    }

    public Formatter getFormatter() {
        return this.formatter;
    }

    private static class NoFormatImpl implements Formatter {
        private NoFormatImpl() {
        }

        public String format(String source) {
            return source;
        }
    }
}

嗯这里用了一个枚举类。通过静态常量来创建不同的实现类。至此我要写的就这么多,有兴趣的可以看看这几个类的实现,也是一个非常有趣的过程。

在此写博客只为记录自己成长的点点滴滴,欢迎大家来围观,不喜勿喷。谢谢!

猜你喜欢

转载自blog.csdn.net/u010323023/article/details/52692232
今日推荐