【WEEK7】 【DAY5】JDBC—PreparedStatement对象【中文版】

2024-04-14 10:44

本文主要是介绍【WEEK7】 【DAY5】JDBC—PreparedStatement对象【中文版】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2024.4.12 Friday
接上文【WEEK7】 【DAY4】JDBC—statement对象【中文版】

目录

  • 10.3.PreparedStatement对象
    • 10.3.1.PreparedStatement可以防止SQL注入,效率比statement更高
    • 10.3.2.插入
    • 10.3.3.删除
    • 10.3.4.更新
    • 10.3.5.查询
    • 10.3.6.防止SQL注入
      • 10.3.6.1.正常情况下
      • 10.3.6.2.结果
      • 10.3.6.3.Sql注入失败
      • 10.3.6.4.结果
  • 10.4.使用IDEA连接数据库
    • 10.4.1.如下图

10.3.PreparedStatement对象

10.3.1.PreparedStatement可以防止SQL注入,效率比statement更高

10.3.2.插入

package lesson.three;import lesson.two.utils.JdbcUtils;import java.sql.*;public class TestInsert {public static void main(String[] args) {Connection conn = null;PreparedStatement st = null;try {conn = JdbcUtils.getConnection();//和一般的statement区别:使作为用问号作为占位符String sql = "INSERT INTO users(id,`NAME`,`PASSWORD`,`email`,`birthday`) VALUES (?,?,?,?,?)";st = conn.prepareStatement(sql);   //预编译SQL:先生成SQL但不执行//手动给参数赋值//set...的语法对应了传入函数参数每个位置以及希望设置成的参数st.setInt(1,4); //idst.setString(2,"lqf");st.setString(3,"987654");st.setString(4,"27046873@qq.com");st.setDate(5,new java.sql.Date(new java.util.Date().getTime()));//new Date().getTime()即:外层括号内是计算机的时间,需要转化成mysql的时间//sql.Date是数据库时间,util.Date是Java的//因为setDate的源码中时间的参数是数据库类型的:void setDate(int parameterIndex, java.sql.Date x)//所以要另外用new Date().getTime()获得时间戳(这个版本里需要使用“new java.util.Date().getTime()”才不报错)//执行int i = st.executeUpdate();if(i > 0){System.out.println("插入成功");}} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtils.release(conn,st,null);}}
}
  • 结果
    在这里插入图片描述
    在这里插入图片描述

10.3.3.删除

package lesson.three;import lesson.two.utils.JdbcUtils;import java.sql.*;public class TestDelete {public static void main (String[] args) {Connection conn = null;PreparedStatement st = null;try {conn = JdbcUtils.getConnection();//和一般的statement区别:使作为用问号作为占位符String sql = "DELETE FROM users WHERE id = ?";st = conn.prepareStatement(sql);   //预编译SQL:先生成SQL但不执行//手动给参数赋值st.setInt(1,4); //id//执行int i = st.executeUpdate();if(i > 0){System.out.println("删除成功");}} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtils.release(conn,st,null);}}
}
  • 结果
    在这里插入图片描述
    在这里插入图片描述
    *输入完代码后没有出现可以运行的标志:一般是系统没有检测到主函数->最低级的错误是main函数字母拼写错误,先检查这个再去上网搜其他可能

10.3.4.更新

package lesson.three;import lesson.two.utils.JdbcUtils;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class TestUpdate {public static void main(String[] args){Connection conn = null;PreparedStatement st = null;try {conn = JdbcUtils.getConnection();//和一般的statement区别:使作为用问号作为占位符String sql = "UPDATE users SET `NAME` = ? WHERE id = ?";st = conn.prepareStatement(sql);   //预编译SQL:先生成SQL但不执行//手动给参数赋值st.setString(1,"阿布巴卡");st.setInt(2,1); //id//执行int i = st.executeUpdate();if(i > 0){System.out.println("更新成功");}} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtils.release(conn,st,null);}}
}
  • 结果
    在这里插入图片描述
    在这里插入图片描述

10.3.5.查询

package lesson.three;import lesson.two.utils.JdbcUtils;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class TestSelect {public static void main(String[] args){Connection conn = null;PreparedStatement st = null;ResultSet rs = null;try {conn = JdbcUtils.getConnection();//编写SQLString sql = "SELECT * FROM users WHERE id = ?";st = conn.prepareStatement(sql);   //预编译SQL:先生成SQL但不执行//传递参数st.setInt(1,1); //id//执行rs = st.executeQuery();if(rs.next()){System.out.println(rs.getString("NAME"));}} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtils.release(conn,st,rs);}}
}
  • 结果
    在这里插入图片描述

10.3.6.防止SQL注入

10.3.6.1.正常情况下

package lesson.three;import lesson.two.utils.JdbcUtils;import java.sql.*;public class prevent_SQL_injection {public static void main(String[] args){login("阿布巴卡","123456"); //正常情况下
//        login("''or '1=1 ","'or '1=1 "); //sql  注入}//登录业务public static void login(String username, String password){Connection conn = null;PreparedStatement st = null;ResultSet rs = null;try {conn = JdbcUtils.getConnection();//SQLString sql = "SELECT * FROM users WHERE `NAME`=? AND `PASSWORD`=?";st = conn.prepareStatement(sql);st.setString(1,username);st.setString(2,password);//查询完毕返回的结果集保存在rs中rs = st.executeQuery(); //括号里的sql要删去,否则报错,但原因未知//打印while (rs.next()) {System.out.println(rs.getString("NAME"));System.out.println(rs.getString("email"));System.out.println(rs.getString("password"));System.out.println("===========================");}} catch (SQLException e) {throw new RuntimeException(e);} finally {JdbcUtils.release(conn,st,rs);}}
}

10.3.6.2.结果

在这里插入图片描述

10.3.6.3.Sql注入失败

只修改login语句

login("''or '1=1 ","'or '1=1 "); //sql  注入

10.3.6.4.结果

(查不出结果)
在这里插入图片描述

10.4.使用IDEA连接数据库

10.4.1.如下图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
理论上成功了就行,但实际应用中几乎用不到。
通过IDEA新建一个p37jdbc数据库下的表并插入数据:

-- P44
-- 创建用户表
CREATE TABLE account(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(40),money FLOAT
);
-- 插入测试数据
INSERT INTO account(`NAME`, money) VALUES ('A', 1000);
INSERT INTO account(`NAME`, money) VALUES ('B', 1000);
INSERT INTO account(`NAME`, money) VALUES ('C', 1000);

这篇关于【WEEK7】 【DAY5】JDBC—PreparedStatement对象【中文版】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/902799

相关文章

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

Spring中管理bean对象的方式(专业级说明)

《Spring中管理bean对象的方式(专业级说明)》在Spring框架中,Bean的管理是核心功能,主要通过IoC(控制反转)容器实现,下面给大家介绍Spring中管理bean对象的方式,感兴趣的朋... 目录1.Bean的声明与注册1.1 基于XML配置1.2 基于注解(主流方式)1.3 基于Java

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以

C++类和对象之默认成员函数的使用解读

《C++类和对象之默认成员函数的使用解读》:本文主要介绍C++类和对象之默认成员函数的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、默认成员函数有哪些二、各默认成员函数详解默认构造函数析构函数拷贝构造函数拷贝赋值运算符三、默认成员函数的注意事项总结一

golang 对象池sync.Pool的实现

《golang对象池sync.Pool的实现》:本文主要介绍golang对象池sync.Pool的实现,用于缓存和复用临时对象,以减少内存分配和垃圾回收的压力,下面就来介绍一下,感兴趣的可以了解... 目录sync.Pool的用法原理sync.Pool 的使用示例sync.Pool 的使用场景注意sync.

SpringBoot项目中Redis存储Session对象序列化处理

《SpringBoot项目中Redis存储Session对象序列化处理》在SpringBoot项目中使用Redis存储Session时,对象的序列化和反序列化是关键步骤,下面我们就来讲讲如何在Spri... 目录一、为什么需要序列化处理二、Spring Boot 集成 Redis 存储 Session2.1

Java实例化对象的​7种方式详解

《Java实例化对象的​7种方式详解》在Java中,实例化对象的方式有多种,具体取决于场景需求和设计模式,本文整理了7种常用的方法,文中的示例代码讲解详细,有需要的可以了解下... 目录1. ​new 关键字(直接构造)​2. ​反射(Reflection)​​3. ​克隆(Clone)​​4. ​反序列化

关于Mybatis和JDBC的使用及区别

《关于Mybatis和JDBC的使用及区别》:本文主要介绍关于Mybatis和JDBC的使用及区别,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、JDBC1.1、流程1.2、优缺点2、MyBATis2.1、执行流程2.2、使用2.3、实现方式1、XML配置文件

C++类和对象之初始化列表的使用方式

《C++类和对象之初始化列表的使用方式》:本文主要介绍C++类和对象之初始化列表的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C++初始化列表详解:性能优化与正确实践什么是初始化列表?初始化列表的三大核心作用1. 性能优化:避免不必要的赋值操作2. 强