JavaWeb:JDBC(API详解下、数据库连接池)

1.PreparedStatement

SQL注入:SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。

SQL注入演示

/*
* 用户登录
* */

import com.itheima.pojo.Account;
import org.junit.Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;

public class JDBCDemo06 {
    @Test
    public void TestLogin() throws Exception{
        //1.注册驱动
        //Class.forName("com.mysql.jdbc.Driver");

        //2.获取链接
        String url = "jdbc:mysql://127.0.0.1:3306/test?useSSL=false";
        String username = "root";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url, username, password);
        //接受用户名和密码(输入的)
        String name = "zhangsan";
        String pwd = "123";

        String sql = "select * from user where username = '"+name+"' and password = '"+pwd+"'";

        //获取stmt对象
        Statement stmt = conn.createStatement();

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

        //判断是否成功登录
        if (rs.next()){
            System.out.println("登录成功");

        }
        else {
            System.out.println("登录失败");
        }


        //7.释放资源
        rs.close();
        stmt.close();
        conn.close();
    }

    //演示sql注入
    @Test
    public void TestLogin_Inject() throws Exception{
        //1.注册驱动
        //Class.forName("com.mysql.jdbc.Driver");

        //2.获取链接
        String url = "jdbc:mysql://127.0.0.1:3306/test?useSSL=false";
        String username = "root";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url, username, password);
        //接受用户名和密码(输入的)
        String name = "sadffgfgd";
        String pwd = "'or'1'='1";

        String sql = "select * from user where username = '"+name+"' and password = '"+pwd+"'";
        System.out.println(sql);
        //获取stmt对象
        Statement stmt = conn.createStatement();

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

        //判断是否成功登录
        if (rs.next()){
            System.out.println("登录成功");

        }
        else {
            System.out.println("登录失败");
        }


        //7.释放资源
        rs.close();
        stmt.close();
        conn.close();
    }

}

PreparedStatement作用:预编译SQL语句并执行:预防SQL注入问题

获取PreparedStatement对象

// SQL语句中的参数值,使用?占位符替代
String sql = "select * from user where username = ? and password = ?";

//通过Connection对象获取,并传入对应的sql语句
PreparedStatement pstmt = conn.prepareStatement(sql);

设置参数值

PreparedStatement对象: 
setXxx(参数1,参数2):给﹖赋值
Xxx:数据类型﹔如setlnt(参数1,参数2)
参数;
    参数1:?的位置编号,从1开始
    参数2:?的值

执行SQL

executeUpdate(); / executeQuery(); :不需要再传递sql

再次尝试注入,失败

/*
* API详解
* */

import org.junit.Test;

import java.sql.*;

public class JDBCDemo07_PreparedStatement {
    @Test
    public void TestLogin() throws Exception{
        //1.注册驱动
        //Class.forName("com.mysql.jdbc.Driver");

        //2.获取链接
        String url = "jdbc:mysql://127.0.0.1:3306/test?useSSL=false";
        String username = "root";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url, username, password);
        //接受用户名和密码(输入的)
        String name = "zhangsan";
        String pwd = "'or'1'='1";

        String sql = "select * from user where username = ? and password = ?";

        //获取pstmt对象
        PreparedStatement pstmt = conn.prepareStatement(sql);

        //设置?的值
        pstmt.setString(1,name);
        pstmt.setString(2,pwd);

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


        //判断是否成功登录
        if (rs.next()){
            System.out.println("登录成功");

        }
        else {
            System.out.println("登录失败");
        }


        //7.释放资源
        rs.close();
        pstmt.close();
        conn.close();
    }

    

}

原理:将敏感字符进行转义

2.数据库连接池

2.1简介

数据库连接池是个容器,负责分配、管理数据库连掷(Connection)

它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;

释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏

好处:

资源重用

提升系统响应速度

避免数据库连接遗漏

2.2数据库连接池实现

标准接口:DataSource

官方(SUN)提供的数据库连接池标准接口,由第三方组织实现此接口。

功能:获取连接

Connection getConnection()

常见的数据库连接池:

DBCP

C3P0

Druid

Druid(德鲁伊)

Druid连接池是阿里巴巴开源的数据库连接池项目

功能强大,性能优秀,是Java语言最好的数据库连接池之一

2.3Driud使用步骤

1.导入jar包druid-1.1.12.jar

2.定义配置文件

3.加载配置文件

4.获取数据库连接池对象

5.获取连接

import com.alibaba.druid.pool.DruidDataSourceFactory;

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

/*
* Druid数据库连接池演示
* */
public class DruidDemo {
    public static void main(String[] args) throws Exception {
        //导入jar包

        //定义配置文件

        //加载配置文件
        Properties prop = new Properties();
        prop.load(new FileInputStream("src/druid.properties"));
        //获取连接池对象

        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);

        //获取数据库连接
        Connection connection = dataSource.getConnection();

        System.out.println(connection);

        //System.out.println(System.getProperty("user.dir"));
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值