A Simple SQL Query Builder Class In JAVA For SQLITE .

When creating SQL queries Dynamically, It is very much useful to have a utility class for managing it.
SQL_QUERY_GENERATOR
In my current project I have created a simple Query builder class in JAVA supporting SQLITE Compatible queries.
Here it is!!!

SqlQueryGenerator.java

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
class SqlQueryGenerator {

	/**
	 * To add a table to the query.
	 * @param tableName name o the table to be added.
	 */
	public boolean addTable(String tableName){
		if(!QTableList.contains(tableName)){
			QTableList.add(tableName);
			return true;
		}else{
			return false;
		}
	}


	/**
	 * 
	 * @param fieldName
	 * @param value
	 * @param dataType data type of the field (Specify it as "text" for string types , "num" for numerical types)
	 * @return
	 */
	public boolean addField(String fieldName, String value, String dataType){



		if(dataType.equals("text")){

			boolean isWildchar = (StringUtilities.indexOfFirstContainedCharacter(value, "'") !=-1);
			value = getInsertValueLeftChar(isWildchar)+value+getInsertValueRightChar(isWildchar);	
		}

		QField field = new QField(fieldName, value, dataType);

		QFieldList.add(field);

		return true;
	}
	/**
	 * To add a field for Select query.
	 * @param fieldName Field name to be added.
	 * @param aliasName Alias name for the select field.
	 * @return
	 */
	public boolean addSelectField(String fieldName, String aliasName){

		if(StringUtilities.indexOfFirstContainedCharacter(fieldName, " /-") !=-1){	     
			fieldName = "`"+fieldName+"`"; 
		}

		if(StringUtilities.indexOfFirstContainedCharacter(aliasName, " /-") !=-1){	     
			aliasName = "`"+aliasName+"`"; 
		}

		QSelectField field = new QSelectField(fieldName, aliasName);

		QSelectFieldList.add(field);

		return true;
	}

	/**
	 * Overloaded function To add a field for Select query.
	 * @param fieldName Field name to be added.
	 * @return
	 */
	public boolean addSelectField(String fieldName){

		if(StringUtilities.indexOfFirstContainedCharacter(fieldName, " /-") !=-1){	     
			fieldName = "`"+fieldName+"`"; 
		}
		QSelectField field = new QSelectField(fieldName);

		QSelectFieldList.add(field);

		return true;
	}

	/**
	 * To add where condition in a query.
	 * @param fieldName Field name for the condition.
	 * @param val       Value for the field to be compared.
	 * @param op        Operator('=', '<', '>' etc...for the condition)
	 * @return
	 */
	public boolean addWhereField(String fieldName, String val, String op){

		if(StringUtilities.indexOfFirstContainedCharacter(fieldName, " /-") !=-1){	     
			fieldName = "`"+fieldName+"`"; 
		}
		QWhereField field = new QWhereField(fieldName, val,op,"AND",false);

		QWhereFieldList.add(field);
		return true;
	}
    
	/**
	 * To add where condition in a query.
	 * @param fieldName Field name for the condition.
	 * @param val       Value for the field to be compared.
	 * @param op        Operator('=', '<', '>' etc...for the condition)
	 * @param concat    Operator for the where field ('AND' or 'OR')
	 * @return
	 */
	public boolean addWhereField(String fieldName, String val, String op, String concat){

		if(StringUtilities.indexOfFirstContainedCharacter(fieldName, " /-") !=-1){	     
			fieldName = "`"+fieldName+"`"; 
		}
		QWhereField field = new QWhereField(fieldName, val,op, concat,false);

		QWhereFieldList.add(field);
		return true;
	}
    
	/**
	 * To add where condition in a query.
	 * @param fieldName Field name for the condition.
	 * @param val       Value for the field to be compared.
	 * @return
	 */
	public boolean addWhereField(String fieldName, String val){

		if(StringUtilities.indexOfFirstContainedCharacter(fieldName, " /-") !=-1){	     
			fieldName = "`" + fieldName + "`"; 
		}
		QWhereField field = new QWhereField(fieldName, val, "=", "AND", false);

		QWhereFieldList.add(field);

		return true;
	}
    
	/**
	 * To add a sub query for condition in a query.
	 * @param fieldName Field name for the condition.
	 * @param val       Value for the field to be compared.
	 * @return
	 */
	public boolean addWhereSubquery(String fieldName, String subQuery){

		if(StringUtilities.indexOfFirstContainedCharacter(fieldName, " /-") !=-1){	     
			fieldName = "`" + fieldName + "`"; 
		}
		QWhereField field = new QWhereField(fieldName, subQuery,"=", "AND", true);

		QWhereFieldList.add(field);

		return true;
	}

