<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FDatabase_SQL_JDBC%2FSQL_Builder</id>
		<title>Java/Database SQL JDBC/SQL Builder - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FDatabase_SQL_JDBC%2FSQL_Builder"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Database_SQL_JDBC/SQL_Builder&amp;action=history"/>
		<updated>2026-04-21T12:06:11Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/Database_SQL_JDBC/SQL_Builder&amp;diff=6933&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Database_SQL_JDBC/SQL_Builder&amp;diff=6933&amp;oldid=prev"/>
				<updated>2010-06-01T06:34:13Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 06:34, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/Database_SQL_JDBC/SQL_Builder&amp;diff=6932&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Database_SQL_JDBC/SQL_Builder&amp;diff=6932&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:44Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Escape SQL ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * Static String formatting and query routines.&lt;br /&gt;
 * Copyright (C) 2001-2005 Stephen Ostermiller&lt;br /&gt;
 * http://ostermiller.org/contact.pl?regarding=Java+Utilities&lt;br /&gt;
 *&lt;br /&gt;
 * This program is free software; you can redistribute it and/or modify&lt;br /&gt;
 * it under the terms of the GNU General Public License as published by&lt;br /&gt;
 * the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
 * (at your option) any later version.&lt;br /&gt;
 *&lt;br /&gt;
 * This program is distributed in the hope that it will be useful,&lt;br /&gt;
 * but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;
 * GNU General Public License for more details.&lt;br /&gt;
 *&lt;br /&gt;
 * See COPYING.TXT for details.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
import java.util.HashMap;&lt;br /&gt;
import java.util.regex.Pattern;&lt;br /&gt;
/**&lt;br /&gt;
 * Utilities for String formatting, manipulation, and queries.&lt;br /&gt;
 * More information about this class is available from .&lt;br /&gt;
 *&lt;br /&gt;
 * @author Stephen Ostermiller http://ostermiller.org/contact.pl?regarding=Java+Utilities&lt;br /&gt;
 * @since ostermillerutils 1.00.00&lt;br /&gt;
 */&lt;br /&gt;
