首先声明,java新手,最近新学的jdbc,感觉细节众多,琐碎每次忘记都需要去查,就自己写篇写点东西用来记录一下,方便自己查阅,也有在网上引经据典的内容,如有侵权,烦请联系,立刻删除,小小新手,如有错误敢情看官不吝斧正。
1.关于Statement与PreparedStatement的比较
Statement:(1)产生方式:Connection.createStatement()(2)增删改 executeUpdate()(3)查询 executeQuery()(4)一般将SQL语句放在executeUpdate()中
代码示例:
Class.forName(driver);
//与数据库建立连接
conn= DriverManager.getConnection(url,username,password);
//发送SQL语句
statement=conn.createStatement();
//插入数据
String sql="insert into user(username,password) values('114','1234')";
//修改数据
//String sql="update user set password='1232' where id=2"
//删除数据
//String sql= "delete from user where id=2";
//sql语句结果,一般进行 增删改 的SQL语句用excuteUpdate
int count=statement.executeUpdate(sql);
if(count>0){
System.out.println("操作成功");
}else{
System.out.println("操作失败");
}
PreparedStatement:(1)产生方式:Connection.prepareStatement()(2)增删改 executeUpdate()(3)查询 executeQuery()(4)一系列SetXXX方法(5)将SQL放在Connection.PrepareStatement(SQL)(6)需要预编译
代码示例:
public List<Student> findAll() {
List<Student> students = new ArrayList<>();
Student stu = new Student();
Connection conn = null;
PreparedStatement pstm = null;
ResultSet rs = null;
conn = JDBCUtils.getConnection();
String sql = "select student_id, student_name, sex, class_id from t_student";
try {
pstm = conn.prepareStatement(sql);
rs = pstm.executeQuery();
while(rs.next()){
// stu.setStudentId(rs.getString("student_id"));
// stu.setStudentName(rs.getString("student_name"));
// stu.setSex(rs.getString("sex"));
// stu.setClassId(rs.getString("class_id"));
String studentId = rs.getString("student_id");
String studentName = rs.getString("student_name");
String Sex = rs.getString("sex");
String classId = rs.getString("class_id");
students.add(new Student(studentId,studentName,Sex,classId));
//students.add(stu);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return students;
}
查看PreparedStatement的源码 ,可知PreparedStatement继承Statement,Statement里有的方法PreparedStatement都有,但是PreparedStatement还有很多SetXXX方法
三、PreparedStatement较Statement的优势
(1)编码更加简洁灵活:在PreparedStatement中SQL语句后的查询条件,插入的值可以用占位符(?)来表示,不用像Statement一样写具体的值,只需要调用PreparedStatement中的SetXXX方法赋值即可。
(2)提高性能:如果要执行一条SQL语句100回,Statement需要connection,createStatement(sql)语句编译SQL100次,PreparedStatemnet只需要编译SQL语句一回(即connection.PreparedStatement(sql)),重复执行100次preparedStatement.executeQuery();减少编译SQL次数,提高性能。
(3)安全性高,可以有效防止SQL注入的风险:Statement存在SQL注入的风险,PreparedStatement可以防止SQL注入的风险。
2.关于ResultSet的具体细节
哈哈哈,这个问题有点复杂,可以参照
ResultSet 状态详解_jackyechina的专栏-CSDN博客
ResultSet用法集锦_小菜鸟的博客-CSDN博客_python resultset
感谢博主大大!!!