	public boolean addJoinField(String leftFielield, String rightField, String op){

		if(StringUtilities.indexOfFirstContainedCharacter(leftFielield, " /-") !=-1){	     
			leftFielield = "`"+leftFielield+"`"; 
		}

		if(StringUtilities.indexOfFirstContainedCharacter(rightField, " /-") !=-1){	     
			rightField = "`"+rightField+"`"; 
		}

		QWhereField field = new QWhereField(leftFielield, rightField,op,"AND", false);

		QJoinFieldList.add(field);
		return true;
	}

	/**
	 * overloaded function To add to  join query, here default operator is '='.
	 * @param fieldName1 Left field
	 * @param fieldName2 Right field
	 * @return
	 */
	public boolean addJoinField(String leftField, String rightField){

		if(StringUtilities.indexOfFirstContainedCharacter(leftField, " /-") !=-1){	     
			leftField = "`" + leftField + "`"; 
		}
		QWhereField field = new QWhereField(leftField, rightField,"=","AND", false);

		QJoinFieldList.add(field);

		return true;
	}

	/**
	 * To get the insert query.
	 * @returns Insert query.
	 */
	public String getInsertQuery(){
		String sQuery = new String("INSERT INTO ");

		sQuery += QTableList.get(0)+" ( ";

		boolean bFlag = false;
		String sField = new String();


		Iterator<QField>qFieldListItr = QFieldList.iterator();	

		while(qFieldListItr.hasNext())
		{
			sField ="";
			QField field = qFieldListItr.next();        	
			if(bFlag)	
				sField +=",";
			sField += field.fieldName;			
			sQuery += sField;
			bFlag = true;
		}

		sQuery += ") VALUES(";
		bFlag = false;

		qFieldListItr = QFieldList.iterator();	

		while(qFieldListItr.hasNext())
		{
			sField ="";
			QField field = qFieldListItr.next();        	
			if(bFlag)	
				sField +=",";
			sField += field.value;
			sQuery += sField;
			bFlag = true;
		}

		sQuery += (")");
		return sQuery;
	}
    
	/**
	 * To get the select query.
	 * @returns select query.
	 */
	public String getSelectQuery(){
		String sQuery = new String("SELECT ");
		String sField;
		boolean bFlag = false;
		Iterator<QSelectField>qSelectFieldListItr = QSelectFieldList.iterator();
		while(qSelectFieldListItr.hasNext())
		{
			QSelectField selectField = qSelectFieldListItr.next();
			sField="";
			if(bFlag)
				sField +=  ", ";
			sField += selectField.fieldName;
			if(!selectField.alias.equals(""))
				sField += " AS "+selectField.alias;

			sQuery +=  sField;
			bFlag = true;

		}

		sQuery += " FROM ";
		bFlag = false;
		Iterator<String>qTableListItr = QTableList.iterator();		
		while(qTableListItr.hasNext())
		{
			String tableName  = qTableListItr.next();
			if(bFlag)
				sQuery +=  ", ";			
			sQuery +=  tableName;
			bFlag = true;
		}

		if(!QWhereFieldList.isEmpty() || (!QJoinFieldList.isEmpty()))
			sQuery += " WHERE ";

		bFlag = false;
		Iterator<QWhereField>qWhereFieldListItr = QWhereFieldList.iterator();		

		while(qWhereFieldListItr.hasNext())
		{
			QWhereField whereField  = qWhereFieldListItr.next();
			if(bFlag)
				sQuery +=  " " + whereField.concat + " ";
			sQuery+=  whereField.fieldName + " " + whereField.operand + " " + getWhereFieldLeftSeperatorChar(whereField.isSubQuery) 
			+ whereField.value + getWhereFieldRightSeperatorChar(whereField.isSubQuery);
			bFlag = true;
		}

		if(!QJoinFieldList.isEmpty() && !QWhereFieldList.isEmpty() )
			sQuery += " AND ";

		bFlag = false;
		Iterator<QWhereField>qJoinFieldListItr = QJoinFieldList.iterator();		
		while(qJoinFieldListItr.hasNext())
		{
			QWhereField joinField  = qJoinFieldListItr.next();
			if(bFlag)
				sQuery +=  " " + joinField.concat  + " ";
			sQuery+=  joinField.fieldName + " " + joinField.operand + joinField.value ;
			bFlag = true;
		}

		return sQuery;
	}

