1. JDBC
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API。
JDBC是Java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它由一组用Java
语言编写的接口和类组成。
JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供
商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。
JDBC核心类和接口:
DriverManager:用于注册驱动
Connection: 表示与数据库创建的连接
Statement/PrepareStatement: 操作数据库sql语句的对象
ResultSet: 结果集或一张虚拟表
执行流程:
drop database if exists mydb16_jdbc;
create database if not exists mydb16_jdbc;
use mydb16_jdbc;
create table if not exists student(
sid int primary key auto_increment,
sname varchar(20),
age int
);
insert into student values(NULL,'宋江',30),(NULL,'武松',28),(NULL,'林冲',26);
select * from student;
create table if not exists user(
uid int primary key auto_increment,
username varchar(20),
password varchar(20)
);
insert into user values(NULL,'zhangsan','123456'),(NULL,'lisi','888888');
public class JdbcDemo1 {
public static void main(String[] args) throws Exception {
// 注意:使用JDBC规范,采用都是 java.sql包下的内容
//1 注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2 获得连接
String url = "jdbc:mysql://localhost:3306/mydb16_jdbc";
Connection conn = DriverManager.getConnection(url, "root", "123456");
//3获得执行sql语句的对象
Statement stmt = conn.createStatement();
//4执行SQL语句
ResultSet rs = stmt.executeQuery("select * from student");
//5处理结果集
while(rs.next()){
// 获得一行数据
Integer cid = rs.getInt("sid");
String cname = rs.getString("sname");
Integer age = rs.getInt("age");
System.out.println(cid + " , " + cname);
}
//6释放资源
rs.close();
stmt.close();
conn.close();
}
2. JDBC的SQL注入
简单的来讲,就是在写SQL语句时用字符串拼接,where查询条件拼接到了or,or后面的判别式为
真,即使SQL语句乱写,数据库也会链接成功。
将拼接的SQL语句打印出来:
由于编写的SQL语句,是在用户输入数据后,整合后再编译成SQL语句。所以为了避免SQL注入的
问题,使SQL语句在用户输入数据前,SQL语句已经完成编译,成为了完整的SQL语句,再进行填
充数据(需要在我们控制台录入后,提前把SQL语句编译成一行长长的字符串,防止注入) 。
PreparedStatement接口继承了Statement接口。执行SQL语句的方法没有区别!
PreparedStatement应用时,SQL字符串的参数都由?符号站位,被称为参数标记。在执行该SQL
语句前,要为每个?参数赋值。
当运行时动态地把参数传给PreprareStatement时,即使参数里有敏感字符如 or '1=1’数据库也会作
为一个参数或一个字段的属性值来处理而不会作为一个SQL指令,如此,就起到了防止SQL注入的
作用了!
我们可以看到输出的SQL是把整个参数用引号包起来,并把参数中的引号作为转义字符,从而避
免了参数也作为条件的一部分。