目录

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存储的对象。

java 加了saveAndFlush 还可以回滚吗 javainsert_eclipse

如下,我们在数据库连接成功的基础上继续编写我们的代码,现在我们来将我们的SQL语句写好。

SQL插入语句的编写

一般来说,如果我们数据表中的字段很多,但是我们想要插入的记录只需要个别的字段时,就不能使用之前的insert  into table values()

而是要在插入值之前指定字段名:inset into table  字段1,字段2  values(数据1,数据2);如下:

java 加了saveAndFlush 还可以回滚吗 javainsert_数据库_02

【相信大家也看到了我们的字段name加上了着重号,那是因为name与SQL中的关键字NAME冲突了,为了区别开,我们的字段就需要加上着重号``】

当我们运行该语句并没有错误后,我们就可以将插入语句复制粘贴到我们的eclipse中。

java 加了saveAndFlush 还可以回滚吗 javainsert_数据库_03

接下来我们需要将插入的确切值都用“ ”即 占位符 来替换。占位符的使用与之前我们讲到的Statement对象的SQL语句的拼接方法区分开,就不存在SQL注入的问题了。

java 加了saveAndFlush 还可以回滚吗 javainsert_mysql_04

创建预处理对象并填充占位符

现在我们的SQL语句编写好了,接下来我们去创建preparestatement对象来存储SQL语句并设置相应的数据来填充我们的占位符。【我们创建的预处理对象并不是直接使用new来创建的,而是使用我们之前已经建立好的连接对象里面的preparestatement方法并传入SQL语句形成的对象】之后我们使用预处理对象的 set数据类型(索引,数据) 方法来填充我们的占位符。

java 加了saveAndFlush 还可以回滚吗 javainsert_SQL_05

现在,我们的预处理对象已经有SQL语句了,接下来就是来执行操作了。

执行操作

在preparestatement对象里面有一个方法excute,可以让预处理对象去执行SQL语句,来完成相应的数据表操作。

java 加了saveAndFlush 还可以回滚吗 javainsert_SQL_06

代码写到这,我们离向数据表插入数据只差最后一步,那就是关闭我们的资源,在关闭资源时推荐先声明的后关闭,后声明的先关闭。【在关闭资源时要先判断是否为空,防止空指针异常】

java 加了saveAndFlush 还可以回滚吗 javainsert_java_07

插入数据这个操作是程序在默默帮我们完成的,它不会有什么返回,我们想要加上一句输出语句来提示我们的数据插入成功。 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("数据插入成功");
	}

java 加了saveAndFlush 还可以回滚吗 javainsert_数据库_08

如下,我们的数据插入成功。

java 加了saveAndFlush 还可以回滚吗 javainsert_数据库_09

如上就是简单的数据插入操作

有问题请在评论区留言。