/******************************************************************************* * Copyright (c) 2013 hangum. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v2.1 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html * * Contributors: * hangum - initial API and implementation ******************************************************************************/ package com.hangum.tadpole.rdb.core.dialog.export.sqltoapplication.application; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import com.hangum.tadpole.commons.libs.core.define.PublicTadpoleDefine; import com.hangum.tadpole.engine.query.dao.system.UserDBDAO; import com.hangum.tadpole.engine.sql.util.SQLUtil; import com.hangum.tadpole.rdb.core.editors.main.utils.SQLTextUtil; import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.statement.Statement; import net.sf.jsqlparser.statement.delete.Delete; import net.sf.jsqlparser.statement.insert.Insert; import net.sf.jsqlparser.statement.select.Select; import net.sf.jsqlparser.statement.update.Update; /** * sql to java * * reference http://www.mybatis.org/mybatis-3/sqlmap-xml.html * * @author hangum * */ public class SQLToMyBatisConvert extends AbstractSQLTo { private static final Logger logger = Logger.getLogger(SQLToMyBatisConvert.class); public static final String DEFAULT_VARIABLE = "select"; /** * sql to string * * @param name * @param sql * @return */ public static String sqlToString(UserDBDAO userDB, String name, String sql) { StringBuffer sbSQL = new StringBuffer(); for (String strSQL : sql.split(PublicTadpoleDefine.SQL_DELIMITER)) { strSQL = SQLUtil.makeExecutableSQL(userDB, strSQL); try { Statement statement = CCJSqlParserUtil.parse(sql); if(statement instanceof Select) { sbSQL.append(getSelect(name, strSQL)); } else if(statement instanceof Insert) { sbSQL.append(getInsert(name, strSQL)); } else if(statement instanceof Update) { sbSQL.append(getUpdate(name, strSQL)); } else if(statement instanceof Delete) { sbSQL.append(getDelete(name, strSQL)); } } catch (Throwable e) { logger.error(String.format("sql parse exception. [ %s ]", sql)); } } return sbSQL.toString(); } /** * get insert * * @param name * @param sql * @return */ private static String getInsert(String name, String sql) { StringBuffer sbSQL = new StringBuffer(); sbSQL.append("<!-- \n"); sbSQL.append(" Insert Statement \n"); sbSQL.append("-->\n"); sbSQL.append("<INSERT id=\"" + name + "\" parameterType=\"hashmap\" flushCache=\"true\" statementType=\"PREPARED\" keyProperty=\"\" keyColumn=\"\" useGeneratedKeys=\"\" timeout=\"20\" >" + PublicTadpoleDefine.LINE_SEPARATOR); sbSQL.append(makeSomeSQL(sql)); sbSQL.append("</INSERT>" + PublicTadpoleDefine.LINE_SEPARATOR); return sbSQL.toString(); } /** * get update * * @param name * @param sql * @return */ private static String getUpdate(String name, String sql) { StringBuffer sbSQL = new StringBuffer(); sbSQL.append("<!-- \n"); sbSQL.append(" Update statement \n"); sbSQL.append("-->\n"); sbSQL.append("<UPDATE id=\"" + name + "\" parameterType=\"hashmap\" flushCache=\"true\" statementType=\"PREPARED\" timeout=\"20\" >" + PublicTadpoleDefine.LINE_SEPARATOR); sbSQL.append(makeSomeSQL(sql)); sbSQL.append("</UPDATE>" + PublicTadpoleDefine.LINE_SEPARATOR); return sbSQL.toString(); } /** * get delete * * @param name * @param sql * @return */ private static String getDelete(String name, String sql) { StringBuffer sbSQL = new StringBuffer(); sbSQL.append("<!-- \n"); sbSQL.append(" DELETE Statement \n"); sbSQL.append("-->\n"); sbSQL.append("<DELETE id=\"" + name + "\" parameterType=\"hashmap\" flushCache=\"true\" statementType=\"PREPARED\" timeout=\"20\" >" + PublicTadpoleDefine.LINE_SEPARATOR); sbSQL.append(makeSomeSQL(sql)); sbSQL.append("</DELETE>" + PublicTadpoleDefine.LINE_SEPARATOR); return sbSQL.toString(); } /** * get select * * @param name * @param sql * @return */ private static String getSelect(String name, String sql) { StringBuffer sbSQL = new StringBuffer(); sbSQL.append("<!-- \n"); sbSQL.append(" SELECT statement \n"); // sbSQL.append("ref : http://www.mybatis.org/mybatis-3/sqlmap-xml.html \n"); // sbSQL.append("<SELECT\n"); // sbSQL.append(" id=\"selectPerson\"\n"); // sbSQL.append(" parameterType=\"int\"\n"); // sbSQL.append(" parameterMap=\"deprecated\"\n"); // sbSQL.append(" resultType=\"hashmap\"\n"); // sbSQL.append(" resultMap=\"personResultMap\"\n"); // sbSQL.append(" flushCache=\"false\"\n"); // sbSQL.append(" useCache=\"true\"\n"); // sbSQL.append(" timeout=\"10000\"\n"); // sbSQL.append(" fetchSize=\"256\"\n"); // sbSQL.append(" statementType=\"PREPARED\"\n"); // sbSQL.append(" resultSetType=\"FORWARD_ONLY\"> \n"); sbSQL.append("-->\n"); sbSQL.append("<SELECT id=\"" + name + "\" parameterType=\"hashmap\" resultType=\"hashmap\" >" + PublicTadpoleDefine.LINE_SEPARATOR); sbSQL.append(makeSomeSQL(sql)); sbSQL.append("</SELECT>" + PublicTadpoleDefine.LINE_SEPARATOR); return sbSQL.toString(); } /** * make some sql * @param sql * @return */ private static String makeSomeSQL(String sql) { StringBuffer sbSQL = new StringBuffer(); StringBuffer strLine; StringBuffer strConst; sql = StringUtils.remove(sql, ";"); String[] splists = StringUtils.split(sql, PublicTadpoleDefine.LINE_SEPARATOR); int idx = 1; for (String part : splists) { if(!"".equals( StringUtils.trimToEmpty(part) ) ) { sbSQL.append("\t"); part = SQLTextUtil.delLineChar(part); strLine = new StringBuffer(); strConst = new StringBuffer(); boolean isOpen = false; for (int p=0; p<part.length(); p++) { if (!isOpen && '\'' == part.charAt(p) ) { strLine.append("#{"); strConst.append("/* '"); isOpen = true; }else if (isOpen && '\'' == part.charAt(p) ) { strLine.append("param_"+ idx++ +"}"); strConst.append("' */"); isOpen = false; }else if (!isOpen){ strLine.append(part.charAt(p)); }else if (isOpen){ strConst.append(part.charAt(p)); } } sbSQL.append(strLine.toString() + strConst.toString()); sbSQL.append(PublicTadpoleDefine.LINE_SEPARATOR); }//if Empty }//for return sbSQL.toString(); } }