• JDBC002--java中连接数据库后执行insert插入记录的操作


    目录

    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("数据插入成功");

    代码及插入效果 

    1. package com.day2;
    2. import java.util.Properties;
    3. import com.mysql.cj.xdevapi.PreparableStatement;
    4. import java.io.IOException;
    5. import java.io.InputStream;
    6. import java.sql.*;
    7. public class Practise1 {
    8. public static void main(String[] args) throws Exception {
    9. //我们常用方法,解耦
    10. //找到配置文件位置
    11. InputStream is=ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
    12. //加载配置文件
    13. Properties pros=new Properties();
    14. pros.load(is);
    15. //读取数据
    16. String user=pros.getProperty("user");
    17. String password=pros.getProperty("password");
    18. String url=pros.getProperty("url");
    19. String driverClass=pros.getProperty("driverClass");
    20. //加载驱动
    21. Class.forName(driverClass);
    22. //建立连接
    23. Connection conn=DriverManager.getConnection(url,user,password);
    24. // System.out.println(conn);
    25. //二,往数据表中插入数据
    26. //1,写SQL语句
    27. String sql="INSERT INTO jdbc_t (id,`name`) VALUES (?,?);";
    28. //2,创建preparestatement对象来存储我们的SQL语句并填充占位符
    29. PreparedStatement ps=conn.prepareStatement(sql);
    30. ps.setInt(1,3);
    31. ps.setString(2, "王五");
    32. //3,执行SQL操作
    33. ps.execute();
    34. //4,关闭资源
    35. if(ps != null) { //防止空指针异常
    36. ps.close();
    37. }
    38. if(conn != null) {
    39. conn.close();
    40. }
    41. System.out.println("数据插入成功");
    42. }
    43. }

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

  • 相关阅读:
    这个微信隐藏代码,你们现在知道还不晚
    Java8新特性(Stream流)
    如何在项目中快速引入Logback日志
    HDFS 高可用分布式环境搭建
    Transformer中的Self-Attention以及Multi-Head Self-Attention(MSA)
    Java内部类
    整理Meta GDC 2024 上关于XR、空间计算相关的分享
    设计模式系列详解 -- 迭代器模式
    设计模式学习(九):装饰器模式
    [初始java]——java为什么这么火,java如何实现跨平台、什么是JDK/JRE/JVM
  • 原文地址:https://blog.csdn.net/weixin_53046747/article/details/126139952