Porque ambas clases estaban presentes en su classpath en tiempo de compilación y su IDE intentaba ser útil.
Porque prepareStatement()
es especificado
para devolver java.sql.PreparedStatement
, no com.mysql.jdbc.PreparedStatement
.
java.sql.PreparedStatement
es una interfaz y deberías estar usando esto todo el tiempo. El de MySQL es una implementación concreta y no debe acoplar estrechamente su código JDBC a la implementación específica de MySQL. De lo contrario, tendría que hacer muchos cambios en su código si alguna vez desea cambiar el servidor DB (y, por lo tanto, también el controlador JDBC) a un proveedor diferente como PostgreSQL. Si está utilizando las interfaces JDBC estándar de java.sql
paquete todo el tiempo, todo lo que necesitaría cambiar es solo la URL de JDBC y tal vez también el nombre de usuario y la contraseña y algunas declaraciones SQL específicas de la base de datos.