	/**
	 * To get the delete query.
	 * @returns Delete query as String.
	 */
	public String  getDeleteQuery() {

		String sQuery ="DELETE ";
		sQuery += " FROM ";
		boolean bFlag = false;
		Iterator<String>qTableListItr = QTableList.iterator();		
		while(qTableListItr.hasNext())
		{
			String tableName  = qTableListItr.next();
			if(bFlag)
				sQuery +=  ", ";			
			sQuery +=  tableName;
			bFlag = true;
		}

		if(!QWhereFieldList.isEmpty())
			sQuery += " WHERE ";

		bFlag = false;
		Iterator<QWhereField>qWhereFieldListItr = QWhereFieldList.iterator();		
		while(qWhereFieldListItr.hasNext())
		{
			QWhereField whereField  = qWhereFieldListItr.next();
			if(bFlag)
				sQuery +=  " " + whereField.concat + " ";
			sQuery+=  whereField.fieldName + " " + whereField.operand + " '" + whereField.value + "'";
			bFlag = true;
		}

		if(!QJoinFieldList.isEmpty())
			sQuery += " WHERE ";

		bFlag = false;
		Iterator<QWhereField>qJoinFieldListItr = QJoinFieldList.iterator();		
		while(qJoinFieldListItr.hasNext())
		{
			QWhereField joinField  = qJoinFieldListItr.next();
			if(bFlag)
				sQuery +=  " " + joinField.concat + " ";
			sQuery+=  joinField.fieldName + " " + joinField.operand + " '" + joinField.value + "'";
			bFlag = true;
		}

		return sQuery;
	}

	/**
	 * To clear the query generator .
	 * @returns
	 */
	public void clear(){
		QTableList.clear();
		QFieldList.clear();
		QSelectFieldList.clear();
		QWhereFieldList.clear();
		QJoinFieldList.clear();
	}

	protected String getWhereFieldLeftSeperatorChar(boolean isSubQuery ){
		return (isSubQuery ? "(" :"\"");
	}

	protected String getWhereFieldRightSeperatorChar(boolean isSubQuery ){
		return (isSubQuery ? ")" :"\"");
	}

	protected String getInsertValueLeftChar(boolean isWildChar ){
		return (isWildChar ? "\"" :"'");
	}

	protected String getInsertValueRightChar(boolean isWildChar ){
		return (isWildChar ? "\"" :"'");
	}

	protected class QField {
		public String fieldName = new String();
		public String value     = new String();
		public String dataType  = new String();

		public QField(){
			fieldName = "";
			value     = "";
			dataType  = "";
		}
		public QField(String fieldName, String value, String dataType){
			this.fieldName = fieldName;
			this.value     = value;
			this.dataType  = dataType;

		}
	};

	protected class QWhereField {
		public String fieldName      = new String();
		public String value          = new String();
		public String operand        = new String();
		public String concat         = new String();
		public boolean isSubQuery    = false;
		public QWhereField(){
			fieldName  = "";
			value      = "";
			operand    = "";
			concat     = "";
			isSubQuery = false;
		}
		public QWhereField(String fieldName, String value, String operand, String concat,boolean isSubQuery){
			this.fieldName  = fieldName;							
			this.value      = value;
			this.operand    = operand;
			this.concat     = concat;
			this.isSubQuery = isSubQuery;
		}
	};

	protected class QSelectField {
		public String fieldName = new String();		
		public String alias     = new String();

		public QSelectField(){
			fieldName = "";
			alias     = "";			
		}

		public QSelectField(String fieldName){
			this.fieldName = fieldName;
			alias     = "";			
		}

		public QSelectField(String fieldName, String alias){
			this.fieldName = fieldName;
			this.alias     = alias;

		}
	};

	private List<String> QTableList             = new ArrayList<String>();
	private List<QField> QFieldList             = new ArrayList<QField>();	
	private List<QSelectField> QSelectFieldList = new ArrayList<QSelectField>();
	private List<QWhereField> QWhereFieldList   = new ArrayList<QWhereField>();
	private List<QWhereField> QJoinFieldList    = new ArrayList<QWhereField>();

}

StringUtilities.java

package util;

import java.util.HashSet;
import java.util.Set;

public class StringUtilities
{
	/**
	 * Utility function to check a string contains a set of characters.
	 * @param str
	 * @param token
	 * @return
	 */
	public static int indexOfFirstContainedCharacter(String str, String token) {
		Set<Character> set = new HashSet<Character>();
		for (int i=0; i<token.length(); i++) {
			set.add(token.charAt(i)); // Build a constant-time lookup table.
		}
		for (int i=0; i<str.length(); i++) {
			if (set.contains(str.charAt(i))) {
				return i; // Found a character in s1 also in s2.
			}
		}
		return -1; // No matches.
	}
}

Here I will give an example using above utility class
Sample.java

public static void main(String[] args) {
  SqlQueryGenerator queryGenerator = new SqlQueryGenerator();
  queryGenerator.addTable("Credentials");
  queryGenerator.addField("uname", "sadique", "text");
  queryGenerator.addField("pwd", "abc", "text");
  String query = queryGenerator.getInsertQuery();
  System.out.println("Query generated is:"+query);
  
  queryGenerator.clear();
  queryGenerator.addTable("Credentials");
  queryGenerator.addSelectField("uname");
  queryGenerator.addSelectField("pwd");
  queryGenerator.addWhereField("uname", "user1");
  queryGenerator.addWhereField("pwd", "myPassword");
  query = queryGenerator.getSelectQuery();
  System.out.println("Query generated is:"+query);
}