JDBC核心AIP之PrearedStatement类

PrearedStatement:是Statement的子类,功能更加强,执行Sql语句

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.由于Statement对象存在的问题
    a.Sql注入问题,在拼接Sql时,有一些Sql的特殊关键字参与字符串的拼接,会造成安全性问题。
    
2.解决Sql注入问题使用PreparedStatement对象来解决
3.预编译的Sql:参数使用?作为占位符

4.使用PreparedStatement对象的步骤:(最得要)
    1.导入驱动Jar2.注册驱动
    3.获取数据库连接对象Connection
    4.定义Sql
    	注意:Sql的参数使用?作为占位符:如select * from user where username=? and password=?
    5.获取执行Sql语句对象PreparedStatement,同时并Sql语句传入
    如:connection.prepareStatement(sql);

	6.给?赋值
        a.方法:SetXxx(参数1,参数2)
        参数1:?的位置编号 ,注意编号是从1开始的
        参数2:?的值
    7.执行Sql语句,处理返回结果,不需要传入Sql语句了(注意由于上面已经传入了)
    8.释放资源

重点:后期都会使用PreparedStatement对象来完成增删改查的所有操作了

1.可以防止Sql注入的问题

2.效率更高

PreparedSatement 的好处

  1. prepareStatement()会先将 SQL 语句发送给数据库预编译。PreparedStatement 会引用着预编译后的结果。 可以多次传入不同的参数给 PreparedStatement 对象并执行。减少 SQL 编译次数,提高效率。

  2. 安全性更高,没有 SQL 注入的隐患。

  3. 提高了程序的可读性

    使用 PreparedStatement 的步骤:

    1. 编写 SQL 语句,未知内容使用?占位:“SELECT * FROM user WHERE name=? AND password=?”;
    2. 获得 PreparedStatement 对象
    3. 设置实际参数:setXxx(占位符的位置, 真实的值)
    4. 执行参数化 SQL 语句
    5. 关闭资源
package com.haikang.login;
/**
 *  1.导入驱动Jar包
 *     2.注册驱动
 *     3.获取数据库连接对象Connection
 *     4.定义Sql
 *     	注意:Sql的参数使用?作为占位符:如select * from user where username=? and password=?
 *     5.获取执行Sql语句对象PreparedStatement,同时并Sql语句传入
 *     如:connection.prepareStatement(sql);
 *
 * 	6.给?赋值
 *         a.方法:SetXxx(参数1,参数2)
 *         参数1:?的位置编号 ,注意编号是从1开始的
 *         参数2:?的值
 *     7.执行Sql语句,处理返回结果,不需要传入Sql语句了(注意由于上面已经传入了)
 *     8.释放资源
 */
public class JDBCLogin02 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        for (int i=0;i<=3;i++){
            System.out.println("请输入用户名:");
            String username = sc.nextLine();
            System.out.println("请输入密码:");
            String password = sc.nextLine();
            boolean login = login(username, password);
            if (login){
                System.out.println("登录成功:");
                break;
            }else {
                System.out.println("用户名或密码错误"+(3-i)+"次机会:");
            }
        }
    }

    public static boolean login(String username,String password){
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        if (username==null||password==null){
            return false;
        }
        try {
            //注册驱动和获得数据库连接对象
            connection = JDBCUtils.getConnection();
            //定义Sql语句
            String sql = "select * from user where username=? and password=?";
            //获得Sql执行对象
            preparedStatement = connection.prepareStatement(sql);
            //给占位符赋值
            preparedStatement.setString(1,username);
            preparedStatement.setString(2,password);
            //执行Sql语句,注意不需要传入Sql语句了,如果传入那就是使用父类Statement的方法了
            resultSet = preparedStatement.executeQuery();
            //处理返回结果
            boolean next = resultSet.next();
            return next;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

        //关流
        JDBCUtils.close(resultSet,preparedStatement,connection);
        return false;
    }
}

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值