使用 statement的子类 preparedStatement 来发送sql。preparedStatement 可以发送预编译的sql,并且sql还可以接受参数。我们上一次使用的statement对象,每次执行sql的时候都将sql发送给数据库,这样如果多次执行同一个sql的时候,效率会很低,如果使用 preparedStatement发送sql时 如果数据库支持预编译,可以对sql进行预编译,这样如果以后多次执行预编译的sql ,效率会快很多,preparedStatement 发送的sql 可以接收参数,这样可以防止sql 注入,这是很重要的功能。
<span style="white-space:pre"> </span>@Test
public void testJDBC(){
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/fade";
String userName = "root";
String password = "root";
String sql = "select * from t_user where id = ?";
Connection cn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//1.加载驱动
Class.forName(driver);
//2.建立连接
cn = DriverManager.getConnection(url, userName, password);
//3.拿取preparedStatement
ps = cn.prepareStatement(sql);
//4.发送参数
ps.setInt(1, 1);
//5.执行sql
rs = ps.executeQuery();
//6.遍历结果
while(rs.next()){
System.out.println(rs.getObject(1));
System.out.println(rs.getString(2));
System.out.println(rs.getString("user_name"));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
//6.关闭资源
try {
if(rs != null){
rs.close();
}
if(ps != null){
ps.close();
}
if(cn != null){
cn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
我们每次操作完毕之后,存放在java.sql.ResultSet 这个结果集里,可以是多行多列,这个结果集有数据行指针,初始位置在第一行数据前,没调用一次next()方法, 指针就向下移动一行,返回结果为true时,表示当前行有数据。拿取值得时候有两种,一种根据字段的下标来拿取,一种根据字段名来拿取,注:发送参数和遍历时 下标都是从1开始而不是0。如果我们知道字段的具体类型,可以直接get具体类型,也可以getObject(),这样效率会较低。