The best place to answer this sort of question are the
JavaDocs.
To paraphrase what you will find there, Statements are used to execute adhoc SQL, PreparedStatements represent precompiles SQL and include parameter binding.
When to use either of these?
Statements: almost never. They are useful when you are running user generated SQL i.e. if you are writing a SQL client, or when you are runnign SQL that has no user input.
PreparedStatements: most of the time.