实战JDBC连接Mysql数据库

本文注意讲了如何使用JDBC连接数据库以及SQl注入等问题。
————————————————————————————

  1. 什么是JDBC
    全称 Java DataBase Connectivity, 是Java语⾔中⽤来规范客户端程序如何来访问数据库的应⽤程序接⼝提供了⼀种接⼝基准,可以构建更⾼级的⼯具和接⼝,使数据库开发⼈员能够编写数据库应⽤程序应⽤程序代码⼀般不能直接访问数据库,需要通过相应的数据库驱动程序才⾏.

  2. 什么是数据库驱动?
    通俗来说就是数据库⼚商的JDBC接⼝实现
    在这里插入图片描述

  3. JDBC连接MySQL相关概念
    数据库驱动:不同数据库开发商(⽐如oracle mysql等)为了某⼀种开发语⾔能够实现统⼀的数据库调⽤⽽开发的⼀个程序, 作⽤相当于⼀个翻译⼈员, 将某个语⾔(⽐如java)中对数据库的调⽤通过这个翻译成各个种类的数据库 ⾃⼰的数据库语⾔
    Connection连接:特定数据库的连接(会话),在连接上下⽂中执⾏sql语句并返回结果
    Statement 语句: 创建执⾏SQL语句的statement, 有好⼏种实现类,⽤于执⾏对应的sql
    ResultSet结果集:SQL查询返回的结果信息
    使⽤Java连接Mysql的步骤

    1.加载JDBC驱动程序
    2.建⽴数据库连接Connection
    3.创建执⾏SQL的语句Statement
    4.处理执⾏结果ResultSet
    5.释放连接资源

  4. 准备数据库表相关的
    基础环境:

    ⾃⼰搭建好Mysql数据库,推荐是Mysql5.7版本
    注意 如果连接不上数据库
    检查防⽕墙-云服务器的⽹络安全组
    mysql有没开启允许远程连接
    

Mysql驱动jar包导⼊
mysql数据库表建⽴

CREATE TABLE `user` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `phone` varchar(32) DEFAULT NULL,
 `pwd` varchar(128) DEFAULT NULL,
 `sex` int(2) DEFAULT NULL,
 `img` varchar(128) DEFAULT NULL,
 `create_time` datetime DEFAULT NULL,
 `role` int(11) DEFAULT NULL COMMENT '1是普通⽤户,2是管理员',
 `username` varchar(128) DEFAULT NULL,
 `wechat` varchar(128) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `user` (`id`, `phone`, `pwd`, `sex`, `img`, `create_time`, `role`,
`username`,`wechat`)
VALUES
 (1,'123','666',1,'ch','2021-09-09 00:00:00',1,'jack','class6'),
 (2,'2323432','794666918',1,'wwwww','2020-05-20 04:54:01',1,'ch1','anna'),
 (3,'2323432','lw',1,'wwwww','2020-05-20 04:54:42',1,'ch','class1'),
 (4,'2323432','3232323',1,'wwwww','2020-05-20 04:55:07',1,'⽼ 王','lw');

用idea创建一个web项目,导入Mysql驱动jar包,下载后点击File->projectStructes
进入下图
在这里插入图片描述点击apply,即可。
然后在项目中,编写如下程序:

class JDBCTest {
    
    
    public static void main(String [] args) throws Exception{
    
    
        //加载JDBC驱动程序
        Class.forName("com.mysql.cj.jdbc.Driver");
        //建⽴数据库连接Connection
        String username = "root";
        String password = "123456";
        //协议:⼦协议://ip:端⼝/数据库名称?参数1=值1&参数2=值2
        String url = "jdbc:mysql://127.0.0.1:3306/db11?useUnicode=true&characterEncoding=utf-8&useSSL=false";
        Connection connection =
                DriverManager.getConnection(url,username,password);
        //创建执⾏SQL的语句Statement
        Statement statement = connection.createStatement();
        //处理执⾏结果ResultSet
        ResultSet resultSet = statement.executeQuery("select * from user");
        while (resultSet.next()){
    
    
            System.out.println("⽤户名称 name="+
                    resultSet.getString("username") + " 联系⽅式 wechat="+
                    resultSet.getString("wechat"));
        }
        //释放连接资源
        resultSet.close();
        statement.close();
        connection.close();
    }

目前项目结构如图:
在这里插入图片描述运行出现以下内容:
在这里插入图片描述准备工作完毕。

