一.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拼接直接用?作为占位符