博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
20160408javaweb之JDBC ---PreparedStatement
阅读量:6993 次
发布时间:2019-06-27

本文共 3849 字,大约阅读时间需要 12 分钟。

PreparedStatement

1.Sql注入:由于jdbc程序在执行的过程中sql语句在拼装时使用了由页面传入参数,如果用户恶意传入一些sql中的特殊关键字,会导致sql语句意义发生变化,这种攻击方式就叫做sql注入,参考用户注册登录案例。
2.PreparedStatement是Statement的孩子,不同的是,PreparedStatement使用预编译机制,在创建PreparedStatement对象时就需要将sql语句传入,传入的过程中参数要用?替代,这个过程回导致传入的sql被进行预编译,然后再调用PreparedStatement的setXXX将参数设置上去,由于sql语句已经经过了预编译,再传入特殊值也不会起作用了。
3.PreparedStatement使用了预编译机制,sql语句在执行的过程中效率比Statement要高。

 

 

SQL注入攻击:
由于dao中执行的SQL语句是拼接出来的,其中有一部分内容是由用户从客户端传入,所以当用户传入的数据中包含sql关键字时,就有可能通过这些关键字改变sql语句的语义,从而执行一些特殊的操作,这样的攻击方式就叫做sql注入攻击
PreparedStatement利用预编译的机制将sql语句的主干和参数分别传输给数据库服务器,从而使数据库分辨的出哪些是sql语句的主干哪些是参数,这样一来即使参数中带了sql的关键字,数据库服务器也仅仅将他当作参数值使用,关键字不会起作用,从而从原理上防止了sql注入的问题

PreparedStatement主要有如下的三个优点:

~1.可以防止sql注入
~2.由于使用了预编译机制,执行的效率要高于Statement
~3.sql语句使用?形式替代参数,然后再用方法设置?的值,比起拼接字符串,代码更加优雅.

 

示例代码:

 

package com.dzq.dao;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import com.dzq.domian.User;import com.dzq.util.JDBCUtils;public class MySqlUserDao2  implements UserDao{    @Override    public User findUserByUserName(String username) {                String sql="select * from users where username=?";        Connection conn=null;        PreparedStatement ps=null;        ResultSet rs=null;        try {            conn=JDBCUtils.getConn();            ps=conn.prepareStatement(sql);            ps.setString(1, username);            rs=ps.executeQuery();            if(rs.next()){                User user=new User();                user.setId(rs.getInt("id"));                user.setUsername(rs.getString("username"));                user.setPassword(rs.getString("password"));                user.setNickname(rs.getString("nickname"));                user.setEmail(rs.getString("email"));                return user;            }else{                return null;            }        } catch (Exception e) {            e.printStackTrace();            throw new RuntimeException(e);        }finally{            JDBCUtils.close(rs, ps, conn);        }    }    @Override    public void addUser(User user) {        String sql="insert into users values (null,?,?,?,?)";        Connection conn=null;        PreparedStatement ps=null;        ResultSet rs=null;        try {            conn=JDBCUtils.getConn();            ps=conn.prepareStatement(sql);            ps.setString(1, user.getUsername());            ps.setString(2, user.getPassword());            ps.setString(3, user.getNickname());            ps.setString(4, user.getEmail());            //int count=stat.executeUpdate(sql);            int count=ps.executeUpdate();                    } catch (Exception e) {            e.printStackTrace();            throw new RuntimeException(e);        }finally{            JDBCUtils.close(rs, ps, conn);        }        }            @Override    public User findUserByUNAndPWD(String username, String password) {                String sql="select * from users where username=? and password=?";        Connection conn=null;        PreparedStatement ps=null;        ResultSet rs=null;        try {            conn=JDBCUtils.getConn();            ps=conn.prepareStatement(sql);            ps.setString(1, username);            ps.setString(2, password);            rs=ps.executeQuery();            if(rs.next()){                User user=new User();                user.setId(rs.getInt("id"));                user.setUsername(rs.getString("username"));                user.setPassword(rs.getString("password"));                user.setNickname(rs.getString("nickname"));                user.setEmail(rs.getString("email"));                return user;            }else{                return null;            }        } catch (Exception e) {            e.printStackTrace();            throw new RuntimeException(e);        }finally{            JDBCUtils.close(rs, ps, conn);        }    }}

 

转载于:https://www.cnblogs.com/xiaoduc-org/p/5366948.html

你可能感兴趣的文章
Java之品优购课程讲义_day02(4)
查看>>
Linux学习-文件管理(1)
查看>>
洞悉物联网发展1000问之什么是物联网基础设施?
查看>>
洞悉物联网发展1000问之智能加到底加什么?
查看>>
错误:26.1.0和27.1.1differ问题
查看>>
2018-05-30笔记(Linux shell基础知识)
查看>>
openStack 瓶颈测试
查看>>
学习java 想成为合格Java软件工程师所要具备哪些专业技能
查看>>
想要提高日常办公效率?这几款软件利器帮助你武装自己!
查看>>
好程序员大数据技术分享:Zookeeper集群管理与选举
查看>>
怎么找到相似Graph?DeepMind提出超越GNN的图匹配网络
查看>>
【2013年总结】思维跌宕起伏,生命颠簸曲折的一年
查看>>
Oracle管理存储架构(一)--概念
查看>>
Centos7系统下Docker ce的安装及镜像加速
查看>>
在老男孩学习的一点想法
查看>>
戴文的Linux内核专题:04安全
查看>>
C# 密封类和密封方法
查看>>
debian 8.4日常问题处理
查看>>
我的友情链接
查看>>
android系统中的文件系统
查看>>