博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JFinal SQL脚本插件
阅读量:6158 次
发布时间:2019-06-21

本文共 10423 字,大约阅读时间需要 34 分钟。

hot3.png

//SQLScriptPlugin JFinal插件类//SQL脚本目录:/WEB-INF/sql-scriptpublic class SQLScriptPlugin implements IPlugin {		private static final Log log = Log.getLog(SQLScriptPlugin.class);		private static final String LOADPATH = PathKit.getWebRootPath()			+ File.separator + "WEB-INF" + File.separator + "sql-script";	public SQLScriptPlugin() {		try {			File file = new File(LOADPATH);			if(!file.exists()) {				file.mkdirs();			}			SQLScript.init(new File(LOADPATH));		} catch (IOException e) {			log.error("SQLScriptPlugin Load Fail");			log.error(ErrorKit.toString(e));		}	}	@Override	public boolean start() {		return true;	}	@Override	public boolean stop() {		return true;	}}
//SQLScript 核心类主要完成语句的解析功能//加载文件需要依赖apache.commons.iopublic class SQLScript {	private static Pattern SQLID_REG = Pattern.compile("(?:^/[*][+][*]\\s+[(])([\\w.]+)(?:[)]\\s+[*][+][*]/$)");		private static Pattern SQLKEY_REG = Pattern.compile("(?<=(?:^|[^\\w@:?]))[@:?]([\\w]+)(?=(?:[^\\w@:?]|$))");		private static Pattern SPLITIN_REG = Pattern.compile("(?<=\\bin\\b)(?:\\s*[(]\\s*)[@:?]([\\w]+)(?:\\s*[)])", 			Pattern.CASE_INSENSITIVE);		private static Pattern REPLACE_REG = Pattern.compile("(?<=(?:^|\\s))#INS#(?=(?:\\s|$))",			Pattern.CASE_INSENSITIVE);		private static String[] EXTENSIONS = new String[] { "sql", "SQL" };		private static Map
 SQL_MAP = new HashMap
