MySQL NOW() equivalent in Java for prepared statements

If you are used to MySQL then you probably know the MySQL function NOW() which inserts the current date and time in a MySQL query. But if you use JDBC and prepared statements, then you can reconstruct this function with a GregorianCalendar (which is the successor of Date):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void insertArticle(Article article) throws SQLException
{
  //query = "INSERT INTO articles(title,content,date) VALUES (?,?,NOW())";
  query = "INSERT INTO articles(title,content,date) VALUES (?,?,?)";
 
  statement = connection.prepareStatement(query);
 
  statement.setString(1, article.getTitle());
  statement.setString(2, article.getContent());
  statement.setTimestamp(3, new Timestamp(new GregorianCalendar().getTimeInMillis()));
 
  logger.info(statement);
  statement.executeUpdate();
}

SQL-Statements als Prepared Statements

Ein PreparedStatement besteht ist ein SQL-Statement mit Platzhaltern. Das Besondere daran ist, dass das Statement überprüft wird, bevor die Platzhalter gesetzt werden. Dadurch werden SQL-Injections verhindert. Eine SQL-Injection basiert darauf, dass ein „normales“ SQL-Statement verlängert wird. Zum Beispiel um ein „; DROP TABLE“. Durch das „;“ wird an das eigentliche SQL-Statement ein zweites Statement (nämlich DROP-Table) angehangen. Dadurch werden zwei SQL-Statements ausgeführt, was aber nicht im Sinne des Betreibers ist. Mit Prepared Statements kann dies nicht passieren, da hier das „;“ durch die vorherige Überprüfung schon missbilligt wird.

Beispiel für ein PreparedStatement:

repository.JdbcConnection

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
    public void findById(int nummer)
    {
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sqlStr = "SELECT * FROM cd WHERE id=?";
        LinkedList<cd_VO> voList = new LinkedList<cd_VO>();
        CD_VO vo;
 
        try
        {
            con = getConnection();
            ps = con.prepareStatement(sqlStr);
            ps.setInt(1, nummer);
            rs = ps.executeQuery();
 
            while(rs.next())
            {
                vo = new CD_VO();
                vo.setId( rs.getInt("id") );
                vo.setInterpret( rs.getString("interpret") );
                vo.setTitel( rs.getString("titel") );
                vo.setVeroeffentlichung( rs.getDate("veroeffentlichung") );
                vo.setCoverDatei( rs.getString("coverdatei") );
                voList.add(vo);
                // Testausgabe:
                System.out.println( vo.getId() );
                System.out.println( vo.getInterpret() );
                System.out.println( vo.getTitel() );
                System.out.println( vo.getVeroeffentlichung() );
                System.out.println( vo.getCoverDatei() );
            }
        }
        catch(SQLException sqlex)
        {
            sqlex.printStackTrace();
        }
        finally
        {
            try
            {
                if( ps != null )    ps.close();
                if( con != null )   con.close();
            }
            catch(SQLException excSQL)
            {
                System.out.println("Fehler beim Abbau der SQL-Verbindung:");
                excSQL.printStackTrace();
            }
        }
    }