PreparedStatement学习笔记

来源:互联网 发布:mac安装win10不保留ox 编辑:程序博客网 时间:2024/06/04 18:52

之前一直用statement开发,statement对象作为将SQL语句发送到数据库的工具,非常的好用,我一般都是定义一个DBManager,先封装了statement对象的创建,和返回结果集的函数:

 

public Statement getStatement() {Connection connection = null;Statement stmt = null;try {Class.forName("com.mysql.jdbc.Driver");//Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/pinshan?useUnicode=true&characterEncoding=utf8&useSSL=true", "root", "root")connection = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/data?useUnicode=true&characterEncoding=utf8&useSSL=true", "root", "root");stmt = connection.createStatement();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return stmt;}

public ResultSet query(String sql) {ResultSet rst = null;Statement stmt = getStatement();System.out.println("stmt = " + stmt);try {rst = stmt.executeQuery(sql);} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return rst;}

 

这两天看书,书上强烈的介绍了preparedstatement,主要有三个好处:

1、预编译SQL语句,性能更好。

2、无须拼接SQL语句,不麻烦,不易出错,有利于编程和后期维护。

3、可以防止sql注入,安全性更好。

 

简直直击我心!!!

我总是担心sql注入,怕谁给我把用户信息删了,或者黑我服务器什么的。前端的监控能力是有限的,sql注入难以幸免。 所以有了这个preparedstament,我是无论何如要试试看的。

 

首先是把DBManager的方法换了:

这里注意要返回一个PreparedStatement类型。

 

public PreparedStatement getPreStatement(String sql) {Connection connection = null;  PreparedStatement ps=null; try {Class.forName("com.mysql.jdbc.Driver");connection = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/data?useUnicode=true&characterEncoding=utf8&useSSL=true", "root", "root");ps=connection.prepareStatement(sql);} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return ps;}

然后就是把之前的拼接字段全部改成“?”占位符,然后调用PreparedStatement的方法去填充它。 这里不满意的是,居然不能一起填充了,要位置和内容一一对应,一个一个填充。开始我少填了一个,编译直接报错了,我觉得不错还挺好的,之前用statement开发,因为少写了 , 或者是 )编译不报错,测试的时候才出错,这其实是不好的。

 

String sqls = "update pinshan.goto shan SET shan=? where username=?" ;preparedStatement=db.getPreStatement(sqls);preparedStatement.setString(1,shan);preparedStatement.setString(2,username);preparedStatement.execute();

最后就是这个错:

 

Exception in thread "main" java.sql.SQLException:Can not issue data manipulation statements with executeQuery().

    atcom.mysql.jdbc.SQLError.createSQLException(SQLError.java:964)

    atcom.mysql.jdbc.SQLError.createSQLException(SQLError.java:897)

    atcom.mysql.jdbc.SQLError.createSQLException(SQLError.java:886)

    atcom.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)

    atcom.mysql.jdbc.StatementImpl.checkForDml(StatementImpl.java:463)

    atcom.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1926)

这是preparedStatement.execute();preparedStatement.executeQuery(sql);的用法没有搞清楚的关系。

一句话,execute()的返回值是布尔类型,就是返回正确执行了没有,而executeQuery是返回查询的结果集的,需要赋给左边的结果集。

ResultSet rst=preparedStatement.executeQuery(sql);


1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电车钥匙丢了怎么办 电车钥匙拧不动怎么办 汽车ecu初始化失败怎么办 汽车轻微的抖动怎么办 面包车电脑板紊乱怎么办 车子变速箱坏了怎么办 摩托车怠速不稳怎么办 汽车启动转数高怎么办 鬼火摩托车没力怎么办 摩托车油漆掉了怎么办 发动机怠速不稳怎么办 信用综合评分不足怎么办 综合评分不足是怎么办 综合信用分不足怎么办 iptv突然无信号怎么办 排气系统故障灯亮怎么办 空调冷凝器坏了怎么办 水温空调不制冷怎么办 用冷风机屋里潮怎么办 空调制热不出水怎么办 空调水管堵了怎么办 空调制冷不出水怎么办 空调出风口漏水怎么办 空调管漏水厉害怎么办 电动车车速变慢怎么办 遥控器按钮掉了怎么办 苹果6屏幕凸起怎么办 三星笔记本开机黑屏怎么办 笔记本电脑开机黑屏怎么办三星 笔记本电脑黑屏怎么办灯是亮得 九代雅阁收音机信号不好怎么办 九代雅阁电瓶亏电怎么办 17款雅阁混动汽车胎压灯怎么办 空调制冷出热风怎么办 轿车方向机漏油怎么办 车钥匙感应不灵怎么办 汽车助力泵漏油怎么办 奔腾b70油耗高怎么办 方向机漏油了怎么办 威志油耗高怎么办 佳美2.4油耗大怎么办