jdbc -4- PreparedStatement

PreparedStatement

···························

SQL 注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的 SQL 语句段或命令,
从而利用系统的 SQL 引擎完成恶意行为的做法
对于 Java 而言,要防范 SQL 注入,只要用 PreparedStatement 取代 Statement 就可以了

可以通过调用 Connection 对象的 preparedStatement() 方法获取 PreparedStatement 对象
PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句
PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示,调用 PreparedStatement 对象的 setXXX() 方法来设置这些参数. setXXX() 方法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值

statement vs preparedStatement

代码的可读性和可维护性.
PreparedStatement 能最大可能提高性能:
DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行。
在statement语句中,即使是相同操作但因为数据内容不一样,所以整个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.这样每执行一次都要对传入的语句编译一次.
(语法检查,语义检查,翻译成二进制命令,缓存)
PreparedStatement 可以防止 SQL 注入

package connect;

import org.junit.Test;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/*
使用preparedStatement 简化Sql语句的编写

··可以有效的禁止SQL注入
SQL 注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的 SQL 语句段或命令,
从而利用系统的 SQL 引擎完成恶意行为的做法

对于 Java 而言,要防范 SQL 注入,只要用 PreparedStatement 取代 Statement 就可以了
 */
public class preparedStatement {
    @Test
    public void test() throws SQLException {
        //1.创建PreparedStatement
        String sql = "INSERT INTO customer (name, email, brith) VALUES (?,?,?)";
        PreparedStatement preparedStatement = JDBCTools.getConnection().prepareStatement(sql);

        //2.调用PreparedStatement的setxxx(int index,Object val)设置占位符的值 (setObject())
        preparedStatement.setString(1,"arli");
        preparedStatement.setString(2,"Gmail.com");
        preparedStatement.setString(3,"+654651-4565+-");

        //3.执行SQL语句: executeQuery() 或 executeUpdate() :执行时不再需要传入SQL
        preparedStatement.executeUpdate();

        preparedStatement.close();
    }

    //通用查询方法(利用反射及JDBC元数据编写通用的查询方法)
    /*
    ResultSetMetaData:是描述ResultSet的元数据对象,既可以从中获取到结果集中有多少列,列名是什么。。。
    1.得到ResultSetMetaData:对象:调用ResultSet 的getMetaDate()方法
            ResultSetMetaData中的方法:
                >int getColumnCount(): SQL 语句中包含哪些列
                >String getColumnLabel(int column): 获取指定的列的别名,其中索引从1开始
    2.
     */
    @Test
    public void ToolsTest2(){
        //为属性名设置别名
        String sql = "SELECT id id,name Name, email Email, brith Date FROM customer WHERE id = ?";

        CustomerClass customerClass = JDBCTools.instance_search(CustomerClass.class, sql, 5);
        System.out.println(customerClass);


    }
//    @Test
//    public void ToolsTest(){
//        String sql = "INSERT INTO customer (name, email, brith) VALUES (?,?,?)";
//        JDBCTools.P_Update(sql,"arli","qq.com","156-9684-4");
//
//        JDBCTools.instance_insert(new CustomerClass("ryrtrtnjhrtn", "asefg.com", "54354+65"));
//
//    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值