|
@@ -31,63 +31,63 @@ import com.jfinal.template.source.ISource;
|
|
|
*/
|
|
*/
|
|
|
@SuppressWarnings({"unchecked", "rawtypes"})
|
|
@SuppressWarnings({"unchecked", "rawtypes"})
|
|
|
public class SqlKit {
|
|
public class SqlKit {
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
static final String SQL_TEMPLATE_MAP_KEY = "_SQL_TEMPLATE_MAP_";
|
|
static final String SQL_TEMPLATE_MAP_KEY = "_SQL_TEMPLATE_MAP_";
|
|
|
static final String SQL_PARA_KEY = "_SQL_PARA_";
|
|
static final String SQL_PARA_KEY = "_SQL_PARA_";
|
|
|
static final String PARA_ARRAY_KEY = "_PARA_ARRAY_"; // 此参数保持不动,已被用于模板取值 _PARA_ARRAY_[n]
|
|
static final String PARA_ARRAY_KEY = "_PARA_ARRAY_"; // 此参数保持不动,已被用于模板取值 _PARA_ARRAY_[n]
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
private String configName;
|
|
private String configName;
|
|
|
private boolean devMode;
|
|
private boolean devMode;
|
|
|
private Engine engine;
|
|
private Engine engine;
|
|
|
private List<SqlSource> sqlSourceList = new ArrayList<SqlSource>();
|
|
private List<SqlSource> sqlSourceList = new ArrayList<SqlSource>();
|
|
|
private Map<String, Template> sqlTemplateMap;
|
|
private Map<String, Template> sqlTemplateMap;
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
public SqlKit(String configName, boolean devMode) {
|
|
public SqlKit(String configName, boolean devMode) {
|
|
|
this.configName = configName;
|
|
this.configName = configName;
|
|
|
this.devMode = devMode;
|
|
this.devMode = devMode;
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
engine = new Engine(configName);
|
|
engine = new Engine(configName);
|
|
|
engine.setDevMode(devMode);
|
|
engine.setDevMode(devMode);
|
|
|
engine.setToClassPathSourceFactory();
|
|
engine.setToClassPathSourceFactory();
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
engine.addDirective("namespace", NameSpaceDirective.class);
|
|
engine.addDirective("namespace", NameSpaceDirective.class);
|
|
|
engine.addDirective("sql", SqlDirective.class);
|
|
engine.addDirective("sql", SqlDirective.class);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
engine.addDirective("para", ParaDirective.class, true);
|
|
engine.addDirective("para", ParaDirective.class, true);
|
|
|
engine.addDirective("p", ParaDirective.class, true); // 配置 #para 指令的别名指令 #p,不建议使用,在此仅为兼容 3.0 版本
|
|
engine.addDirective("p", ParaDirective.class, true); // 配置 #para 指令的别名指令 #p,不建议使用,在此仅为兼容 3.0 版本
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
public SqlKit(String configName) {
|
|
public SqlKit(String configName) {
|
|
|
this(configName, false);
|
|
this(configName, false);
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
public Engine getEngine() {
|
|
public Engine getEngine() {
|
|
|
return engine;
|
|
return engine;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
public void setDevMode(boolean devMode) {
|
|
public void setDevMode(boolean devMode) {
|
|
|
this.devMode = devMode;
|
|
this.devMode = devMode;
|
|
|
engine.setDevMode(devMode);
|
|
engine.setDevMode(devMode);
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
public void setBaseSqlTemplatePath(String baseSqlTemplatePath) {
|
|
public void setBaseSqlTemplatePath(String baseSqlTemplatePath) {
|
|
|
engine.setBaseTemplatePath(baseSqlTemplatePath);
|
|
engine.setBaseTemplatePath(baseSqlTemplatePath);
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
public void addSqlTemplate(String sqlTemplate) {
|
|
public void addSqlTemplate(String sqlTemplate) {
|
|
|
if (StrKit.isBlank(sqlTemplate)) {
|
|
if (StrKit.isBlank(sqlTemplate)) {
|
|
|
throw new IllegalArgumentException("sqlTemplate can not be blank");
|
|
throw new IllegalArgumentException("sqlTemplate can not be blank");
|
|
|
}
|
|
}
|
|
|
sqlSourceList.add(new SqlSource(sqlTemplate));
|
|
sqlSourceList.add(new SqlSource(sqlTemplate));
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
public void addSqlTemplate(ISource sqlTemplate) {
|
|
public void addSqlTemplate(ISource sqlTemplate) {
|
|
|
if (sqlTemplate == null) {
|
|
if (sqlTemplate == null) {
|
|
|
throw new IllegalArgumentException("sqlTemplate can not be null");
|
|
throw new IllegalArgumentException("sqlTemplate can not be null");
|
|
|
}
|
|
}
|
|
|
sqlSourceList.add(new SqlSource(sqlTemplate));
|
|
sqlSourceList.add(new SqlSource(sqlTemplate));
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
public synchronized void parseSqlTemplate() {
|
|
public synchronized void parseSqlTemplate() {
|
|
|
Map<String, Template> sqlTemplateMap = new HashMap<String, Template>(512, 0.5F);
|
|
Map<String, Template> sqlTemplateMap = new HashMap<String, Template>(512, 0.5F);
|
|
|
for (SqlSource ss : sqlSourceList) {
|
|
for (SqlSource ss : sqlSourceList) {
|
|
@@ -98,12 +98,12 @@ public class SqlKit {
|
|
|
}
|
|
}
|
|
|
this.sqlTemplateMap = sqlTemplateMap;
|
|
this.sqlTemplateMap = sqlTemplateMap;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
private void reloadModifiedSqlTemplate() {
|
|
private void reloadModifiedSqlTemplate() {
|
|
|
engine.removeAllTemplateCache(); // 去除 Engine 中的缓存,以免 get 出来后重新判断 isModified
|
|
engine.removeAllTemplateCache(); // 去除 Engine 中的缓存,以免 get 出来后重新判断 isModified
|
|
|
parseSqlTemplate();
|
|
parseSqlTemplate();
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
private boolean isSqlTemplateModified() {
|
|
private boolean isSqlTemplateModified() {
|
|
|
for (Template template : sqlTemplateMap.values()) {
|
|
for (Template template : sqlTemplateMap.values()) {
|
|
|
if (template.isModified()) {
|
|
if (template.isModified()) {
|
|
@@ -112,7 +112,7 @@ public class SqlKit {
|
|
|
}
|
|
}
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
public Template getSqlTemplate(String key) {
|
|
public Template getSqlTemplate(String key) {
|
|
|
Template template = sqlTemplateMap.get(key);
|
|
Template template = sqlTemplateMap.get(key);
|
|
|
if (template == null) { // 此 if 分支,处理起初没有定义,但后续不断追加 sql 的情况
|
|
if (template == null) { // 此 if 分支,处理起初没有定义,但后续不断追加 sql 的情况
|
|
@@ -129,7 +129,7 @@ public class SqlKit {
|
|
|
}
|
|
}
|
|
|
return template;
|
|
return template;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
if (devMode && template.isModified()) {
|
|
if (devMode && template.isModified()) {
|
|
|
synchronized (this) {
|
|
synchronized (this) {
|
|
|
template = sqlTemplateMap.get(key);
|
|
template = sqlTemplateMap.get(key);
|
|
@@ -141,14 +141,14 @@ public class SqlKit {
|
|
|
}
|
|
}
|
|
|
return template;
|
|
return template;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 通过 key 获取 sql
|
|
* 通过 key 获取 sql
|
|
|
*/
|
|
*/
|
|
|
public String getSql(String key) {
|
|
public String getSql(String key) {
|
|
|
return getSql(key, null);
|
|
return getSql(key, null);
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 通过 key 获取 sql
|
|
* 通过 key 获取 sql
|
|
|
* 传入变量 Map data 参与 sql 生成
|
|
* 传入变量 Map data 参与 sql 生成
|
|
@@ -158,7 +158,7 @@ public class SqlKit {
|
|
|
Template template = getSqlTemplate(key);
|
|
Template template = getSqlTemplate(key);
|
|
|
return template != null ? template.renderToString(data) : null;
|
|
return template != null ? template.renderToString(data) : null;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 示例:
|
|
* 示例:
|
|
|
* 1:sql 定义
|
|
* 1:sql 定义
|
|
@@ -175,14 +175,14 @@ public class SqlKit {
|
|
|
if (template == null) {
|
|
if (template == null) {
|
|
|
return null;
|
|
return null;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
SqlPara sqlPara = new SqlPara();
|
|
SqlPara sqlPara = new SqlPara();
|
|
|
data.put(SQL_PARA_KEY, sqlPara);
|
|
data.put(SQL_PARA_KEY, sqlPara);
|
|
|
sqlPara.setSql(template.renderToString(data));
|
|
sqlPara.setSql(template.renderToString(data));
|
|
|
data.remove(SQL_PARA_KEY); // 避免污染传入的 Map
|
|
data.remove(SQL_PARA_KEY); // 避免污染传入的 Map
|
|
|
return sqlPara;
|
|
return sqlPara;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 示例:
|
|
* 示例:
|
|
|
* 1:sql 定义
|
|
* 1:sql 定义
|
|
@@ -198,7 +198,7 @@ public class SqlKit {
|
|
|
if (template == null) {
|
|
if (template == null) {
|
|
|
return null;
|
|
return null;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
SqlPara sqlPara = new SqlPara();
|
|
SqlPara sqlPara = new SqlPara();
|
|
|
Map data = new HashMap();
|
|
Map data = new HashMap();
|
|
|
data.put(SQL_PARA_KEY, sqlPara);
|
|
data.put(SQL_PARA_KEY, sqlPara);
|
|
@@ -207,52 +207,52 @@ public class SqlKit {
|
|
|
// data 为本方法中创建,不会污染用户数据,无需移除 SQL_PARA_KEY、PARA_ARRAY_KEY
|
|
// data 为本方法中创建,不会污染用户数据,无需移除 SQL_PARA_KEY、PARA_ARRAY_KEY
|
|
|
return sqlPara;
|
|
return sqlPara;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
public java.util.Set<java.util.Map.Entry<String, Template>> getSqlMapEntrySet() {
|
|
public java.util.Set<java.util.Map.Entry<String, Template>> getSqlMapEntrySet() {
|
|
|
return sqlTemplateMap.entrySet();
|
|
return sqlTemplateMap.entrySet();
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
public String toString() {
|
|
public String toString() {
|
|
|
return "SqlKit for config : " + configName;
|
|
return "SqlKit for config : " + configName;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// ---------
|
|
// ---------
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 通过 String 内容获取 SqlPara 对象
|
|
* 通过 String 内容获取 SqlPara 对象
|
|
|
- *
|
|
|
|
|
|
|
+ *
|
|
|
* <pre>
|
|
* <pre>
|
|
|
* 例子:
|
|
* 例子:
|
|
|
* String content = "select * from user where id = #para(id)";
|
|
* String content = "select * from user where id = #para(id)";
|
|
|
* SqlPara sqlPara = getSqlParaByString(content, Kv.of("id", 123));
|
|
* SqlPara sqlPara = getSqlParaByString(content, Kv.of("id", 123));
|
|
|
- *
|
|
|
|
|
|
|
+ *
|
|
|
* 特别注意:content 参数中不能包含 #sql 指令
|
|
* 特别注意:content 参数中不能包含 #sql 指令
|
|
|
* </pre>
|
|
* </pre>
|
|
|
*/
|
|
*/
|
|
|
public SqlPara getSqlParaByString(String content, Map data) {
|
|
public SqlPara getSqlParaByString(String content, Map data) {
|
|
|
Template template = engine.getTemplateByString(content);
|
|
Template template = engine.getTemplateByString(content);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
SqlPara sqlPara = new SqlPara();
|
|
SqlPara sqlPara = new SqlPara();
|
|
|
data.put(SQL_PARA_KEY, sqlPara);
|
|
data.put(SQL_PARA_KEY, sqlPara);
|
|
|
sqlPara.setSql(template.renderToString(data));
|
|
sqlPara.setSql(template.renderToString(data));
|
|
|
data.remove(SQL_PARA_KEY); // 避免污染传入的 Map
|
|
data.remove(SQL_PARA_KEY); // 避免污染传入的 Map
|
|
|
return sqlPara;
|
|
return sqlPara;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 通过 String 内容获取 SqlPara 对象
|
|
* 通过 String 内容获取 SqlPara 对象
|
|
|
- *
|
|
|
|
|
|
|
+ *
|
|
|
* <pre>
|
|
* <pre>
|
|
|
* 例子:
|
|
* 例子:
|
|
|
* String content = "select * from user where id = #para(0)";
|
|
* String content = "select * from user where id = #para(0)";
|
|
|
* SqlPara sqlPara = getSqlParaByString(content, 123);
|
|
* SqlPara sqlPara = getSqlParaByString(content, 123);
|
|
|
- *
|
|
|
|
|
|
|
+ *
|
|
|
* 特别注意:content 参数中不能包含 #sql 指令
|
|
* 特别注意:content 参数中不能包含 #sql 指令
|
|
|
* </pre>
|
|
* </pre>
|
|
|
*/
|
|
*/
|
|
|
public SqlPara getSqlParaByString(String content, Object... paras) {
|
|
public SqlPara getSqlParaByString(String content, Object... paras) {
|
|
|
Template template = engine.getTemplateByString(content);
|
|
Template template = engine.getTemplateByString(content);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
SqlPara sqlPara = new SqlPara();
|
|
SqlPara sqlPara = new SqlPara();
|
|
|
Map data = new HashMap();
|
|
Map data = new HashMap();
|
|
|
data.put(SQL_PARA_KEY, sqlPara);
|
|
data.put(SQL_PARA_KEY, sqlPara);
|
|
@@ -265,4 +265,3 @@ public class SqlKit {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|