02 Statement和PreparedStatement

2024-03-20 01:04

本文主要是介绍02 Statement和PreparedStatement,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • Statement
    • PreparedStatement

Statement

(1)相同的SQL语句, 重复执行第n次,编译n次 — 效率低
(2)Statement sql中的参数赋值 直接通过字符串拼接,可能会有非法sql注入,导致数据泄露

import java.sql.*;
import java.util.Scanner;public class Login {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.print("请输入用户名:   ");String userName = sc.nextLine();System.out.println();System.out.print("请输入密码:   ");String userPwd = sc.nextLine();//连接Connection connection = null;//操作对象Statement statement = null;//结果ResultSet resultSet = null;try {//1注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.获取连接connection = DriverManager.getConnection("jdbc:mysql:///dict?useSSL = false","root","123456");//3创建对象statement = connection.createStatement();//4传入结果String sql = " select * from user where username ='"+userName+"' and password = '"+userPwd+"';";resultSet = statement.executeQuery(sql);if (resultSet.next()){System.out.println("登录成功");}else {System.out.println("登录失败");}} catch (ClassNotFoundException e){e.printStackTrace();System.out.println("驱动未能找到");} catch (SQLException e) {e.printStackTrace();System.out.println("sql出现问题");}finally {//6.关闭所有资源if (resultSet!=null){try {resultSet.close();} catch (SQLException e) {throw new RuntimeException(e);}}if (null!=statement){try {statement.close();} catch (SQLException e) {throw new RuntimeException(e);}}if (connection != null) {try {connection.close();} catch (SQLException e) {throw new RuntimeException(e);}}}}
}

PreparedStatement

(1)相同的SQL语句, 重复执行第n次,不需要重复编译 — 效率高
(2) PreparedStatement 可以有效防止sql注入 , 通过?占位符给sql中的参数赋值,
数据类型严格匹配,sql语句组成不是字符串直接拼接


import java.sql.*;
import java.util.Scanner;public class Login2 {/** 登录* 1.username&password* 2.找个对象给他存起来* 3.将这个值放到sql中然后给statement执行*  select * from user_name = 'name' and user_pwd = 'pwd' or 1=1* 4.校验结果(ResultSet):去执行next()  true则成功 不然反之****  "select user_name from user where user_name ='   ' and user_pwd = 'pwd' or '1'='1';";** */public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.print("请输入用户名:   ");String userName = sc.nextLine();System.out.println();System.out.print("请输入密码:   ");String userPwd = sc.nextLine();//连接Connection connection = null;//操作对象PreparedStatement statement = null;//结果ResultSet resultSet = null;//1.注册驱动try {Class.forName("com.mysql.cj.jdbc.Driver");//2.获取连接connection = DriverManager.getConnection("jdbc:mysql:///test?useSSL = false","root","root");//3.获取操作对象//3.1获取预编译对象//提前将sql写好并为关键值用?去占位statement = connection.prepareStatement("select * from user where username =? and password =?");//3.2根据位置放入关键值//位置还是从1开始statement.setObject(1,userName);statement.setObject(2,userPwd);//4.sql编写并执行//预编译对象直接执行,不需要传入sql,因为已经设置好了!!!
//            String sql = "select user_name from user where user_name ='"+userName+"' and user_pwd = '"+userPwd+"';";resultSet = statement.executeQuery();//5.解析结果/** 判断resultset的next()* true 成功* false 失败* */if (resultSet.next()){System.out.println("登录成功");}else {System.out.println("登录失败");}} catch (ClassNotFoundException e){e.printStackTrace();System.out.println("驱动未能找到");} catch (SQLException e) {e.printStackTrace();System.out.println("sql出现问题");}finally {//6.关闭所有资源if (resultSet!=null){try {resultSet.close();} catch (SQLException e) {throw new RuntimeException(e);}}if (null!=statement){try {statement.close();} catch (SQLException e) {throw new RuntimeException(e);}}if (connection != null) {try {connection.close();} catch (SQLException e) {throw new RuntimeException(e);}}}}
}

这篇关于02 Statement和PreparedStatement的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/827787

相关文章

Git 的特点—— Git 学习笔记 02

