Java使用JDBC连接数据库的几种方式(普通方式与防止SQL注入方式)

import java.sql.*;
import java.util.Scanner;

//测试 JDBC
//JDBC用来把java程序和数据库连接起来,目的是通过java代码操作数据库
public class TestJDBC {
    public static void main(String[] args) throws Exception {
		//method();//普通方式
		//method2();//暴露SQL注入问题
          method3();//解决SQL注入问题
    }
    
    //需求:按照 用户名 和 密码 查询用户信息
    private static void method3() throws Exception{
        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //获取连接
		String url="jdbc:mysql://localhost:3306/jdbctest?characterEncoding=utf8";
        String name="root";
        String pwd="root";
        Connection conn = DriverManager.getConnection(url,name,pwd);
        //获取传输器Statement,执行SQL
		//Statement st = conn.createStatement();//SQL注入攻击问题
		//String sql = "select * from user where name='"+a+"' and pwd='"+b+"'";

        //获取传输器PrepareStatement,执行SQL
        //?叫做占位符,PreparedStatement只把SQL骨架发送给数据库
        String sql = "select * from user where name=? and pwd=?";
        PreparedStatement ps = conn.prepareStatement(sql);
        //给SQL设置参数
        ps.setString(1,"jack");//第一个?设置参数
        ps.setString(2,"123");//第二个?设置参数
        //执行SQL
        ResultSet rs = ps.executeQuery();
        //解析结果集
        while(rs.next()){
            for (int i = 1; i <= 3 ; i++) {
                //按照索引查
                System.out.println(rs.getString(i));
            }
        }
        //释放资源
        rs.close();
        ps.close();
        conn.close();
    }
    //暴露SQL注入问题--发生了SQL拼接
    //需求:按照 用户名 和 密码 查询用户信息
    
    private static void method2() throws Exception {
        //中文查不出来数据:
		//String url="jdbc:mysql://localhost:3306/jdbctest?characterEncoding=utf8";
        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //获取连接
        String url="jdbc:mysql://localhost:3306/jdbctest";
        String name="root";
        String pwd="root";
        Connection conn = DriverManager.getConnection(url,name,pwd);
        //获取传输器Statement,执行SQL
        Statement st = conn.createStatement();

        //TODO 测试SQL注入攻击问题
        //是指当用户只输入数据时,恶意包含了特殊的SQL语句,改变了SQL语义
        //导致只需要名字不需要密码也可以查看所有数据(数据泄露)
        //名字输入后面两种值,都会产生SQL攻击问题: jack'# 或者 jack' or '1=1
        String a = new Scanner(System.in).nextLine();
        String b = new Scanner(System.in).nextLine();
		String sql = "select * from user where name='"+a+"' and pwd='"+b+"'";
        //执行SQL
        ResultSet rs = st.executeQuery(sql);
        //解析结果集
        while(rs.next()){
            for (int i = 1; i <= 3 ; i++) {
                //按照索引查
                System.out.println(rs.getString(i));
            }
        }
        //释放资源
        rs.close();
        st.close();
        conn.close();
    }
    
    //使用JDBC查询user表的数据
    private static void method() throws Exception {
        //1,注册驱动(jar包)
        Class.forName("com.mysql.jdbc.Driver");
        //2,连接数据库
        //getConnection(1,2,3)-1是要连接哪个数据-2是用户名-3是密码
        Connection con = DriverManager.getConnection(
				//"协议//服务器的名字:数据库的端口号/数据库名",
				//"jdbc:mysql://localhost:3306/jdbctest",
                "jdbc:mysql:///jdbctest",
                    //url简写(使用本机使用默认的端口号)
                    "root","root");
        //3,获取传输器Statement
        Statement st = con.createStatement();
        //4,执行SQL
        String sql = "select * from user";
        ResultSet rs = st.executeQuery(sql);
        //5,解析结果集
        while(rs.next()){ //next()判断有数据吗
            //有数据就一个一个解析id/name/pwd
            for (int i = 1; i <= 3; i++) {
                System.out.println( rs.getString(i) );//按索引查;
            }

            String id2 = rs.getString("id");//按索引查
            String name2 = rs.getString("name");//按索引查
            String pwd2 = rs.getString("pwd");//按索引查
            System.out.println(id2+name2+pwd2);
        }
        //6,释放资源
        rs.close();
        st.close();
        con.close();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

拨浪鼓手

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

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

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

打赏作者

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

抵扣说明:

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

余额充值