首页 > 数据库 >JDBC3 - 优化SQL语句

JDBC3 - 优化SQL语句

时间:2023-01-11 16:11:18浏览次数:34  
标签:语句 JDBC3 sql System preparedStatement statement SQL

SQL语句优化 statement --> preparedStatement

SQL语句的拼接受限,对于①多条语句②复杂类型无法实现操作,且易受③注入攻击

statement

只适合静态SQL语句,动态SQL语句的实现易受注入攻击

preparedStatement

提前知道语句结构可以避免受到注入攻击

package com.atguigu.api.preparedStatement;

import java.sql.*;
import java.util.Scanner;

/**
 * TODO 使用预编译的statement完成用户登录
 *      1.防止注入攻击
 *      2.演示preparedStatement的使用流程
 */


public class PSUserLoginPart {

    public static void main(String[] args) throws ClassNotFoundException, SQLException {

        //1.收集用户信息
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入账号:");
        String account = scanner.nextLine();
        System.out.println("请输入密码:");
        String password = scanner.nextLine();

        //PS的数据库流程
        //2.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");

        //3.获取连接
        Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/atguigu?user=root&password=123456");

        /**
         * statement
         *    1.创建statement
         *    2.拼接SQL语句
         *    3.发送SQL语句,并获取返回结果
         *
         * preparedStatement
         *    1.编写SQL语句结构  不包含动态值的语句,动态值部分使用占位符 ? 替代  注意:? 只能替代动态值
         *    2.创建preparedStatement,并传入动态值
         *    3.动态值站位符进行赋值 -- ? 单独赋值即可
         *    4.发送SQL语句,并获取返回结果
         */

        //4.1.编写SQL语句结构
        String sql = "select * from t_user where account = ? and password = ?;";

        //4.2.创建预编译的statement并且设置SQL语句结果
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        //4.3.单独占位符进行赋值
        /**
         * 参数1:index 占位符的位置 从左向右数 从1开始
         * 参数2:object 占位符的值,可以设置任何类型的数据,避免拼接,使类型更丰富
         */

        preparedStatement.setObject(1,account);
        preparedStatement.setObject(2,password);

        //4.4.发送SQL语句,并获取返回结果
        // statement.executeQuery(sql) | statement.executeUpdate(sql)
        // preparedStatement.executeQuery() | preparedStatement.executeUpdate()
        // preparedStatement  不需要传入参数,因为已经知道了SQL语句的结构和动态值
        ResultSet resultSet = preparedStatement.executeQuery();

        //5.结果集解析
        if(resultSet.next()){
            System.out.println("登录成功");
        }else{
            System.out.println("登录失败");
        }

        //6.释放资源
        resultSet.close();
        preparedStatement.close();

    }
}

标签:语句,JDBC3,sql,System,preparedStatement,statement,SQL
From: https://www.cnblogs.com/Ashen-/p/17044096.html

相关文章

  • DataX工具 SQLServer导入MongoDB
    DataX工具SQLServer导入MongoDB一、前言最开始使用的是数据库SQLServer,后因需求变更,需要将sqlserver数据迁移至mongodb。经过查询发现,阿里开源数据库迁移软件Dat......
  • Xamarin 中使用 SQLite
    1. NuGet中安装下面两个组件sqlite-net-pclSQLitePCLRaw.bundle_green   2. 创建表格//创建表结构[Table("Valuation")]publicclassValuation......
  • mysql聚合索引
    1.背景最近频繁出现慢SQL导致系统性能问题,于是决定针对索引进行一些优化。一些表结构本身已经有了不少索引,如果再继续添加索引,势必会影响到插入数据的性能。那么,是否可以......
  • 最简单的for循环语句
    前言在前面的文章中,壹哥给大家讲解了顺序结构、分支结构,接下来我们就来学习Java里的循环结构。Java里的循环结构,可以通过while、do-while、for、foreach等方式进行实现,今......
  • MSSQL中开启CDC导致事务日志空间被占满事件记录
    问题描述SQLServer中开启CDC之后,在某些情况下会导致事务日志空间被占满的现象为:在执行增删改语句(产生事务日志)的过程中提示,Thetransactionlogfordatabase'***'isfu......
  • 影响postgresql性能的几个重要参数
    http://blog.chinaunix.net/uid-280772-id-2135416.html一篇蛮老的文章了,但是还是很有用,可参考修补。   PG的配置文件是数据库目录下的postgresql.conf文件,8.0以后......
  • MySQL中表的约束
    概念约束是作用于表中字段上的规则,用于限制存储在表中的数据。目的保证数据库中数据的正确、有效性和完整性。分类约束描述关键字非空约束限制该字段的数......
  • MySQL中的group by字段理解
    若groupby后只跟了一个字段,相信大家都很好理解,就是将该字段值相同的分到一个组里;但当groupby后要是跟了多个字段,也许就会发懵了。其实,很简单,最重要的一点就是要理解g......
  • 避免 MySQL 插入重复数据的 4 种方式
    最常见的方式就是为字段设置主键或唯一索引,当插入重复数据时,抛出错误,程序终止,但这会给后续处理带来麻烦,因此需要对插入语句做特殊处理,尽量避开或忽略异常,下面我简单介绍一......
  • sql 优化一
    尽量少用负向条件查询例如:!=、notin、notexists都是不能使用索引的,//表单Order一个订单状态值0为未付款1为付款2为待付款select*fromOrderwherestatus!=......