JDBC入门&SQL注入测试&Druid连接池操作

JDBC入门

操作环境:
navicat+IDEA2020.3.1

1.创建数据库表

1.1我们首先创建一个csdn库, 然后切换到csdn库中
create database csdn; -- 创建一个数据库
use csdn;		-- 选择改数据库
1.2在csdn数据库中创建一个account, tb_user表,用于jdbc之后的测试操作
DROP TABLE IF EXISTS account; -- 如果存在这个表则先删除该表然后再次创建
-- 创建账户表
CREATE TABLE account(
	id int PRIMARY KEY auto_increment,
	name varchar(10),
	money double(10,2)
);

-- 添加数据
INSERT INTO account(name,money) values('张三',1000),('李四',1000);

select * from account;

drop table if EXISTS tb_user;
create table tb_user(
	id int, 
	username varchar(20),
	password varchar(32)
);

insert into tb_user values (1, "zhangsan", "123"), (2, "lisi", "123");

select * from tb_user;

2.IDEA中创建项目

2.1创建新的空的项目(用于编写java代码)

1.File—>New—>Project
在这里插入图片描述
2.Empty Project —>Empty Project —>Next
在这里插入图片描述
3.设置空项目的名称
在这里插入图片描述

2.2在刚刚创建的空项目中创建一个新的模块

  1. Modules—>New Module
    在这里插入图片描述
  2. Java---->确认JDK版本(我这里是1.8)---->Next
    在这里插入图片描述

3.设置模块名称—>Finsh–>OK
在这里插入图片描述

2.3导入使用jdbc的jar包

2.3.1下载jar包

下载jar包(mysql-connector-java-5.1.48.jar)
https://mvnrepository.com/artifact/mysql/mysql-connector-java
在这里插入图片描述
点击jar包下载即可
在这里插入图片描述

2.3.2 导入jar包

New—>Directory 新建lib目录
在这里插入图片描述
下载得到的jar包复制到lib目录下面
右键—>Add as Libaray
在这里插入图片描述
设置为模块有效–>OK
在这里插入图片描述

3.JDBC代码

Statement 操作

在jdbc目录下面新建JDBCDemo类
Src–>New—>Java Class
在这里插入图片描述

1.增删改查操作

说明:

jdbc:mysql://127.0.0.1:3306/csdn // 这个表示链接的是本地的数据集,默认会有安全警告(红字)
jdbc:mysql:///csdn	// 这个等价于上面那一行
jdbc:mysql://127.0.0.1:3306/csdn?useSSL=false  // 添加?useSSL=false可以忽略警告信息

关键代码:

insert into account (name, money) values ('jorda', 2300); --增加
delete from account where name = 'jordan'; 			--删除
update account set money = 2500 where id = 1 		-- 修改
select * from account								-- 查询

具体代码:

import java.sql.*;
public class JDBCDemo {
    public static void main(String[] args) throws Exception {
        addAccount();     //增加操作
//        deleteAccount();  //删除操作
//        updateAccount();  //修改操作
//        selectAll();      //查询操作

    }
    // 1.增加操作 增加一个account用户
    public static void addAccount() throws Exception {
        Class.forName("com.mysql.jdbc.Driver");

        String url = "jdbc:mysql://127.0.0.1:3306/csdn";
        // 数据库ip地址 csdn是数据库的名称, 可根据自己的数据库名称而改变
        String username = "root";       // 数据库用户名
        String password = "123456";     // 用密码对应的密码
        Connection connection = DriverManager.getConnection(url, username, password);

        //3.定义需要执行的Sql
        String sql = "insert into account (name, money) values ('jordan', 2300)";
        //4.获取执行Sql的Statement对象
        Statement stmt = connection.createStatement();
        //5.执行sql
        int count = stmt.executeUpdate(sql);
        //6.处理结果
        if (count>0){
            System.out.println("添加成功");
        }else{
            System.out.println("添加失败");
        }
        // 7.释放资源 关闭流
        connection.close();
    }
    // 2.删除操作  删除一个account用户例如: jordan
    public static void deleteAccount () throws Exception {
        Class.forName("com.mysql.jdbc.Driver");

        String url = "jdbc:mysql://127.0.0.1:3306/csdn";
        // 数据库ip地址 csdn是数据库的名称, 可根据自己的数据库名称而改变
        String username = "root";       // 数据库用户名
        String password = "123456";     // 用密码对应的密码
        Connection connection = DriverManager.getConnection(url, username, password);

        //3.定义需要执行的Sql
        String sql = "delete from account where name = 'jordan'";
        //4.获取执行Sql的Statement对象
        Statement stmt = connection.createStatement();
        //5.执行sql
        int count = stmt.executeUpdate(sql);
        //6.处理结果
        if (count>0){
            System.out.println("删除成功");
        }else{
            System.out.println("删除失败");
        }
        // 7.释放资源 关闭流
        connection.close();
    }
    // 3.修改操作 money修改为2500
    public static void updateAccount () throws Exception {
        Class.forName("com.mysql.jdbc.Driver");

        String url = "jdbc:mysql://127.0.0.1:3306/csdn";
        // 数据库ip地址 csdn是数据库的名称, 可根据自己的数据库名称而改变
        String username = "root";       // 数据库用户名
        String password = "123456";     // 用密码对应的密码
        Connection connection = DriverManager.getConnection(url, username, password);

        //3.定义需要执行的Sql
        String sql = "update account set money = 2500 where id = 1";
        //4.获取执行Sql的Statement对象
        Statement stmt = connection.createStatement();
        //5.执行sql
        int count = stmt.executeUpdate(sql);
        //6.处理结果
        if (count>0){
            System.out.println("更新成功");
        }else{
            System.out.println("更新失败");
        }
        // 7.释放资源 关闭流
        connection.close();
    }
    // 4.查询操作 查询所有的account用户
    public static void selectAll() throws Exception {
        //1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取链接
        String url = "jdbc:mysql://127.0.0.1:3306/csdn";
        // 数据库ip地址 csdn是数据库的名称, 可根据自己的数据库名称而改变
        String username = "root";       // 数据库用户名
        String password = "123456";     // 用密码对应的密码
        Connection connection = DriverManager.getConnection(url, username, password);

        //3.定义需要执行的Sql
        String sql = "select * from account";
        //4.获取执行Sql的Statement对象
        Statement stmt = connection.createStatement();
        //5.执行sql
        ResultSet rs = stmt.executeQuery(sql);
        //6.处理结果
        while(rs.next()){
            String id = rs.getString("id");
            String name = rs.getString("name");
            String money = rs.getString("money");
            System.out.println(id + "\t" +  name + "\t" + money);
        }
        // 7.释放资源 关闭流
        rs.close();
        connection.close();
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

PrepareStatement(可以防止SQL注入问题)

这里操作的是tb_user
新建要给PrepareStatementDemo类
在这里插入图片描述
说明:

// useServerPrepStmts=true 是为了开启PrepareStatement的预编译功能, 默认是不开启预编译功能的
jdbc:mysql:///db1?useSSL=false&useServerPrepStmts=true
1.增删改查

关键代码:

insert into tb_user (id, username, password) values (?, ?, ?) 	-- 增加操作
delete from tb_user where username = ?							-- 删除操作
update tb_user set username = ? where id = ?					-- 修改操作
select * from tb_user											-- 查询所有操作
select * from tb_user where username = ? and password = ?		-- 查询单个用户操作(登录操作)

具体代码:

import java.sql.*;

public class PrepareStatementDemo {
    public static void main(String[] args) throws Exception {
//        addUser();    // 添加用户
//        deleteUser(); // 删除用户
//        updateUser(); //修改用户
        selectAll();    //查询所有用户
        selectUser();   // 查询用户
    }
    // 1.增加操作 增加一个account用户
    public static void addUser() throws Exception {
        Class.forName("com.mysql.jdbc.Driver");

        String url = "jdbc:mysql://127.0.0.1:3306/csdn";
        // 数据库ip地址 csdn是数据库的名称, 可根据自己的数据库名称而改变
        String username = "root";       // 数据库用户名
        String password = "123456";     // 用密码对应的密码
        Connection connection = DriverManager.getConnection(url, username, password);

        //3.定义需要执行的Sql
        String sql = "insert into tb_user (id, username, password) values (?, ?, ?)";
        int id = 3;
        String name = "wangwu";
        String pwd = "123";

        //4.获取执行Sql的Statement对象
        PreparedStatement pstmt = connection.prepareStatement(sql);
        pstmt.setInt(1,id);
        pstmt.setString(2, name);
        pstmt.setString(3,pwd);

        //5.执行sql
        int count = pstmt.executeUpdate();
        //6.处理结果
        if (count>0){
            System.out.println("添加成功");
        }else{
            System.out.println("添加失败");
        }
        // 7.释放资源 关闭流
        connection.close();
    }
    // 2.删除操作  删除一个account用户例如: jordan
    public static void deleteUser () throws Exception {
        Class.forName("com.mysql.jdbc.Driver");

        String url = "jdbc:mysql://127.0.0.1:3306/csdn";
        // 数据库ip地址 csdn是数据库的名称, 可根据自己的数据库名称而改变
        String username = "root";       // 数据库用户名
        String password = "123456";     // 用密码对应的密码
        Connection connection = DriverManager.getConnection(url, username, password);

        //3.定义需要执行的Sql
        String sql = "delete from tb_user where username = ?";
        //4.获取执行Sql的Statement对象
        PreparedStatement pstm = connection.prepareStatement(sql);
        String name = "wangwu";
        pstm.setString(1, name);
        //5.执行sql
        int count = pstm.executeUpdate();
        //6.处理结果
        if (count>0){
            System.out.println("删除成功");
        }else{
            System.out.println("删除失败, 不存在该用户");
        }
        // 7.释放资源 关闭流
        connection.close();
    }
    // 3.修改操作 money修改为2500
    public static void updateUser () throws Exception {
        Class.forName("com.mysql.jdbc.Driver");

        String url = "jdbc:mysql://127.0.0.1:3306/csdn";
        // 数据库ip地址 csdn是数据库的名称, 可根据自己的数据库名称而改变
        String username = "root";       // 数据库用户名
        String password = "123456";     // 用密码对应的密码
        Connection connection = DriverManager.getConnection(url, username, password);

        //3.定义需要执行的Sql
        String sql = "update tb_user set username = ? where id = ?";
        //4.获取执行Sql的Statement对象
        PreparedStatement pstmt = connection.prepareStatement(sql);
        String newName = "wuhuqifei";
        int id = 2;
        pstmt.setString(1, newName);
        pstmt.setInt(2, id);

        //5.执行sql
        int count = pstmt.executeUpdate();
        //6.处理结果
        if (count>0){
            System.out.println("更新成功");
        }else{
            System.out.println("更新失败");
        }
        // 7.释放资源 关闭流
        connection.close();
    }

    public static void selectAll() throws Exception {
        Class.forName("com.mysql.jdbc.Driver");

        String url = "jdbc:mysql://127.0.0.1:3306/csdn";
        // 数据库ip地址 csdn是数据库的名称, 可根据自己的数据库名称而改变
        String username = "root";       // 数据库用户名
        String password = "123456";     // 用密码对应的密码
        Connection connection = DriverManager.getConnection(url, username, password);

        //3.定义需要执行的Sql
        String sql = "select * from tb_user";
        //4.获取执行Sql的Statement对象
        PreparedStatement pstmt = connection.prepareStatement(sql);

        //5.执行sql
        ResultSet rs = pstmt.executeQuery();

        //6.处理结果
        while(rs.next()){
            String id = rs.getString("id");
            String name = rs.getString("username");
            String money = rs.getString("password");
            System.out.println(id + "\t" +  name + "\t" + money);
        }
        // 7.释放资源 关闭流
        rs.close();
        connection.close();
    }

    public static void selectUser() throws Exception {
        Class.forName("com.mysql.jdbc.Driver");

        String url = "jdbc:mysql://127.0.0.1:3306/csdn";
        // 数据库ip地址 csdn是数据库的名称, 可根据自己的数据库名称而改变
        String username = "root";       // 数据库用户名
        String password = "123456";     // 用密码对应的密码
        Connection connection = DriverManager.getConnection(url, username, password);

        //3.定义需要执行的Sql
        String sql = "select * from tb_user where username = ? and password = ?";
        //4.获取执行Sql的Statement对象
        PreparedStatement pstmt = connection.prepareStatement(sql);

        String name = "zhangsan";
        String pwd = "123";

        pstmt.setString(1, name);
        pstmt.setString(2, pwd);
        //5.执行sql
        ResultSet rs = pstmt.executeQuery();

        //6.处理结果`在这里插入代码片`
        if (rs.next()){
            String loginName = rs.getString("username");
            System.out.println("恭喜您, "+loginName+"登录成功");
        }else{
            System.out.println("登录失败, 密码或用户名不正确");
        }
        // 7.释放资源 关闭流
        connection.close();
    }
}

4 sql注入操作

新建一个SQLInjectionDemo测试sql注入的问题:

statement 存在注入问题

关键代码:

String name = "zhangsan";
String pwd = "' or '1' = '1"; // 将密码设置为字符换拼接百分之百正确的 情况

具体代码如下:

public class SQLInjectionDemo {
    public static void main(String[] args) throws Exception {
        loginUserStatement();           // 不能防止sql注入
        loginUserPrepareStatement();    // 可以防止sql注入
    }

    public static void loginUserStatement() throws Exception {
        Class.forName("com.mysql.jdbc.Driver");

        String url = "jdbc:mysql://127.0.0.1:3306/csdn?useSSL=false";
        // 数据库ip地址 csdn是数据库的名称, 可根据自己的数据库名称而改变
        String username = "root";       // 数据库用户名
        String password = "123456";     // 用密码对应的密码
        Connection connection = DriverManager.getConnection(url, username, password);

        //3.定义需要执行的Sql
        String name = "zhangsan";
        String pwd = "' or '1' = '1";
        String sql = "select * from tb_user where username = '"+name+"' and password = '"+pwd+"'";
        //4.获取执行Sql的Statement对象
        Statement stmt = connection.createStatement();

        //5.执行sql
        ResultSet rs = stmt.executeQuery(sql);

        //6.处理结果
        System.out.println("Statement........................");
        if (rs.next()){
            String loginName = rs.getString("username");
            System.out.println("恭喜您, "+loginName+"登录成功");
        }else{
            System.out.println("登录失败, 密码或用户名不正确");
        }
        // 7.释放资源 关闭流
        connection.close();
    }

    public static void loginUserPrepareStatement() throws Exception {
        Class.forName("com.mysql.jdbc.Driver");

        String url = "jdbc:mysql://127.0.0.1:3306/csdn?useSSL=false";
        // 数据库ip地址 csdn是数据库的名称, 可根据自己的数据库名称而改变
        String username = "root";       // 数据库用户名
        String password = "123456";     // 用密码对应的密码
        Connection connection = DriverManager.getConnection(url, username, password);

        //3.定义需要执行的Sql
        String sql = "select * from tb_user where username = ? and password = ?";
        //4.获取执行Sql的Statement对象
        PreparedStatement pstmt = connection.prepareStatement(sql);

        String name = "zhangsan";
        String pwd = "' or '1' = '1";

        pstmt.setString(1, name);
        pstmt.setString(2, pwd);
        //5.执行sql
        ResultSet rs = pstmt.executeQuery();
        System.out.println("PrepareStatement........................");
        //6.处理结果
        if (rs.next()){
            String loginName = rs.getString("username");
            System.out.println("恭喜您, "+loginName+"登录成功");
        }else{
            System.out.println("登录失败, 密码或用户名不正确");
        }
        // 7.释放资源 关闭流
        connection.close();
    }
}

结果显示:
在这里插入图片描述

5.Druid连接池操作

5.1 准备配置文件

在Src目录下面新建一个druid.properties配置文件存放数据库连接信息

druid.properties

配置文件的信息如下:
其中username和password可以根据自己的数据库名称和密码设置

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///csdn?useSSL=false&useServerPrepStmts=true
# useSSL 忽略警告信息, userServer 开启PrepareStatement的预编译功能
username=root
password=123456
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000

5.2导入druid的jar包

jar包下载链接:
https://mvnrepository.com/artifact/com.alibaba/druid/1.1.12
在这里插入图片描述
下载完成之后复制到到lib目录中(如果没有lib就在当前模块中创建lib目录)
右键—>Add as Libaray (具体可以参照2.3.1)

在src中创建druid的目录,并创建DruidDemo测试类
在这里插入图片描述

5.3 Druid操作代码

关键代码: 这部分代码代替之前得到connection连接的操作

Properties prop = new Properties();
prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
// 4.根据配置文件获取数据库对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
Connection connection = dataSource.getConnection();

具体代码如下:

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;

public class DruidDemo {
    public static void main(String[] args) throws Exception {
    	// 获取当前文件的路径
    	System.out.println(System.getProperty("user.dir"));
        // 1.导入jar包
        // 2.定义配置文件
        // 3.加载配置文件
        Properties prop = new Properties();
        // jdbc-demo是自己的模块名称 可根据自己的模块名称进行改动
        prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));
        // 4.根据配置文件获取数据库对象
        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
        Connection connection = dataSource.getConnection();

        // ============================== 下面的和之前一样 ===============================

        String sql = "select * from tb_user";
        PreparedStatement pstmt = connection.prepareStatement(sql);

        //5.执行sql
        ResultSet rs = pstmt.executeQuery();

        //6.处理结果
        while(rs.next()){
            String id = rs.getString("id");
            String name = rs.getString("username");
            String money = rs.getString("password");
            System.out.println(id + "\t" +  name + "\t" + money);
        }
        // 7.释放资源 关闭流
        rs.close();
        connection.close();

    }
}

输出结果:
在这里插入图片描述

本人自己学习笔记代码,如有错误欢迎指正交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值