JDBC知识

JDBC

JDBC概述
JDBC是专门用来通过java程序操作数据库的,JDBC还是一套标准,支持对各种数据库产品的操作。

测试JDBC流程
1.注册驱动
2.获取数据库的连接
3.获取传输器
4.利用传输器执行SQL,返回结果
5.处理结果集
6.释放资源

SQL攻击

出现了特殊符号#,改变了SQL语义
解决方案:利用全新的传输器PreparedStatement,本质上是把SQL骨架和SQL的参数分开执行,遇到了#只是当做一个普通的文本而不是注释符号了。
优点:省去了拼接SQL语句的麻烦,防止了SQL攻击,高效。

代码实现

普通方式

package cn.tedu.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

//测试 jdbc
//1,导入jar包  2,连接数据库
public class Test1 {
    public static void main(String[] args) throws Exception {
        //1,注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2,获取数据库的连接
                    //数据传输协议   数据库的ip 端口号 数据库名
        String url = "jdbc:mysql://localhost:3306/cgb2107";
        Connection c = DriverManager.getConnection(url,"root","root");
        //3,获取传输器
        Statement s = c.createStatement();
        //4,利用传输器执行SQL,返回结果
        ResultSet r = s.executeQuery("select * from dept");//执行查询语句
        //5,处理结果
        while( r.next() ){//next()判断有数据吗,有就返回true
            //解析数据,用getXxx()获取每个字段的值--参数可以是字段名或者字段索引
            int a = r.getInt(1);//获取第1列的值
            System.out.println(a);
            String b = r.getString("dname");//获取dname字段的值
            System.out.println(b);
            String loc = r.getString(3);//获取第3列的值
            System.out.println(loc);
        }
        //6,释放资源
        r.close();//结果集
        s.close();//传输器
        c.close();//连接
    }
}


利用全新的传输器,防止SQL攻击

总结:
1, SQL攻击:出现了特殊的符号#,改变了SQL语义,本质上是因为用Statement
2, 解决方案:利用全新的传输器PreparedStatement,
    本质上 把SQL骨架和SQL的参数分开执行的,遇到了#只是当做一个普通的文本而不是注释符号了
3, 优点: 省去了拼接SQL语句的麻烦, 防止了SQL攻击, 高效
 */
public class Test1 {
    public static void main(String[] args) {
//        method();//用普通的传输器
        method2();//用安全的传输器
    }
    //用安全的传输器,解决SQL攻击
    private static void method2() {
        try {
            //调用封装的方法,获取数据库的连接
            Connection c = getConnection();
            //3,准备SQL
            String a = new Scanner(System.in).nextLine() ;
            String b = new Scanner(System.in).nextLine() ;
            //SQL骨架,?叫占位符
            String sql = "select * from user where name=? and password=?";
            //4,获取 新的传输器
            PreparedStatement s = c.prepareStatement(sql);
            //给SQL设置参数
            s.setString(1,a);//给第1个?的位置,设置a的值
            s.setString(2,b);//给第2个?的位置,设置b的值
            //执行拼接好的 SQL
            ResultSet r = s.executeQuery();
            //5,判断是否查到了数据,就直接登录,否则登录失败
            if(r.next()){
                System.out.println("恭喜您,登录成功~");
            }else{
                System.out.println("登录失败~");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            //TODO 6,释放资源
            r.close();
            s.close();
            c.close();
        }
    }
        /**
     * 封装了方法,用来 获取数据库的连接
     */
    public static Connection getConnection() throws Exception{
        //1,注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2,获取数据库的连接
        String url = "jdbc:mysql://localhost:3306/cgb2107";
        Connection c = DriverManager.getConnection(url,"root","root");
        return c ;//返回给调用者
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值