目录
在JDBC001中我们已经能够成功的连接上数据库,现在我们来继续学习数据库增删改查中最简单的插入操作。
在增删改查中,只有查找这个操作是需要返回结果集的,增删改则是不需要,因此它们的操作要相对简单些。如果我们要插入记录到数据表中的话,必须有插入的SQL语句以及PrepareStatement对象来存储我们的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语句写好。
一般来说,如果我们数据表中的字段很多,但是我们想要插入的记录只需要个别的字段时,就不能使用之前的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("数据插入成功");
- }
- }
-
如下,我们的数据插入成功。