SQL注入问题及PreparedStatement使用优点

SQL注入问题及PreparedStatement使用优点


SQL注入问题,对于如下语句
SELECT id,name,birthday FROM student WHERE NAME=’ 张三 ‘;
本意是查找名字为张三的学生,传递的参数因为名字 张三
如果我传递参数为 ’ OR 1 OR ‘,那么SQL语句为
SELECT id,NAME,birthday FROM student WHERE NAME=’’ OR 1 OR ‘’;
你会发现该语句可以执行成功并且查询出了student表中所有的记录
显然是不合理的,称之为SQL注入的一种,这是Statement会出现的一个问题。
推荐使用PreparedStatement的原因如下
1.预编译,?代替参数,检查参数是否合法,不合法不让通过,可防止SQL注入。
2.Statement会使数据库频繁编译SQL语句,造成数据库缓冲区溢出,效率低下。
3.数据库和驱动会对PreparedStatement进行优化(数据库连接一直存在的情况下)

PreparedStatement ps 这是一个接口,继承自接口Statement st
st的使用
Statement st = conn.createStatement();
st.executeQuery(sql语句);
ps的使用
PreparedStatement ps = conn.preparedStatement(sql语句);//sql语句写在这里
设置sql中?位置的参数
ps.executeQuery();//注意这里这个方法中是没有参数的,调用的是预编译ps中的方法,可以防止很多问题和提高效率
//如果这里ps.executeQuery(sql语句);,那就是调用它的父接口里的方法,效果就和st执行的方法一样了,运行报错,?不能通过编译。

java.sql.Date 是java.util.Date类的子类,两者之间的转换
定义两个对象
java.sql.Date sd;
java.util.Date ud;
父类转成子类
sd = new java.sql.Date(ud.getTime());
子类转成父类
方式一:ud = sd;//父类接受子类,编译时表现为父类性质,运行时表现为子类性质
方式二:ud = new java.util.Date(sd.getTime());//转换成父类,只表现为父类性质

打印ud ,发现以上两种方式打印结果格式不一样,因为java.sql.Date 重写了String方法,对输出格式重新定义了

说明
连接数据库执行SQL语句返回结果这整个过程中,连接数据库花费的时间是最多的,建立数据库的连接底层是基于TCP/IP协议。时间较长。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值