JDBC
主要用于数据库与Java的连接
基本案例:
package cn.tedu.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
//测试jdbc案例
public class TestJDBC01 {
public static void main(String[] args) throws Exception {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url="jdbc:mysql://localhost:3306/user2";
Connection c = DriverManager.getConnection(url, "root", "123");
//3.获取传输器
Statement s = c.createStatement();
//4.执行SQL
ResultSet r = s.executeQuery("select * from dept");
//5.处理结果集
while (r.next()){//next()判断有没有数据,有数据就返回true
String a = r.getString(1);//获取第一列的数据
// String b = r.getString("deptno");//获取指定字段的值
String b = r.getString(2);
String x = r.getString(3);
System.out.println(a+" "+b+" "+x);
}
//6.释放资源
//结果集
r.close();
// 传输器
s.close();
// 连接
c.close();
}
}
在执行SQL的语句时,当用户输入特殊符号后,可能会造成SQL注入攻击,例:用户名:jack'#
#在SQL中的意思是注释,会导致用户只用输入账号就能登录成功
SQL注入攻击的解决方案
不使用Statement传输器,使用PreparedStatement传输器
Statement传输器:低效,不安全
PreparedStatement传输器:高效,安全
PreparedStatement传输器会先加载SQL骨架,并且每个字段的值都是分开赋值且只能替代“?”,当传入#时,不会在产生注销的效果
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/user2?characterEncoding=utf8";
//获取数据库的连接
Connection c = DriverManager.getConnection(url, "root", "123");
//获取传输器
String a=new Scanner(System.in).nextLine();
String b=new Scanner(System.in).nextLine();
String sql="select * from user where name=? and password=?";
PreparedStatement ps = c.prepareStatement(sql);
ps.setString(1,a);
ps.setString(2,b);
//执行SQL
ResultSet r = ps.executeQuery();
if (r.next()){
System.out.println("登陆成功");
}else{
System.out.println("登录失败");
}
r.close();
ps.close();
c.close();