JDBCSinkFunction is a simple wrapper around the JDBCOutputFormat (the DataSet / Batch API output interface).
Dominik is right, that JDBCSinkFunction does not support exactly-once output.
It is not strictly required that an exactly-once sink implements TwoPhaseCommitFunction.
TPCF is a convenience interface that internally use the CheckpointListener interface. It makes it easier to implement exactly-once sinks but is not the only way to do it.
Implementing an exactly-once JDBC sink by extending TwoPhaseCommitFunction would require to be able to recover (and commit) an open transaction after a task was restarted.
Not sure if the JDBC interface supports this.