(); private SQLScript() {} public static synchronized void init(File input) throws IOException { SQL_MAP.clear(); Collection
 sqlFiles = FileUtils.listFiles(input, EXTENSIONS, true); if (sqlFiles != null && sqlFiles.size() > 0) { for (File file : sqlFiles) { List
 lines = FileUtils.readLines(file, "UTF-8"); String sql_id = null; boolean append = false; StringBuilder sql = null; if (lines != null && lines.size() > 0) { for (int i = 0; i < lines.size(); i++) { String line = lines.get(i); if (line == null) continue; Matcher matcher = SQLID_REG.matcher(line.trim()); if (matcher.matches()) { if (sql_id != null && sql != null) { if (!StrKit.isBlank(sql.toString())) { if (SQL_MAP.containsKey(sql_id)) { throw new RuntimeException("脚本加载异常: 存在相同的SQL_ID: " + sql_id); } SQL_MAP.put(sql_id, sql.toString().trim()); append = false; } } sql_id = matcher.group(1); sql = new StringBuilder(); append = true; } else if (append) { sql.append(line).append("\r\n"); } if (lines.size() == i + 1) { if (sql_id != null && sql != null) { if (!StrKit.isBlank(sql.toString())) { if (SQL_MAP.containsKey(sql_id)) { throw new RuntimeException("脚本加载异常: 存在相同的SQL_ID: " + sql_id); } SQL_MAP.put(sql_id, sql.toString().trim()); append = false; } } } } } } } } public static synchronized void load(File input) throws IOException { List
 lines = FileUtils.readLines(input, "UTF-8"); String sql_id = null; boolean append = false; StringBuilder sql = null; if (lines != null && lines.size() > 0) { for (int i = 0; i < lines.size(); i++) { String line = lines.get(i); if (line == null) continue; Matcher matcher = SQLID_REG.matcher(line.trim()); if (matcher.matches()) { if (sql_id != null && sql != null) { if (!StrKit.isBlank(sql.toString())) { SQL_MAP.put(sql_id, sql.toString().trim()); append = false; } } sql_id = matcher.group(1); sql = new StringBuilder(); append = true; } else if (append) { sql.append(line).append("\r\n"); } if (lines.size() == i + 1) { if (sql_id != null && sql != null) { if (!StrKit.isBlank(sql.toString())) { SQL_MAP.put(sql_id, sql.toString().trim()); append = false; } } } } } } public static SQLBean parse(String sqlid) { return parse(sqlid, null, null); } public static SQLBean parse(String sqlid, String replace) { return parse(sqlid, replace, null); } public static SQLBean parse(String sqlid, SQLParam param) { return parse(sqlid, null, param); } public static SQLBean parse(String sqlid, String replace, SQLParam params) { String sqlText = SQL_MAP.get(sqlid); if (StrKit.isBlank(sqlText)) { return null; } Matcher matcher = REPLACE_REG.matcher(sqlText); if (matcher.find()) { if (StrKit.isBlank(replace)) { sqlText = matcher.replaceAll(""); } else { sqlText = matcher.replaceAll(replace); } } matcher = SQLKEY_REG.matcher(sqlText); Map
 psmap = null; List
 value = null; if (params != null) { while (matcher.find()) { if (value == null) { value = new ArrayList(); } String key = matcher.group(1); Object val = params.get(key); if (val instanceof Object[]) { if (psmap == null) { psmap = new HashMap
(); } Object[] obj = (Object[]) val; psmap.put(key, obj.length); if (obj.length > 0) { for (Object item : obj) { value.add(item); } } else { value.add(null); } } else if (val instanceof List) { if (psmap == null) { psmap = new HashMap
(); } List
 obj = (List
) val; psmap.put(key, obj.size()); if (obj.size() > 0) { for (Object item : obj) { value.add(item); } } else { value.add(null); } } else { value.add(val); } } } if (psmap != null) { matcher = SPLITIN_REG.matcher(sqlText); while (matcher.find()) { String key = matcher.group(1); String str = inSqlString(psmap.get(key)); sqlText = matcher.replaceFirst(str); matcher = matcher.reset(sqlText); } matcher = SQLKEY_REG.matcher(sqlText); } String sql = matcher.replaceAll("?"); if (value == null) { return new SQLBean(sql.trim(), new Object[0]); } return new SQLBean(sql.trim(), value.toArray()); } public static SQLBean parseSql(String sqlText) { return parseSql(sqlText, null); } public static SQLBean parseSql(String sqlText, SQLParam params) { Matcher matcher = SQLKEY_REG.matcher(sqlText); Map
 psmap = null; List
 value = null; if (params != null) { while (matcher.find()) { if (value == null) { value = new ArrayList(); } String key = matcher.group(1); Object val = params.get(key); if (val instanceof Object[]) { if (psmap == null) { psmap = new HashMap
(); } Object[] obj = (Object[]) val; psmap.put(key, obj.length); if (obj.length > 0) { for (Object item : obj) { value.add(item); } } else { value.add(null); } } else if (val instanceof List) { if (psmap == null) { psmap = new HashMap
(); } List
 obj = (List
) val; psmap.put(key, obj.size()); if (obj.size() > 0) { for (Object item : obj) { value.add(item); } } else { value.add(null); } } else { value.add(val); } } } if (psmap != null) { matcher = SPLITIN_REG.matcher(sqlText); while (matcher.find()) { String key = matcher.group(1); String str = inSqlString(psmap.get(key)); sqlText = matcher.replaceFirst(str); matcher = matcher.reset(sqlText); } matcher = SQLKEY_REG.matcher(sqlText); } String sql = matcher.replaceAll("?"); if (value == null) { return new SQLBean(sql.trim(), new Object[0]); } return new SQLBean(sql.trim(), value.toArray()); } public static String getSqlString(String sqlid) { SQLBean bean = parse(sqlid, null, null); if (bean != null) { return bean.sql; } return null; } public static String getSqlString(String sqlid, String replace) { SQLBean bean = parse(sqlid, replace, null); if (bean != null) { return bean.sql; } return null; } public static String getSqlString(String sqlid, SQLParam params) { SQLBean bean = parse(sqlid, null, params); if (bean != null) { return bean.sql; } return null; } public static String getSqlString(String sqlid, String replace, SQLParam params) { SQLBean bean = parse(sqlid, replace, params); if (bean != null) { return bean.sql; } return null; } public static String getSqlSource(String sqlid) { return SQL_MAP.get(sqlid); } private static String inSqlString(Integer size) { if (size == null || size == 0) { return " (?)"; } StringBuffer sb = new StringBuffer(); sb.append(" ("); for (int i = 0; i < size; i++) { if (i > 0) sb.append(", "); sb.append("?"); } sb.append(")"); return sb.toString(); }}
//SQLBean 解析后生成的对象public class SQLBean implements Serializable {	private static final long serialVersionUID = 1L;		public String sql;	public Object[] params;		public SQLBean() {}	public SQLBean(String sql, Object[] params) {		this.sql = sql;		this.params = params;	}	@Override	public String toString() {		return "{\r\n" + sql + ";\r\n" + Arrays.toString(params) + "\r\n}";	}}
//SQLParam 绑定参数传入对象public class SQLParam implements Serializable {	private static final long serialVersionUID = 1L;		private Map
 columns = new HashMap
