JDBC基础理解

一.JDBC的概念

        Java程序访问数据库,读写数据的一套数据库标准规范,不做任何实现。

二.基础使用

        1.导入jar包

        2.获取和数据库的连接(用户名、密码)

        3.通过程序执行SQL

        4.通过程序处理结果

三.个人代码理解

        1.入门案例理解

package c.jdbc;

import java.sql.*;

public class Test1 {
    public static void main(String[] args) throws Exception {
        //1.注册驱动 Driver字节码对象
        Class<?> driver = Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接(用户名,密码,端口号,库名)
        //连接哪里的哪个数据库
        String url = "jdbc:mysql://localhost:3306/cgb2106";
        //Java与数据库之间的通道
        Connection c = DriverManager.getConnection(url, "root", "root");
        //3.获取传输器
        //通道中传输数据的工具
        Statement s = c.createStatement();
        //4.执行SQL
        //使用工具得到的结果(数据)集
        ResultSet r = s.executeQuery("select * from dept");//执行查询的SQL语句
        //s.executeUpdate();执行增删改SQL语句
        //5.处理结果集
        while(r.next()){
            String s1 = r.getString(1);//获取第一列的数据
            String s2 = r.getString("deptno");//获取指定字段名的值
            String s3 = r.getString(3);//获取第三列的数据

            System.out.println(s1+","+s2 +","+ s3);
        }
        //6.释放资源
        r.close();//释放结果集
        s.close();//释放传输器
        c.close();//释放连接
    }
}

         2.SQL注入理解

method2()中出现了SQL注入攻击的现象

原因是:用户输入了非法字符#,#在SQL语句中是注释的意思

是的Statement传输器功能不够强大,所以我们换一个更强大的传输器来解决这个问题。

package com.yu.jdbc;

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

public class Test2 {
    public static void main(String[] args) throws Exception {
        //method1();
        //method2();SQL注入攻击
        method3();//解决SQL注入攻击
    }

    private static void method3() throws Exception {
        Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/zsl2106?characterEncoding=utf8";
        Connection c = DriverManager.getConnection(url, "root", "root");
        //Statement s = c.createStatement();--传输器不安全,低效
        String sql = "select * from user where name=? and password=?";//?--占位符
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入账号:");
        String s1 = scanner.nextLine();
        System.out.println("请输入密码:");
        String s2 = scanner.nextLine();
        PreparedStatement p = c.prepareStatement(sql);//使用预编译SQL接口,高效
        p.setString(1,s1);//将占位符替换
        p.setString(2,s2);//第一个参数代表第几个?,第二个参数代表?传入的内容
        ResultSet r = p.executeQuery();
        if (r.next()){
            System.out.println("登录成功!");
        }else {
            System.out.println("登录失败!");
        }
        p.close;
        c.close;

    }

    private static void method2() throws Exception {
        Class<?> clazz = Class.forName("com.mysql.jdbc.Driver");
        Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/zsl2106?characterEncoding=utf8", "root", "root");
        Statement s = c.createStatement();
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入账号:");
        String s1 = scanner.nextLine();
        System.out.println("请输入密码:");
        String s2 = scanner.nextLine();
        //当用户输入特殊数据时,发生的现象叫SQL注入攻击
        //当用户输入'#时,SQL出现了特殊符号#,在SQL里面表示注释
        //只要输入用户名正确,不需要密码也能登录
        String sql = "select *  from user where name='"+ s1+"'and password='"+s2+"'";
        ResultSet r = s.executeQuery(sql);
        if(r.next()){
            System.out.println("登录成功!");
        }else{
            System.out.println("登录失败!");
        }
        r.close();
        s.close();
        c.close();
    }

    private static void method1() throws Exception {
        Class<?> clazz = Class.forName("com.mysql.jdbc.Driver");
        //c--连接器(通道)   s--传输器(工具)    r--结果集(结果)
        Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/zsl2106?characterEncoding=utf8", "root", "root");
        Statement s = c.createStatement();
        s.executeUpdate("create table user(id int primary key auto_increment,name varchar(20),password varchar(20))");
        s.executeUpdate("insert into user (id,name,password) values(null,'张世龙','123456'),(null,'海绵宝宝','123456')");
        ResultSet r = s.executeQuery("select * from user");
        while(r.next()){
            String s1 = r.getString(1);
            String s2 = r.getString(2);
            String s3 = r.getString(3);
            System.out.println(s1+","+s2+","+s3);
        }
        r.close();
        s.close();
        c.close();
    }
}

Statement:不安全,低效,SQL拼接复杂

PreparedStatement:安全,高效,不需要SQL拼接直接用?作为占位符  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值