第一章:JDBC操作数据库

本文介绍了JDBC连接数据库的步骤,强调了防止SQL注入的重要性,并详细解释了如何使用PreparedStatement来解决这个问题。通过示例展示了PreparedStatement的使用,以及其在性能、安全性和代码可读性上的优势。
摘要由CSDN通过智能技术生成

第一章:JDBC操作数据库

JDBC: Java数据库连接技术(Java DataBase Connectivity),能实现Java程序对各种数据库的访问

JDBC是一个java提供连接数据库的API,我们可以通过JDBC连接和操作数据库数据。

1. JDBC连接数据库的步骤:

在这里插入图片描述

  1. Class.forName() : 加载驱动
  2. 使用DriverManager获取Connection连接
  3. 创建Sql语句
  4. 返回查询结果
  5. 释放资源

示例:

//Class.forName() : 加载驱动
Class.forName("com.mysql.jdbc.Driver");
//使用DriverManager获取Connection连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql","root","root");
//创建statement对象
Statement stat = conn.createStatement();
//创建Sql语句
String sql="select * from student";
//返回查询结果
ResultSet rs =stat.executeQuery(sql);
//遍历取值
	while(rs.next()) {
		System.out.println(rs.getInt("StudentNo")+"\t"+rs.getString("StudentName"));
	}
//释放资源
stat.close();
conn.close

2. JDBC防止SQL注入问题

  • SQL注入: Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之一。

​ SQL注入发生的原因:我们在第三步写SQL语句的时候,我们使用的参数都是拼接的,并且他会做为SQL代码去执行,也就是用户输入的信息,我们是直接拼接到代码块上的,这样就可以通过这个漏洞来成功验证。

例如:

我们需要用户输入学号和名字来验证:

  • String sql=“select * from student where StudentNo =”+2+" and StudentName=‘“+“测试触发器”+”’";

​ SQL注入问题就是用户输入的信息,我们直接当成源代码执行了,也就是说当用户输入null||1=1,这种恒等式的时候,我们的筛选条件将会失效。

  • String sql=“select * from student where StudentNo =”+“null||1=1”+" and StudentName=‘“+“测试触发器”+”’";

​ 因为我们是直接拼接字符串,所以很多敲过代码的有可能通过这个去直接登录进去,这导致我们的账号的不安全的,同时系统也存在这种的SQL注入问题,那么我们就要使用占位符的方式去解决,而不是拼接字符串。

3. preparedStatement解决SQL注入问题

Statement与PreparedStatement区别:

  • Statement由方法createStatement()创建,该对象用于发送简单的SQL语句

  • PreparedStatement由方法prepareStatement()创建,该对象用于发送带有一个或者多个输入参数的SQL语句

    • SQL语句使用“?”作为数据占位符
    • 使用setXxx()方法设置数据
  • PreparedStatement-----预编译

  • 效率、性能、开销

  • 安全性

  • 代码可读性

preparedStatement和Statement的使用几乎一致,请看下面示例:

//PreparedStatement可替换变量(在SQL语句中可以包含?)
String sql = "select * from user where id=?";
PreparedStatement ps = conn.prepareStatement(sql);
int id = 1001;
ps.setInt(1,id);
ResultSet rs = ps.executeQuery();
/**==================华丽丽滴分割线====================*/
//Statement用法
int id = 1001;
String sql = "select * from user where id="+id;
Statement stmt = conn.CreateStatement();
ResultSet rs = stmt.executeQuery(sql);
  • 我们在需要使用参数的地方用号占位,然后使用setXxx()方法通过下标去设置参数,下标从1开始。
  • setXxx()方法set后面的是要设置参数的类型,首字母大写。
  • 获取的时候我们用conn连接对象的prepareStatement方法获取,注意这里的prepare不加d然后返回一个preparedStatement对象(这里是prepared,加d)。
  • 调用查询方法时,我们一般使用executeQuery(),增删改的时候我们用executeUpdate()。

我们使用prepareStatement就可以解决SQL注入问题了。

4. 总结

JDBC优点:

  • 不必为不同的数据库专门编写不同的程序,而只需要加载不同的数据库驱动即可

JDBC的编程步骤:

  • Class.forName()加载驱动
  • DriverManager.getConnection(URL,用户名,密码)获得数据库连接
  • 获得Statement/PreparedStatement对象,执行SQL语句
  • 处理执行结果,释放资源
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值