PHP Code:
package tools;
import database.DatabaseConnection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
import static tools.SQLTool.SQLStatementType.*;
/**
*
* @author QuietCrystal [MENTION=1333426735]RaGEZONE[/MENTION]
*/
public class SQLTool {
private String tableName;
private final SQLStatementType statementType;
private final HashMap<String, String> value;
private final HashMap<String, String> condition;
private final List<String> order;
private ResultSet rs = null;
public static enum SQLStatementType {
SELECT,
INSERT,
UPDATE,
DELETE;
}
public SQLTool(SQLStatementType type) {
statementType = type;
value = (statementType != DELETE) ? new HashMap<>() : null;
condition = (statementType != INSERT) ? new HashMap<>() : null;
order = (statementType == SELECT) ? new ArrayList<>() : null;
}
public SQLTool(SQLStatementType type, String table) {
this(type);
tableName = table;
}
public void setTable(String table) {
rs = null;
tableName = table;
}
public String getTable() {
return tableName;
}
public void addValue(String colmName) {
if (value == null) {
return;
}
rs = null;
value.put(colmName, statementType == SELECT ? "" : "DEFAULT");
}
public void addValue(String colmName, Object colmValue) {
if (value == null || !canSql(colmValue)) {
return;
}
rs = null;
value.put(colmName, "'" + convertSql(colmValue) + "'");
}
public HashMap<String, String> getValues() {
return value;
}
public void addCondition(String colmName, Object colmValue) {
if (condition == null || !canSql(colmValue)) {
return;
}
rs = null;
condition.put(colmName, convertSql(colmValue));
}
public HashMap<String, String> getConditions() {
return condition;
}
public void addOrder(String colmName) {
addOrder(colmName, true);
}
public void addOrder(String colmName, boolean isAsc) {
if (order == null) {
return;
}
rs = null;
order.add("`" + colmName + "` " + (isAsc ? "ASC" : "DESC"));
}
public List<String> getOrder() {
return order;
}
public ResultSet execute() {
rs = null;
StringBuilder statement = new StringBuilder();
switch (statementType) {
case SELECT:
statement.append("SELECT");
if (value.isEmpty()) {
statement.append(" *");
} else {
boolean firstEntry = true;
for (String colm : value.keySet()) {
statement.append(firstEntry ? " " : ", ").append(colm);
firstEntry = false;
}
}
statement.append(" FROM ").append(tableName);
if (!condition.isEmpty()) {
statement.append(" WHERE");
boolean firstEntry = true;
for (Entry<String, String> val : condition.entrySet()) {
statement.append(firstEntry ? "" : " AND").append(" ").append(val.getKey()).append(" = '").append(val.getValue()).append("'");
firstEntry = false;
}
}
if (!order.isEmpty()) {
statement.append(" ORDER BY");
boolean firstEntry = true;
for (String ord : order) {
statement.append(firstEntry ? " " : ", ").append(ord);
}
}
break;
case INSERT:
statement.append("INSERT INTO ").append(tableName).append(" ");
List<String> values = new ArrayList<>();
if (!value.isEmpty()) {
boolean firstEntry = true;
for (Entry<String, String> val : value.entrySet()) {
statement.append(firstEntry ? "(`" : ", `").append(val.getKey()).append("`");
values.add(val.getValue());
firstEntry = false;
}
statement.append(") ");
}
statement.append(value.isEmpty() ? "DEFAULT " : "").append("VALUES ");
if (!value.isEmpty()) {
boolean firstEntry = true;
for (String val : values) {
statement.append(firstEntry ? "(" : ", ").append(val);
firstEntry = false;
}
statement.append(")");
}
break;
case UPDATE:
statement.append("UPDATE ").append(tableName);
if (!value.isEmpty()) {
statement.append(" SET ");
boolean firstEntry = true;
for (Entry<String, String> val : value.entrySet()) {
statement.append(firstEntry ? "`" : ", `").append(val.getKey()).append("` = ").append(val.getValue());
firstEntry = false;
}
}
if (!condition.isEmpty()) {
statement.append(" WHERE");
boolean firstEntry = true;
for (Entry<String, String> val : condition.entrySet()) {
statement.append(firstEntry ? "" : " AND").append(" ").append(val.getKey()).append(" = '").append(val.getValue()).append("'");
firstEntry = false;
}
}
break;
case DELETE:
statement.append("DELETE FROM ").append(tableName);
if (!condition.isEmpty()) {
statement.append(" WHERE");
boolean firstEntry = true;
for (Entry<String, String> val : condition.entrySet()) {
statement.append(firstEntry ? "" : " AND").append(" ").append(val.getKey()).append(" = '").append(val.getValue()).append("'");
firstEntry = false;
}
}
break;
}
try {
PreparedStatement ps;
switch (statementType) {
case INSERT:
case UPDATE:
ps = DatabaseConnection.getConnection().prepareStatement(statement.toString(), DatabaseConnection.RETURN_GENERATED_KEYS);
break;
case SELECT:
ps = DatabaseConnection.getConnection().prepareStatement(statement.toString(), ResultSet.CONCUR_UPDATABLE);
break;
default:
ps = DatabaseConnection.getConnection().prepareStatement(statement.toString());
break;
}
ps.execute();
rs = ps.getGeneratedKeys();
} catch (SQLException ex) {
System.err.println("Error in executing SQL statement "" + statement.toString() + "": " + ex);
}
return rs;
}
public ResultSet getResultSet() {
return (rs != null) ? rs : execute();
}
private static final Set<Class> WRAPPER_TYPES = new HashSet(Arrays.asList(
Boolean.class, Character.class, Byte.class, Short.class, Integer.class, Long.class, Float.class, Double.class, Void.class)
);
private boolean canSql(Object obj) {
return WRAPPER_TYPES.contains(obj.getClass());
}
private String convertSql(Object obj) {
return String.valueOf(obj);
}
}