打通后端-JDBC教程(二)-Statement和PreparedStatement的区别

Statement和PreparedStatement的区别

概述

1.基于效率和安全性两个方面,再实际开发中,我们一般使用PreparedStatement来替换普通的Statement
2.有些特殊只能使用Statement

PreparedStatement基本用法

1.PrepareStatement支持sql语句问号占位
2.PreparedStatement本质上也是一个"车",多了一个预编译的功能即当创建PreparedStatement对象时立即把SQL语句发送到数据库编译储存

//查询数据
String sql="select * from student limit ?,?";
PreparedStatement pst = con.prepareStatement(sql);
pst.setInt(1,1);//从第二条记录开始查询
pst.setInt(2,5);//最大显示5条记录



//添加数据
String sql="insert into student(name,age,birth,schid) values(?,?,?,?)";
PreparedStatement pst = con.prepareStatement(insert);
//给参数赋值
pst.setString(1,name);
pst.setInt(2,age);
pst.setDate(3,birth);
pst.setInt(4,schid);
pst.executeUpdate();

两者比较

1.效率:PrepareStatement比Statement高,因为前者存在预编译,sql语句已经在数据库里等着了,但是这个差别往往还体现在驱动里,mysql体现不明显,差别比较大的是Oracle
2.安全性:PreparedStatement可以防止SQL注入问题

结论:推荐使用PrepareStatement 但是有些情况只能使用Statement

-例1:
表名也是?占位
select * from ?
如果传入一个stu则默认匹配字符串 则会生成 select * from ‘stu’,这是错误的.
-例2:
模糊查询中不能使用 ?
select * from student
where name like ‘%?%’ 这种情况?表示?而不是占位符,所以这种时候这能用Statement
-例3:
order by后边用?
select * from XXX where xx order by ?
如果传入?我们传入name 则自动会匹配成 “name"这句话就变成了 select * from XXX where XX order by “name”,而我们不需要这个”",所以这种情况我们也只能使用Statement

总结

自己写JDBC连接的话(当然这种情况现在很少了),能用PreparedStatement就不用Statement,说的有错误希望大家指正

猜你喜欢

转载自blog.csdn.net/t_t2_3/article/details/113173104