JDBC
JDBC概述
JDBC是专门用来通过java程序操作数据库的,JDBC还是一套标准,支持对各种数据库产品的操作。
测试JDBC流程
1.注册驱动
2.获取数据库的连接
3.获取传输器
4.利用传输器执行SQL,返回结果
5.处理结果集
6.释放资源
SQL攻击
出现了特殊符号#,改变了SQL语义
解决方案:利用全新的传输器PreparedStatement,本质上是把SQL骨架和SQL的参数分开执行,遇到了#只是当做一个普通的文本而不是注释符号了。
优点:省去了拼接SQL语句的麻烦,防止了SQL攻击,高效。
代码实现
普通方式
package cn.tedu.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
//测试 jdbc
//1,导入jar包 2,连接数据库
public class Test1 {
public static void main(String[] args) throws Exception {
//1,注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2,获取数据库的连接
//数据传输协议 数据库的ip 端口号 数据库名
String url = "jdbc:mysql://localhost:3306/cgb2107";
Connection c = DriverManager.getConnection(url,"root","root");
//3,获取传输器
Statement s = c.createStatement();
//4,利用传输器执行SQL,返回结果
ResultSet r = s.executeQuery("select * from dept");//执行查询语句
//5,处理结果
while( r.next() ){//next()判断有数据吗,有就返回true
//解析数据,用getXxx()获取每个字段的值--参数可以是字段名或者字段索引
int a = r.getInt(1);//获取第1列的值
System.out.println(a);
String b = r.getString("dname");//获取dname字段的值
System.out.println(b);
String loc = r.getString(3);//获取第3列的值
System.out.println(loc);
}
//6,释放资源
r.close();//结果集
s.close();//传输器
c.close();//连接
}
}
利用全新的传输器,防止SQL攻击
总结:
1, SQL攻击:出现了特殊的符号#,改变了SQL语义,本质上是因为用Statement
2, 解决方案:利用全新的传输器PreparedStatement,
本质上 把SQL骨架和SQL的参数分开执行的,遇到了#只是当做一个普通的文本而不是注释符号了
3, 优点: 省去了拼接SQL语句的麻烦, 防止了SQL攻击, 高效
*/
public class Test1 {
public static void main(String[] args) {
// method();//用普通的传输器
method2();//用安全的传输器
}
//用安全的传输器,解决SQL攻击
private static void method2() {
try {
//调用封装的方法,获取数据库的连接
Connection c = getConnection();
//3,准备SQL
String a = new Scanner(System.in).nextLine() ;
String b = new Scanner(System.in).nextLine() ;
//SQL骨架,?叫占位符
String sql = "select * from user where name=? and password=?";
//4,获取 新的传输器
PreparedStatement s = c.prepareStatement(sql);
//给SQL设置参数
s.setString(1,a);//给第1个?的位置,设置a的值
s.setString(2,b);//给第2个?的位置,设置b的值
//执行拼接好的 SQL
ResultSet r = s.executeQuery();
//5,判断是否查到了数据,就直接登录,否则登录失败
if(r.next()){
System.out.println("恭喜您,登录成功~");
}else{
System.out.println("登录失败~");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//TODO 6,释放资源
r.close();
s.close();
c.close();
}
}
/**
* 封装了方法,用来 获取数据库的连接
*/
public static Connection getConnection() throws Exception{
//1,注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2,获取数据库的连接
String url = "jdbc:mysql://localhost:3306/cgb2107";
Connection c = DriverManager.getConnection(url,"root","root");
return c ;//返回给调用者
}