`

SQL注入,PreparedStatement和Statement

SQL 
阅读更多

SQL中包含特殊字符或SQL的关键字(如:' or 1 or ')Statement将出现不可预料的结果(出现异常或查询的结果不正确),可用PreparedStatement来解决。

PreperedStatement(从Statement扩展而来)相对Statement的优点:

       1.没有SQL注入的问题。

       2.Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。

       3.数据库和驱动可以对PreperedStatement进行优化(只有在相关联的数据库连接没有关

闭的情况下有效)。

 

public void read(String name) throws SQLException {

              Connection conn = null;

              PreparedStatement ps = null;

              ResultSet rs = null;

              try {

                     // 2.建立连接

                     conn = JdbcUtils.getConnection();

 

                     // conn = JdbcUtilsSing.getInstance().getConnection();

                     // 3.创建语句

                     String sql = "select id, name, money, birthday  from user where name=?";

                     ps = conn.prepareStatement(sql);

                     ps.setString(1, name);

                     // 4.执行语句

                     rs = ps.executeQuery();

 

                     // 5.处理结果

                     while (rs.next()) {

                            System.out.println(rs.getInt("id") + "\t"

                                          + rs.getString("name") + "\t" + rs.getDate("birthday")

                                          + "\t" + rs.getFloat("money"));

                     }

 

              } finally {

                     JdbcUtils.free(rs, ps, conn);

              }

       }

 

       public void read1(String name) throws SQLException {

              Connection conn = null;

              Statement st = null;

              ResultSet rs = null;

              try {

                     // 2.建立连接

                     conn = JdbcUtils.getConnection();

                     // conn = JdbcUtilsSing.getInstance().getConnection();

 

                     // 3.创建语句

                     String sql = "select id, name, money, birthday  from user where name='"

                                   + name + "'";

                     st = conn.createStatement();

                     // 4.执行语句

                     rs = st.executeQuery(sql);

 

                     // 5.处理结果

                     while (rs.next()) {

                            // System.out.println(rs.getObject("id") + "\t"

                            // + rs.getObject("name") + "\t"

                            // + rs.getObject("birthday") + "\t"

                            // + rs.getObject("money"));

                     }

              } finally {

                     JdbcUtils.free(rs, st, conn);

              }

       }

对于read1()方法,若传入的name' or 1 or '则会把数据库里所有记录都查询出来。而read()用的PerparedStatement就不会出显这种情况。

分享到:
评论

相关推荐

    Java-JDBC【源码】JDBC概述、获取连接、SQL注入问题与解决、查询解析

    Java-JDBC【之】JDBC概述、获取连接、SQL注入问题与解决、查询...3.SQL注入问题与解决(Statement 、PreparedStatement) 3.1.模拟SQL注入 3.2.PreparedStatement解决 3.3.Statement 与 PreparedStatement 4.完整源码

    JDBC(powernode CD2206)详尽版 (教学视频、源代码、SQL文件)

    7.5 PreparedStatement如何解决SQL注入 7.6 使用PreparedStatement改进代码,解决SQL注入问题 八、编写JDBC工具类 九、CRUD操作 十、事务操作 十一、批处理 11.1 jdbc.properties 11.2 BatchDemo.java 11.3 没有进行...

    JDBC专题(三)-JDBC完成用户注册功能

    2.SQL注入问题 3.PreparedStatement类 3.1.PreparedStatement和Statement的对比(面试题) 3.2.PreparedStatement和Statement的关系 3.3.小结 4.使用PreparedStatement完成登录 6.PreparedStatement...

    MySQL数据库

    ####Statement和PreparedStatement - PreparedStatement预编译的SQL执行对象 1. 可以避免SQL注入 因为在编译的时候已经把SQL的逻辑固定,不会因为替换进去的内容改变逻辑 2. 如果SQL中涉及变量 相比Statement的字符...

    数据库增删改查的源代码

    //这里使用PreparedStatement,因为效率高、安全性高(可以防sql注入)。 public static PreparedStatement prepare(Connection conn, String sql) { PreparedStatement ps = null; try { //参照JDK API中的...

    JDBC的常用方法

    我们在写sql语句时,为了方便可能会进行拼接字符串,这样做的弊端就是可能被sql注入攻击,解决的办法也很简单。 //获取数据库连接 Connection connection = DBUtils.getConnection(); //在写sql语句时,使用?代替...

    一篇搞定JDBC【Mysql基础】

    对比Statement和PreparedStatement7.演示只能使用Statement对象不能使用PreparedStatement的业务需求用户输入sql语句8.JDBC事务控制三段重要代码应用于数据库用户之间的转账9.悲观锁和乐观锁机制举栗子说明 1.JDBC ...

    jdbc基础和参考

    提供预编译的功能,某种程度上可以避免sql注入的问题 4.提前做语法检查,在给?赋值的过程中要求数据类型一定要匹配,这样在某种程度上可以避免因为数据类型不匹配而发生的异常 CallableStatement:主要用来执行...

    每日练手10道面试题(一)

    1.Statement和PreparedStatement有什么区别?哪个性能fan更好? 前者可以防止Sql注入,会给变量加上单引号 每次预编译,会先往缓存里面找有没有之前执行过的,有就重复结果,没有再重新执行,并存入缓存,所以前者...

    springmybatis

    其实还有更简单的方法,而且是更好的方法,使用合理描述参数和SQL语句返回值的接口(比如IUserOperation.class),这样现在就可以至此那个更简单,更安全的代码,没有容易发生的字符串文字和转换的错误.下面是详细...

    java面试题

    答:控制反转和依赖注入是spring的两大基础作用。主要是将所有组件在spring提供的外部容器中加载。提高安全性,减低耦合性,使各个框架或者类之间的依赖性降低。 什么是声明式的事务管理?为什么要用?spring如何实现...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    7.4.4 预编译执行SQL语句的PreparedStatement接口 7.4.5 结果集ResultSet接1:2 7.5 JDBC操作数据库 7.5.1 向数据库中插入数据 7.5.2 从数据库中查询所需数据 75.3 修改数据库中的数据 7.5.4 删除无用的数据 7.5.5 ...

    最新Java面试宝典pdf版

    23、JDBC中的PreparedStatement相比Statement的好处 110 24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生...

    Java面试笔试资料大全

    23、JDBC中的PreparedStatement相比Statement的好处 110 24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生...

    Java面试宝典2010版

    23、JDBC中的PreparedStatement相比Statement的好处 24. 写一个用jdbc连接并访问oracle数据的程序代码 25、Class.forName的作用?为什么要用? 26、大数据量下的分页解决方法。 27、用 JDBC 查询学生成绩单, 把主要...

    JAVA面试宝典2010

    23、JDBC中的PreparedStatement相比Statement的好处 110 24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生...

    Java面试宝典-经典

    23、JDBC中的PreparedStatement相比Statement的好处 110 24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生...

    java面试题大全(2012版)

    23、JDBC中的PreparedStatement相比Statement的好处 110 24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生...

Global site tag (gtag.js) - Google Analytics