  1. SQL注⼊攻击Statement预编译语句
    什么是SQL注⼊攻击
    可以执⾏恶意SQL语句,将任意SQL代码插⼊数据库查询,使⽤SQL注⼊来添加,修改和删除数据库中的记录
    PrepareStatement
    字⾯可译为预声明,内部包含⼀个预编译的sql语句,参数采⽤占位符 ? 进形填充
    为啥可以防注⼊

     第⼀次操作数据库之前,SQL语句已经被数据库分析和编译,
     对应的执 ⾏计划也会缓存下来,之后数据库就会以参数化的形式进⾏查询
    传⼊的值始终都是会作为⼀个值,⽽不是sql指令
     好处:维护性好、提⾼sql效率、增加安全性
    

sql注入代码:

 private static void inject() throws Exception{
        //加载JDBC驱动程序
        Class.forName("com.mysql.cj.jdbc.Driver");
        //建⽴数据库连接Connection
        String username = "root";
        String password = "123456";
        //协议:⼦协议://ip:端⼝/数据库名称?参数1=值1&参数2=值2
        String url = "jdbc:mysql://127.0.0.1:3306/db11?useUnicode=true&characterEncoding=utf-8&useSSL=false";
        Connection connection = DriverManager.getConnection(url, username, password);
        //创建执⾏SQL的语句Statement
        Statement statement = connection.createStatement();
        //处理执⾏结果ResultSet
        String name = "jack";
        String pwd = "666' or 1=1 or'";

        String sql = "select * from user where username ='" + name +"'and pwd ='"+pwd+"'";
        System.out.println(sql);
        ResultSet resultSet = statement.executeQuery(sql);
        while (resultSet.next()) {
            System.out.println("⽤户名称 name=" +
                    resultSet.getString("username") + " 联系⽅式 wechat=" +
                    resultSet.getString("wechat"));
        }
        //释放连接资源
        resultSet.close();
        statement.close();
        connection.close();
    }

执行后结果如下图:
在这里插入图片描述解决代码:

 private static void solveInject() throws Exception{
        //加载JDBC驱动程序
        Class.forName("com.mysql.cj.jdbc.Driver");
        //建⽴数据库连接Connection
        String username = "root";
        String password = "123456";
        //协议:⼦协议://ip:端⼝/数据库名称?参数1=值1&参数2=值2
        String url = "jdbc:mysql://127.0.0.1:3306/db11?useUnicode=true&characterEncoding=utf-8&useSSL=false";
        Connection connection = DriverManager.getConnection(url, username, password);
        //创建执⾏SQL的语句Statement
        PreparedStatement preparedStatement = connection.prepareStatement("select * from user where username = ? and pwd = ?");
        //处理执⾏结果ResultSet

        String name = "jack";
        String pwd = "666 ' or 1=1 or '";
        preparedStatement.setString(1,name);
        preparedStatement.setString(2,pwd);

        ResultSet resultSet = preparedStatement.executeQuery();
        while (resultSet.next()) {
            System.out.println("⽤户名称 name=" +
                    resultSet.getString("username") + " 联系⽅式 wechat=" +
                    resultSet.getString("wechat"));
        }
        //释放连接资源
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }

运行结果:
在这里插入图片描述

新增一条记录代码

private static void insert() throws Exception {
    
    
        //加载JDBC驱动程序
        Class.forName("com.mysql.cj.jdbc.Driver");
        //建⽴数据库连接Connection
        String username = "root";
        String password = "123456";
        //协议:⼦协议://ip:端⼝/数据库名称?参数1=值1&参数2=值2
        String url = "jdbc:mysql://127.0.0.1:3306/db11?useUnicode=true&characterEncoding=utf-8&useSSL=false";
        Connection connection = DriverManager.getConnection(url, username, password);
        //创建执⾏SQL的语句Statement
     PreparedStatement preparedStatement =  connection.prepareStatement("insert into user (username,pwd) values (?,?)");
        preparedStatement.setString(1,"陈浩");
        preparedStatement.setString(2,"111");
       preparedStatement.execute();
        //释放连接资源

        preparedStatement.close();
        connection.close();
    }

猜你喜欢

转载自blog.csdn.net/chandfy/article/details/124206692