文章目录 Git 简史Git 的特点直接记录快照,而非差异比较近乎所有操作都是本地执行保证完整性一般只添加数据 参考资料 Git 简史 众所周知,Linux 内核开源项目有着为数众多的参与者。这么多人在世界各地为 Linux 编写代码,那Linux 的代码是如何管理的呢?事实是在 2002 年以前,世界各地的开发者把源代码通过 diff 的方式发给 Linus,然后由 Linus

MySQL record 02 part

查看已建数据库的基本信息: show CREATE DATABASE mydb; 注意,是DATABASE 不是 DATABASEs, 命令成功执行后,回显的信息有: CREATE DATABASE mydb /*!40100 DEFAULT CHARACTER SET utf8mb3 / /!80016 DEFAULT ENCRYPTION=‘N’ / CREATE DATABASE myd

GPU 计算 CMPS224 2021 学习笔记 02

并行类型 (1)任务并行 (2)数据并行 CPU & GPU CPU和GPU拥有相互独立的内存空间,需要在两者之间相互传输数据。 (1)分配GPU内存 (2)将CPU上的数据复制到GPU上 (3)在GPU上对数据进行计算操作 (4)将计算结果从GPU复制到CPU上 (5)释放GPU内存 CUDA内存管理API (1)分配内存 cudaErro

滚雪球学MyBatis(02):环境搭建

环境搭建 前言 欢迎回到我们的MyBatis系列教程。在上一期中,我们详细介绍了MyBatis的基本概念、特点以及它与其他ORM框架的对比。通过这些内容,大家应该对MyBatis有了初步的了解。今天,我们将从理论走向实践,开始搭建MyBatis的开发环境。了解并掌握环境搭建是使用MyBatis的第一步,也是至关重要的一步。 环境搭建步骤 在开始之前,我们需要准备一些必要的工具和软件,包括J

SAP学习笔记 - 开发02 - BTP实操流程(账号注册,BTP控制台,BTP集成开发环境搭建)

上一章讲了 BAPI的概念,以及如何调用SAP里面的既存BAPI。 SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI-CSDN博客 本章继续讲开发相关的内容,主要就是BTP的实际操作流程,比如账号注册,登录,BTP集成开发环境的搭建这方面。 目录 1,账号注册 2,BTP登录URL 3,如何在BTP上进行开发? 以下是详细内容。 1,账

浙大数据结构:02-线性结构4 Pop Sequence

这道题我们采用数组来模拟堆栈和队列。 简单说一下大致思路,我们用栈来存1234.....,队列来存输入的一组数据,栈与队列进行匹配,相同就pop 机翻 1、条件准备 stk是栈,que是队列。 tt指向的是栈中下标,front指向队头,rear指向队尾。 初始化栈顶为0,队头为0,队尾为-1 #include<iostream>using namespace std;#defi

【SpringMVC学习02】SpringMVC入门程序

转自:http://blog.csdn.net/yerenyuan_pku/article/details/72231272 现有这样一个需求:使用SpringMVC这个框架实现商品列表的展示。这是我对这个需求的分析:我这里假设请求的url为/itemList.action,由于我想要展示商品列表,所以是并不需要传递参数的,再次是这里仅仅是一个SpringMVC的一个入门小程序,并不会与MyBa

02 Shell Script注释和debug

Shell Script注释和debug 一、ShellScript注释 ​ # 代表不解释不执行 ​ 语法:# # 创建myshell.sh文件[root@localhost ~]# vi myshell.sh # 写入内容#!/bin/bash# 打印hello world(正确)echo "hello world"echo "hello 2" # 注释2(正确)echo

python+selenium2轻量级框架设计-02日志类

本文介绍如何写一个Python日志类,用来输出不同级别的日志信息到本地文件夹下的日志文件里。 import logging,time,osclass Logger(object):def __init__(self,logger):'''指定保存日志的文件路径,日志级别,以及调用文件将日志存入到指定的文件中'''#创建loggerself.logger = logging.getLogge

postman基础教程-02环境变量

编写的API往往需要在多个环境下执行,而Postman 提供了两种类型的变量:环境变量和全局变量,从而很好的解决了这个问题。 环境变量有效范围仅仅在于你所选取的环境,全局变量对所有的环境都试用 api可能需要在拨通的环境中运行,所以api请求的服务器地址不能写死,希望是可以配置的,创建环境变量有多种方式。 环境变量 1.手工预先创建环境变量 点击小眼睛按钮即可创建环境变量,第一个是环境变量