(); public SQLParam() {} public SQLParam(String key, Object value) { set(key, value); } public SQLParam(Map
 columns) { setColumns(columns); } public Map
 getColumns() { return columns; } public SQLParam setColumns(Map
 columns) { getColumns().putAll(columns); return this; } public SQLParam set(String column, Object value) { getColumns().put(column, value); return this; } @SuppressWarnings("unchecked") public 
 T get(String column) { return (T)getColumns().get(column); } @SuppressWarnings("unchecked") public 
 T get(String column, Object defaultValue) { Object result = getColumns().get(column); return (T)(result != null ? result : defaultValue); }}
//使用方法SQLBean bean1 = SQLScript.parse("Test.sql_1", "order by 1,2,3");System.out.println(bean1);Db.find(bean1.sql, 110100, 110100, 1);		SQLBean bean2 = SQLScript.parse("Test.sql_2", "order by 1,2,3",                 new SQLParam("id", 110100).set("status", 1));System.out.println(bean2);Db.find(bean2.sql, bean2.params);		SQLBean bean3 = SQLScript.parse("Test.sql_3", "order by 1,2,3",                 new SQLParam("id", new Object[]{110100,110200,110300}).set("status", 1));System.out.println(bean3);Db.find(bean2.sql, bean2.params);
/WEB-INF/sql-script/Test.sql /*+* (Test.sql_1) *+*/select t.* from g_area twhere t.id = ?  and t.parent_id <> ?#INS#/*+* (Test.sql_2) *+*/select t.* from g_area twhere t.id = :id  and t.parent_id <> :id  and t.status = :status#INS#/*+* (Test.sql_3) *+*/select t.* from g_area twhere t.id in (:id)  and t.parent_id not in (:id)  and t.status = :status#INS#//脚本文件格式说明:1、/*+* (sqlid) *+*/ 每条SQL以这样的格式作为开头(注意括号外面有空格),括号里面的sqlid是sql语句的唯一标识。2、@id、:id、?id 命名参数占位符绑定变量参数占位符,支持以上3种3、#INS# 文本替换占位符可以在调用语句时追加额外语句进来

转载于:https://my.oschina.net/jolphin/blog/654707

你可能感兴趣的文章
ODI基于源表时间戳字段获取增量数据
查看>>
并发容器之CopyOnWriteArrayList(转载)
查看>>
什么是AAC音频格式 AAC-LC 和 AAC-HE的区别是什么
查看>>
原创:goldengate从11.2升级到12.1.2
查看>>
Quartz
查看>>
正则表达式的语法规则
查看>>
C#一个关于委托和事件通俗易懂的例子
查看>>
类似于SVN的文档内容差异对比工具winmerge
查看>>
Cause: java.sql.SQLException: The user specified as a definer ('root'@'%') does not exist
查看>>
quratz线程
查看>>
execnet: rapid multi-Python deployment
查看>>
windows修改3389端口
查看>>
关于JavaScript词法
查看>>
FreeSwitch中的会议功能(4)
查看>>
MySQL中创建用户分配权限(到指定数据库或者指定数据库表中)
查看>>
AutoReleasePool 和 ARC 以及Garbage Collection
查看>>
重新想象 Windows 8 Store Apps (9) - 控件之 ScrollViewer 基础
查看>>
乐在其中设计模式(C#) - 提供者模式(Provider Pattern)
查看>>
MVP Community Camp 社区大课堂
查看>>
GWT用frame调用JSP
查看>>