当没有使用orm框架,只是使用了jdbc的轻量级封装时,手写string sql会比较平凡,大家知道sql拼接时,如果有条件分支那么字符串拼接很“难看”,为了解决工作中遇到的这个问题我写了一个简单的基于java的sql生成器,因为简单,所以可以轻松根据自己的需要轻松更改。
string-sql生成器是一个简单实用的基于string的sql生成器,支持通过创建对象的方式完成sql拼接,有助于不实用ORM框架的用户灵活搭配sql, 所有的表名,字段,占位符均需要用户输入。
通过SqlBuilderFactory可以创建两种builder,一种为遵循sql语法,另一种则是用户随意构建。用法如下:
(项目地址https://github.com/Warmriver/SqlGeneratorBasedOnString喜欢的话给个star吧 :)
// 不严格的builder,可以使用任意字段
NonStrictQueryBuilder builder = SqlBuilderFactory.nonStrictSqlBuilder();
builder = builder.select("t1.id").from("t1").leftOuterJoin("t2").on("t1.id == t2.id");
if(true){
builder = builder.where("t1.status=2");
}
builder = builder.and("t2.time > 20251201").having("t1.id in (10,100)").limit(0, 1000);
builder.buildSql(); // 结果: select t1.id from t1 left outer join t2 on t1.id == t2.id where t1.status=2 and t2.time > 20251201 having t1.id in (10,100) limit 0,1000
// 严格类型的生成器,使用时不能违反sql的约定,例如:from关键字后面不能用select
String sql = SqlBuilderFactory.strictSqlBuilder()
.select("t1.id")
.from("t1")
.leftOuterJoin(builder.buildSqlWithBracket() + "as t2") // builder.buildSqlWithBracket是将一个sql作为一个
.on("t1.id == t2.id", "t1.name=t2.name")
.where("t1.status=2")
.buildSql(); //结果/result: select t1.id from t1 left outer join (select t1.id from t1 left outer join t2 on t1.id == t2.id where t1.status=2 ) as t2 on t1.id == t2.id and t1.name=t2.name where t1.status=2