import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* jdbc操作分为9步
* @author hadoop
* <p>
* 说明:java提供了一套操作数据库的接口 具体实现由数据库厂商提供
* 开发人员不用关注开发商的具体实现 只需要将具体数据库的驱动加载注册即可
* </p>
*/
public class JDBCReview {
public static void main(String[] args) {
//0:声明jdbc相关变量
Connection connection =null; //sql
PreparedStatement preparedStatement = null;//sql
ResultSet resultSet = null; //sql
try {
//1:加载驱动并注册驱动到DriverManager
Class.forName("com.mysql.jdbc.Driver");
/*
* java中class.forName()和classLoader都可用来对类进行加载。
class.forName()前者除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。
classLoader只是是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。
forName(name, initialize, loader)带参函数也可控制是否加载static块。同理,只有newInstatnce时才会执行static块。
Class.forName(”com.mysql.jdbc.Driver“) 之所以说是 加载并注册 Driver ,是因为在mysql的实现类中将java接口进行 ”绑定“。
static {
try {
java.sql.DriverManager.registerDriver(new Driver()); //1
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
*/
//2:获取连接
connection=DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8",
"root",
"root");
//3:准备sql(防注入)
String sql = "select * from user where id = ?";
//4:生成预处理的准备对象 (方法名和返回对象的名称)
preparedStatement = connection.prepareStatement(sql);
//5:设置参数 parameterIndex the first parameter is 1, the second is 2
preparedStatement.setInt(1, 10);
//6:执行操作,接收结果
resultSet=preparedStatement.executeQuery();
//7:处理结果 Before start of resultset
while(resultSet.next()) {
// resultSetIndex the first is 1, the second is 2
System.out.println(resultSet.getInt(1)+" "+resultSet.getString(2));
System.out.println(resultSet.getDate(3)+" "+resultSet.getString(4));
System.out.println(resultSet.getString(5));
//根据字段名称
System.out.println(resultSet.getInt("id")+" "+resultSet.getString("username"));
System.out.println(resultSet.getDate("birthday")+" "+resultSet.getString("sex"));
System.out.println(resultSet.getString("address"));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
//TODO 8:从低到高关闭资源流 先关闭connection 会出现什么样的问题?
try {
//关闭顺序不对可能存在空指针异常
resultSet.close();
preparedStatement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}