目录
Statement的SQL注入问题
SQL插入语句的编写
创建预处理对象并填充占位符
执行操作
代码及插入效果
在JDBC001中我们已经能够成功的连接上数据库,现在我们来继续学习数据库增删改查中最简单的插入操作。
在增删改查中,只有
查找
这个操作是
需要返回结果集
的,增删改则是不需要,因此它们的操作要相对简单些。
如果我们要插入记录到数据表中的话,必须有插入的SQL语句以及PrepareStatement对象来存储我们的SQL语句。
Statement的SQL注入问题
其实在preparestatement之前就存在另外一个用来执行SQL语句的对象---statement,但是statement有着诸多的弊端,如SQL语句的拼接复杂,以及存在SQL注入问题。拼接复杂咱还可以克服一下,但是SQL注入问题的存在就很不得了。SQL注入问题满足的书写语句是这样的:
SELECT 字段1(用户名) ,字段2(用户密码) FROM table WHERE 用户名(字段1)='1' OR '密码(字段2)='=1 OR '1' ='1';
我们观察上述SQL的逻辑就会发现它里面使用的
都是or逻辑运算符
来进行连接并且在判断的式子中出现了
'1' ='1'
这个式子,其比较结果结果肯定为true,
在or逻辑运算符中,只要有一个为true结果就为true(真),因此整个式子就会是true(真)
。这样子无疑是不安全的,信息的泄露可是很严重的事情。因此为了解决这种问题,我们就得需要使用Statement的子类PrepareStatement来创建SQL存储的对象。
如下,我们在数据库连接成功的基础上继续编写我们的代码,现在我们来将我们的SQL语句写好。
SQL插入语句的编写
一般来说,如果我们数据表中的字段很多,但是我们想要插入的记录只需要个别的字段时,就不能使用之前的insert into table values()
而是要在插入值之前指定字段名:inset into table 字段1,字段2 values(数据1,数据2);如下:
【相信大家也看到了我们的字段name加上了着重号,那是因为name与SQL中的关键字NAME冲突了,为了区别开,我们的字段就需要加上着重号``】
当我们运行该语句并没有错误后,我们就可以将插入语句复制粘贴到我们的eclipse中。
接下来我们需要将插入的确切值都用“
?
”即
占位符
来替换。占位符的使用与之前我们讲到的Statement对象的SQL语句的拼接方法区分开,就不存在SQL注入的问题了。
创建预处理对象并填充占位符
现在我们的SQL语句编写好了,接下来我们去创建preparestatement对象来存储SQL语句并设置相应的数据来填充我们的占位符。【我们创建的预处理对象并不是直接使用new来创建的,而是使用我们之前已经建立好的连接对象里面的preparestatement方法并传入SQL语句形成的对象】之后我们使用预处理对象的
set数据类型(索引,数据)
方法来填充我们的占位符。
现在,我们的预处理对象已经有SQL语句了,接下来就是来执行操作了。
执行操作
在preparestatement对象里面有一个方法excute,可以让预处理对象去执行SQL语句,来完成相应的数据表操作。
代码写到这,我们离向数据表插入数据只差最后一步,那就是关闭我们的资源,在关闭资源时推荐先声明的后关闭,后声明的先关闭。【在关闭资源时要先判断是否为空,防止空指针异常】
插入数据这个操作是程序在默默帮我们完成的,它不会有什么返回,我们想要加上一句输出语句来提示我们的数据插入成功。
System.out.println("数据插入成功");
代码及插入效果
package com.day2;
import java.util.Properties;
import com.mysql.cj.xdevapi.PreparableStatement;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
public class Practise1 {
public static void main(String[] args) throws Exception {
//我们常用方法,解耦
//找到配置文件位置
InputStream is=ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
//加载配置文件
Properties pros=new Properties();
pros.load(is);
//读取数据
String user=pros.getProperty("user");
String password=pros.getProperty("password");
String url=pros.getProperty("url");
String driverClass=pros.getProperty("driverClass");
//加载驱动
Class.forName(driverClass);
//建立连接
Connection conn=DriverManager.getConnection(url,user,password);
// System.out.println(conn);
//二,往数据表中插入数据
//1,写SQL语句
String sql="INSERT INTO jdbc_t (id,`name`) VALUES (?,?);";
//2,创建preparestatement对象来存储我们的SQL语句并填充占位符
PreparedStatement ps=conn.prepareStatement(sql);
ps.setInt(1,3);
ps.setString(2, "王五");
//3,执行SQL操作
ps.execute();
//4,关闭资源
if(ps != null) { //防止空指针异常
ps.close();
if(conn != null) {
conn.close();
System.out.println("数据插入成功");
}
如下,我们的数据插入成功。
如上就是简单的数据插入操作
有问题请在评论区留言。