JDBC中的遍历及安全问题

在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。

需要完整版PDF学习资源

需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!


根据列名进行查询

/**

  • 方式一

  • 根据列名

  • JDBC查询数据库表的数据

*/

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.Statement;

public class TestDQL {

public static void main(String[] args) throws Exception{

//1.注册驱动

Class.forName(“com.mysql.jdbc.Driver”);

//2.获得连接

String url = “jdbc:mysql://localhost:3306/companydb?useUnicode = true&characterEncoding = utf8”;

String user = “root”;

String password = “root”;

Connection connection = DriverManager.getConnection(url,user,password);

//3.获取执行的对象

Statement statement = connection.createStatement();

//4.编写SQL语句 查询

String sql = “select student_id,student_name,sex,birthday,phone,GradeId from stu”;

ResultSet resultSet = statement.executeQuery(sql);

//5.处理结果

while(resultSet.next()){//判断是否有下一行

//1.根据列名获取当前行的每一列数据

String student_id = resultSet.getString(“student_id”);

String student_name = resultSet.getString(“student_name”);

String sex = resultSet.getString(“sex”);

String birthday = resultSet.getString(“birthday”);

String phone = resultSet.getString(“phone”);

String gradeId = resultSet.getString(“gradeId”);

System.out.println(student_id+“\t”+student_name+“\t”+sex+“\t”+birthday+“\t”+phone+“\t”+gradeId);

}

//6.释放资源

resultSet.close();

statement.close();

connection.close();

}

}

根据列的下标进行查询

//方式二前面步骤如上:

//5.处理结果

while(resultSet.next()){//判断是否有下一行

//1.根据列名获取当前行的每一列数据

String student_id = resultSet.getString(1);

String student_name = resultSet.getString(2);

String sex = resultSet.getString(3);

String birthday = resultSet.getString(4);

String phone = resultSet.getString(5);

String gradeId = resultSet.getString(6);

System.out.println(student_id+“\t”+student_name+“\t”+sex+“\t”+birthday+“\t”+phone+“\t”+gradeId);

}

常见的错误


  • java.lang.ClassNotFoundException :找不到类(类名书写错误、没有导入jar包);

  • com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException :与SQL语句相关的错误(表名列名书写错误、约束错误、插入的值是String类型,但是没有加单引号)建议:在客户端工具中测试sql语句后,再粘贴到代码中来;

  • com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry ‘1003’ for key ‘PRIMARY’ :主键值已存在,更改要插入的主键值;

  • com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:Unknown column ‘password’ in :可能输入的值的类型不对,确定插入元素时,对应的值的类型是否正确;

SQL注入问题



当用户输入的数据中有SQL关键字或语法时,并且参与了SQL语句的编译,导致SQL语句编译后条件结果为true,一直得到正确的结果。称为SQL注入;

  • 如:XXX‘ or 1 = 1;# 将后面部分注释

避免SQL注入

由于编写的SQL语句,是在用户输入数据后,整合后再编译成SQL语句。所以为了避免SQL注入的问题,使SQL语句在用户输入数据前,SQL语句已经完成编译,成为了完整的SQL语句,再进行填充数据;

PreparedStatement



PreparedStatement接口继承了Statement接口。执行SQL语句的方法没有区别;

PreparedStatement的应用

  • 预编译SQL语句,效率高;

  • 安全,避免SQL注入;

  • 可以动态的填充数据,执行多个同构的SQL语句;

参数标记

//1.预编译SQL语句

PreparedStatement preparedStatement = connection.prepareStatement(sql);

  • 应用PreparedStatement时,SQL字符串的参数都由?符号站位,被称为参数标记。在执行该SQL语句前,要为每个参数赋值;
动态参数绑定

preparedStatement.setXxx(下标,值);参数下标是从1开始,为指定占位符下标绑定值;

//2.为占位符下标赋值

preparedStatement.setString(1,username);

preparedStatement.setString(2,password);

综合案例—登录

==========================================================================

创建表并插入数据:

CREATE TABLE user(

id INT PRIMARY KEY AUTO_INCREMENT,

username VARCHAR(20) NOT NULL,

password VARCHAR(20) NOT NULL,

phone VARCHAR(11)

)CHARSET = utf8;

INSERT INTO user(username, password,phone) VALUES (‘kaka’,‘123’,‘12345678910’);

INSERT INTO user(username, password,phone) VALUES (‘tangtang’,‘456’,NULL);

SELECT * FROM user;

实现登录:

/**

  • 登录操作

  • 通过控制台,用户输入用户名和密码;

  • 用户输入的用户名和密码作为参数,编写查询SQL语句;

  • 如果查询到用户,则用户存在,提示登录成功,反之,提示失败;

*/

import java.util.Scanner;

import java.sql.*;

public class TestSafeLogin {

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值