Gli apici vanno quotati, essendo dei caratteri speciali.
L'alternativa, più semplice e funzionale, è usare le PreparedStatement: non ti devi preoccupare di quotare o effettuare conversioni a stringa dei dati, in quanto questo viene lasciato al driver (che lo fa, probabilmente, in modo più efficiente).

Esempio. Supponiamo di avere una tabella composta da tre campi: un intero, una data e una stringa, in quest'ordine. Voglio inserire i seugenti valori nella tabella: il numero 15, la data di oggi, la stringa "L'albero di natale".

codice:
      // Ottengo la data odierna
      GregorianCalendar gc = new GregorianCalendar();
      java.sql.Date d = new java.sql.Date( gc.getTime() );

      // La mia stringa
      String str = "L'albero di natale";

      // Creo una PreparedStatement
      PreparedStatement pstmt = con.prepareStatement("INSERT INTO tabella VALUES(?,?,?)");

      // Dico che il primo parametro è il valore intero 15
      pstmt.setInt(1, 15);
      
      // Dico che il secondo parametro è la data odierna
      pstmt.setDate(2, d);

      // Dico che il terzo parametro è la stringa
      pstmt.setString(3, str);

      // Eseguo l'inserimento
      pstmt.executeUpdate();
Come vedi, non mi sono preoccupato di effettuare il quoting dell'apice durante l'inserimento nella query, né mi sono preoccupato di quale sia il formato di data accettato dal DB. Si arrangia il driver.


Ciao.