public class StringHelper {&lt;br /&gt;
  /**&lt;br /&gt;
   * Replaces characters that may be confused by an SQL&lt;br /&gt;
   * parser with their equivalent escape characters.&lt;br /&gt;
   * &amp;lt;p&amp;gt;&lt;br /&gt;
   * Any data that will be put in an SQL query should&lt;br /&gt;
   * be be escaped.  This is especially important for data&lt;br /&gt;
   * that comes from untrusted sources such as Internet users.&lt;br /&gt;
   * &amp;lt;p&amp;gt;&lt;br /&gt;
   * For example if you had the following SQL query:&amp;lt;br&amp;gt;&lt;br /&gt;
   * &amp;lt;code&amp;gt;&amp;quot;SELECT * FROM addresses WHERE name=&amp;quot;&amp;quot; + name + &amp;quot;&amp;quot; AND private=&amp;quot;N&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
   * Without this function a user could give &amp;lt;code&amp;gt;&amp;quot; OR 1=1 OR &amp;quot;&amp;quot;=&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
   * as their name causing the query to be:&amp;lt;br&amp;gt;&lt;br /&gt;
   * &amp;lt;code&amp;gt;&amp;quot;SELECT * FROM addresses WHERE name=&amp;quot;&amp;quot; OR 1=1 OR &amp;quot;&amp;quot;=&amp;quot;&amp;quot; AND private=&amp;quot;N&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
   * which will give all addresses, including private ones.&amp;lt;br&amp;gt;&lt;br /&gt;
   * Correct usage would be:&amp;lt;br&amp;gt;&lt;br /&gt;
   * &amp;lt;code&amp;gt;&amp;quot;SELECT * FROM addresses WHERE name=&amp;quot;&amp;quot; + StringHelper.escapeSQL(name) + &amp;quot;&amp;quot; AND private=&amp;quot;N&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
   * &amp;lt;p&amp;gt;&lt;br /&gt;
   * Another way to avoid this problem is to use a PreparedStatement&lt;br /&gt;
   * with appropriate placeholders.&lt;br /&gt;
   *&lt;br /&gt;
   * @param s String to be escaped&lt;br /&gt;
   * @return escaped String&lt;br /&gt;
   * @throws NullPointerException if s is null.&lt;br /&gt;
   *&lt;br /&gt;
   * @since ostermillerutils 1.00.00&lt;br /&gt;
   */&lt;br /&gt;
  public static String escapeSQL(String s){&lt;br /&gt;
    int length = s.length();&lt;br /&gt;
    int newLength = length;&lt;br /&gt;
    // first check for characters that might&lt;br /&gt;
    // be dangerous and calculate a length&lt;br /&gt;
    // of the string that has escapes.&lt;br /&gt;
    for (int i=0; i&amp;lt;length; i++){&lt;br /&gt;
      char c = s.charAt(i);&lt;br /&gt;
      switch(c){&lt;br /&gt;
        case &amp;quot;\\&amp;quot;:&lt;br /&gt;
        case &amp;quot;\&amp;quot;&amp;quot;:&lt;br /&gt;
        case &amp;quot;\&amp;quot;&amp;quot;:&lt;br /&gt;
        case &amp;quot;\0&amp;quot;:{&lt;br /&gt;
          newLength += 1;&lt;br /&gt;
        } break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    if (length == newLength){&lt;br /&gt;
      // nothing to escape in the string&lt;br /&gt;
      return s;&lt;br /&gt;
    }&lt;br /&gt;
    StringBuffer sb = new StringBuffer(newLength);&lt;br /&gt;
    for (int i=0; i&amp;lt;length; i++){&lt;br /&gt;
      char c = s.charAt(i);&lt;br /&gt;
      switch(c){&lt;br /&gt;
        case &amp;quot;\\&amp;quot;:{&lt;br /&gt;
          sb.append(&amp;quot;\\\\&amp;quot;);&lt;br /&gt;
        } break;&lt;br /&gt;
        case &amp;quot;\&amp;quot;&amp;quot;:{&lt;br /&gt;
          sb.append(&amp;quot;\\\&amp;quot;&amp;quot;);&lt;br /&gt;
        } break;&lt;br /&gt;
        case &amp;quot;\&amp;quot;&amp;quot;:{&lt;br /&gt;
          sb.append(&amp;quot;\\\&amp;quot;&amp;quot;);&lt;br /&gt;
        } break;&lt;br /&gt;
        case &amp;quot;\0&amp;quot;:{&lt;br /&gt;
          sb.append(&amp;quot;\\0&amp;quot;);&lt;br /&gt;
        } break;&lt;br /&gt;
        default: {&lt;br /&gt;
          sb.append(c);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return sb.toString();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SQL Builder ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
import java.util.HashMap;&lt;br /&gt;
import java.util.Iterator;&lt;br /&gt;
import java.util.Map;&lt;br /&gt;
public class BuilderMain {&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    InsertBuilder builder = new InsertBuilder();&lt;br /&gt;
    builder.setTable(&amp;quot;employees&amp;quot;);&lt;br /&gt;
    builder.addColumnAndData(&amp;quot;employee_id&amp;quot;, new Integer(221));&lt;br /&gt;
    builder.addColumnAndData(&amp;quot;first_name&amp;quot;, &amp;quot;&amp;quot;Shane&amp;quot;&amp;quot;);&lt;br /&gt;
    builder.addColumnAndData(&amp;quot;last_name&amp;quot;, &amp;quot;&amp;quot;Grinnell&amp;quot;&amp;quot;);&lt;br /&gt;
    builder.addColumnAndData(&amp;quot;email&amp;quot;, &amp;quot;&amp;quot;al@yahoo.ru&amp;quot;&amp;quot;);&lt;br /&gt;
    String sql = SQLDirector.buildSQL(builder);&lt;br /&gt;
    System.out.println(sql);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class SQLDirector {&lt;br /&gt;
  public static String buildSQL(SQLBuilder builder) {&lt;br /&gt;
    StringBuffer buffer = new StringBuffer();&lt;br /&gt;
    buffer.append(builder.getCommand());&lt;br /&gt;
    buffer.append(builder.getTable());&lt;br /&gt;
    buffer.append(builder.getWhat());&lt;br /&gt;
    buffer.append(builder.getCriteria());&lt;br /&gt;
    return buffer.toString();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
abstract class SQLBuilder {&lt;br /&gt;
  /**&lt;br /&gt;
   * Gets the command attribute of the SQLBuilder object&lt;br /&gt;
   * &lt;br /&gt;
   * @return The command value or what type of Builder this is. This will return&lt;br /&gt;
   *         a SQL command.&lt;br /&gt;
   * @since&lt;br /&gt;
   */&lt;br /&gt;
  public abstract String getCommand();&lt;br /&gt;
  /**&lt;br /&gt;
   * Gets the table attribute of the SQLBuilder object&lt;br /&gt;
   * &lt;br /&gt;
   * @return The table name value&lt;br /&gt;
   * @since&lt;br /&gt;
   */&lt;br /&gt;
  public abstract String getTable();&lt;br /&gt;
  /**&lt;br /&gt;
   * Gets the what value of the SQLBuilder object. This attribute will differ&lt;br /&gt;
   * based on what type of object we are using. This could be a list of columns&lt;br /&gt;
   * and data.&lt;br /&gt;
   * &lt;br /&gt;
   * @return The what value&lt;br /&gt;
   * @since&lt;br /&gt;
   */&lt;br /&gt;
  public abstract String getWhat();&lt;br /&gt;
  /**&lt;br /&gt;
   * Gets the criteria attribute of the SQLBuilder object&lt;br /&gt;
   * &lt;br /&gt;
   * @return The criteria value&lt;br /&gt;
   * @since&lt;br /&gt;
   */&lt;br /&gt;
  public abstract String getCriteria();&lt;br /&gt;
}&lt;br /&gt;
class InsertBuilder extends SQLBuilder {&lt;br /&gt;
  private String table;&lt;br /&gt;
  private Map columnsAndData = new HashMap();&lt;br /&gt;
  private String criteria;&lt;br /&gt;
  /**&lt;br /&gt;
   * Sets the table attribute of the InsertBuilder object&lt;br /&gt;
   * &lt;br /&gt;
   * @param table&lt;br /&gt;
   *          The new table value&lt;br /&gt;
   * @since&lt;br /&gt;
   */&lt;br /&gt;
  public void setTable(String table) {&lt;br /&gt;
    this.table = table;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Gets the command attribute of the InsertBuilder object&lt;br /&gt;
   * &lt;br /&gt;
   * @return The command value&lt;br /&gt;
   * @since&lt;br /&gt;
   */&lt;br /&gt;
  public String getCommand() {&lt;br /&gt;
    return &amp;quot;INSERT INTO &amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Gets the table attribute of the InsertBuilder object&lt;br /&gt;
   * &lt;br /&gt;
   * @return The table value&lt;br /&gt;
   * @since&lt;br /&gt;
   */&lt;br /&gt;
  public String getTable() {&lt;br /&gt;
    return table;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Gets the what attribute of the InsertBuilder object&lt;br /&gt;
   * &lt;br /&gt;
   * @return The what value&lt;br /&gt;
   * @since&lt;br /&gt;
   */&lt;br /&gt;
  public String getWhat() {&lt;br /&gt;
    StringBuffer columns = new StringBuffer();&lt;br /&gt;
    StringBuffer values = new StringBuffer();&lt;br /&gt;
    StringBuffer what = new StringBuffer();&lt;br /&gt;
    String columnName = null;&lt;br /&gt;
    Iterator iter = columnsAndData.keySet().iterator();&lt;br /&gt;
    while (iter.hasNext()) {&lt;br /&gt;
      columnName = (String) iter.next();&lt;br /&gt;
      columns.append(columnName);&lt;br /&gt;
      values.append(columnsAndData.get(columnName));&lt;br /&gt;
      if (iter.hasNext()) {&lt;br /&gt;
        columns.append(&amp;quot;,&amp;quot;);&lt;br /&gt;
        values.append(&amp;quot;,&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    what.append(&amp;quot; (&amp;quot;);&lt;br /&gt;
    what.append(columns);&lt;br /&gt;
    what.append(&amp;quot;) VALUES (&amp;quot;);&lt;br /&gt;
    what.append(values);&lt;br /&gt;
    what.append(&amp;quot;) &amp;quot;);&lt;br /&gt;
    return what.toString();&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Gets the criteria attribute of the InsertBuilder object&lt;br /&gt;
   * &lt;br /&gt;
   * @return The criteria value&lt;br /&gt;
   * @since&lt;br /&gt;
   */&lt;br /&gt;
  public String getCriteria() {&lt;br /&gt;
    return &amp;quot;&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Adds a feature to the ColumnAndData attribute of the InsertBuilder object&lt;br /&gt;
   * &lt;br /&gt;
   * @param columnName&lt;br /&gt;
   *          The feature to be added to the ColumnAndData attribute&lt;br /&gt;
   * @param value&lt;br /&gt;
   *          The feature to be added to the ColumnAndData attribute&lt;br /&gt;
   * @since&lt;br /&gt;
   */&lt;br /&gt;
  public void addColumnAndData(String columnName, Object value) {&lt;br /&gt;
    if (value != null) {&lt;br /&gt;
      columnsAndData.put(columnName, value);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>