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.