2017-10-18 13 views
1

Je veux créer quelque chose comme gestionnaire de tâches, en utilisant Java. J'ai décidé d'utiliser PostgreSQL pour sauvegarder mes tâches. En ce moment, je veux sauver mes tâches créées à PostgreSQL, pour cela, je l'ai code suivant:Insérer des valeurs dans postgresql en utilisant JDBC

package TaskMgr; 

import java.time.LocalDate; 
import java.time.format.DateTimeFormatter; 
import java.time.format.DateTimeFormatterBuilder; 
import java.util.Locale; 
public class Task { 

private String title; 
private String description; 
private LocalDate dateFormat; 


public Task(String title, String description, String date) { 
    this.title = title; 
    this.description = description; 
    this.dateFormat = setDate(date); 
} 


public LocalDate setDate(String inputDate) { 
    DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
      .parseCaseInsensitive() 
      .appendPattern("yyyy-MM-d") 
      .toFormatter(Locale.ENGLISH); 
    formatter = formatter.withLocale(Locale.ENGLISH); 
    LocalDate outputDate = LocalDate.parse(inputDate, formatter); 
    return outputDate; 

} 

public String getTitle() { 
    return title; 
} 

public String getDescription() { 
    return description; 
} 


public LocalDate getDateFormat() { 
    return dateFormat; 
} 

public static void main(String[] args) { 

} 


} 

Et mon code pour la base de données: (base de données avec des tâches de table a déjà été créé, avec des champs: title de type texte, description du type texte et date du type date). Voici le code de la classe de base de données:

package TaskMgr; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.time.LocalDate; 
import java.time.Month; 

public class Database { 

private final String url = "jdbc:postgresql://localhost/tasksdb"; 
private final String user = "postgres"; 
private final String password = "31415926"; 

public Connection connect() { 
    Connection conn = null; 
    try { 
     conn = DriverManager.getConnection(url, user, password); 
     System.out.println("Connected to the PostgreSQL server successfully."); 

    } catch (SQLException e) { 
     System.out.println(e.getMessage()); 
    } 

    return conn; 
} 

public void createItem(int idCur, String title, String description, LocalDate date) { 
    try { 
     Statement stmnt = null; 
     stmnt = connect().createStatement(); 
     String sql = "INSERT INTO TASKS (ID,TITLE,DESCRIPTION,DATE) " 
       + "VALUES " + "(" + idCur + ", " + title + ", " + description + ", " + date + ")"; 
     stmnt.executeUpdate(sql); 

    } catch (SQLException e) { 
     System.out.println(e.getMessage()); 
    } 

} 

public static void main(String[] args) { 
    Database database = new Database(); 
    database.connect(); 
    Task task = new Task("'Test2'", "'Test2 description'", "1998-01-07"); 
    database.createItem(2, task.getTitle(), task.getDescription(), task.getDateFormat()); 

} 

}

Mais Intellij jette l'erreur suivante:

ERROR: column "date" is of type date but expression is of type integer 
TIP: You will need to rewrite or cast the expression. 

J'ai essayé de google cette erreur, mais rien aidé. Que dois-je faire avec ma date?

+4

Vous devez utiliser un 'PreparedStatement'. – Kayaman

Répondre

1

Vous devriez utiliser des instructions préparées ici, ce qui résoudrait le problème de ne pas savoir quel format exact utiliser lors de la construction de votre requête.

PreparedStatement st = conn.prepareStatement("INSERT INTO TASKS (ID, TITLE, DESCRIPTION, DATE) VALUES (?, ?, ?, ?)"); 
st.setInt(1, idCur); 
st.setString(2, title); 
st.setString(3, description); 
st.setObject(4, date); 
st.executeUpdate(); 
st.close(); 

déclarations préparées prennent soin de faire en sorte que la déclaration INSERT utilisera littéraux la date et l'horodatage dans un format correct pour votre base de données Postgres. Au-delà, les instructions préparées protègent également votre code contre les attaques par injection SQL. Voici un lien vers la documentation couvrant Postgres pilote JDBC:

https://jdbc.postgresql.org/documentation/head/

+0

Cela a très bien fonctionné! Je vous remercie. Oui, le problème était dans Statement. – Aldres