MySQL---JDBC基础操作、SQL注入

文章介绍了JDBC作为Java访问数据库的标准规范,包括核心类如DriverManager、Connection、Statement和PreparedStatement的作用。同时,文章讨论了SQL注入的问题,解释了如何通过PreparedStatement防止SQL注入,确保参数作为数据而非指令处理,增强了安全性。
摘要由CSDN通过智能技术生成

1. JDBC

JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API。

JDBC是Java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它由一组用Java

语言编写的接口和类组成。

JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供

商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。

JDBC核心类和接口:

DriverManager:用于注册驱动

Connection: 表示与数据库创建的连接

Statement/PrepareStatement: 操作数据库sql语句的对象

ResultSet: 结果集或一张虚拟表

执行流程:

drop database if exists mydb16_jdbc;
create database if not exists mydb16_jdbc;


use mydb16_jdbc;

create table if not exists student(
	sid int primary key auto_increment,
	sname varchar(20),
	age int
);

insert into student values(NULL,'宋江',30),(NULL,'武松',28),(NULL,'林冲',26);



select * from student;


create table if not exists user(
	uid int primary key auto_increment,
	username varchar(20),
	password varchar(20)
);

insert into user values(NULL,'zhangsan','123456'),(NULL,'lisi','888888');
public class JdbcDemo1 {
    public static void main(String[] args) throws Exception {
        // 注意:使用JDBC规范,采用都是 java.sql包下的内容
        //1 注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2 获得连接
        String url = "jdbc:mysql://localhost:3306/mydb16_jdbc";
        Connection conn = DriverManager.getConnection(url, "root", "123456");
        //3获得执行sql语句的对象
        Statement stmt = conn.createStatement();
        //4执行SQL语句
        ResultSet rs = stmt.executeQuery("select * from student");
        //5处理结果集
        while(rs.next()){
            // 获得一行数据
            Integer cid = rs.getInt("sid");
            String cname = rs.getString("sname");
            Integer age = rs.getInt("age");
            System.out.println(cid + " , " + cname);
        }
        //6释放资源
        rs.close();
        stmt.close();
        conn.close();
 
 
    }

2. JDBC的SQL注入

简单的来讲,就是在写SQL语句时用字符串拼接,where查询条件拼接到了or,or后面的判别式为

真,即使SQL语句乱写,数据库也会链接成功。

将拼接的SQL语句打印出来:

由于编写的SQL语句,是在用户输入数据后,整合后再编译成SQL语句。所以为了避免SQL注入的

问题,使SQL语句在用户输入数据前,SQL语句已经完成编译,成为了完整的SQL语句,再进行填

充数据(需要在我们控制台录入后,提前把SQL语句编译成一行长长的字符串,防止注入) 。

PreparedStatement接口继承了Statement接口。执行SQL语句的方法没有区别!

PreparedStatement应用时,SQL字符串的参数都由?符号站位,被称为参数标记。在执行该SQL

语句前,要为每个?参数赋值。

当运行时动态地把参数传给PreprareStatement时,即使参数里有敏感字符如 or '1=1’数据库也会作

为一个参数或一个字段的属性值来处理而不会作为一个SQL指令,如此,就起到了防止SQL注入的

作用了!

我们可以看到输出的SQL是把整个参数用引号包起来,并把参数中的引号作为转义字符,从而避

免了参数也作为条件的一部分。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三月七꧁ ꧂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值