import java.sql.*;
import java.util.Scanner;
//测试 JDBC
//JDBC用来把java程序和数据库连接起来,目的是通过java代码操作数据库
public class TestJDBC {
public static void main(String[] args) throws Exception {
//method();//普通方式
//method2();//暴露SQL注入问题
method3();//解决SQL注入问题
}
//需求:按照 用户名 和 密码 查询用户信息
private static void method3() throws Exception{
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//获取连接
String url="jdbc:mysql://localhost:3306/jdbctest?characterEncoding=utf8";
String name="root";
String pwd="root";
Connection conn = DriverManager.getConnection(url,name,pwd);
//获取传输器Statement,执行SQL
//Statement st = conn.createStatement();//SQL注入攻击问题
//String sql = "select * from user where name='"+a+"' and pwd='"+b+"'";
//获取传输器PrepareStatement,执行SQL
//?叫做占位符,PreparedStatement只把SQL骨架发送给数据库
String sql = "select * from user where name=? and pwd=?";
PreparedStatement ps = conn.prepareStatement(sql);
//给SQL设置参数
ps.setString(1,"jack");//第一个?设置参数
ps.setString(2,"123");//第二个?设置参数
//执行SQL
ResultSet rs = ps.executeQuery();
//解析结果集
while(rs.next()){
for (int i = 1; i <= 3 ; i++) {
//按照索引查
System.out.println(rs.getString(i));
}
}
//释放资源
rs.close();
ps.close();
conn.close();
}
//暴露SQL注入问题--发生了SQL拼接
//需求:按照 用户名 和 密码 查询用户信息
private static void method2() throws Exception {
//中文查不出来数据:
//String url="jdbc:mysql://localhost:3306/jdbctest?characterEncoding=utf8";
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//获取连接
String url="jdbc:mysql://localhost:3306/jdbctest";
String name="root";
String pwd="root";
Connection conn = DriverManager.getConnection(url,name,pwd);
//获取传输器Statement,执行SQL
Statement st = conn.createStatement();
//TODO 测试SQL注入攻击问题
//是指当用户只输入数据时,恶意包含了特殊的SQL语句,改变了SQL语义
//导致只需要名字不需要密码也可以查看所有数据(数据泄露)
//名字输入后面两种值,都会产生SQL攻击问题: jack'# 或者 jack' or '1=1
String a = new Scanner(System.in).nextLine();
String b = new Scanner(System.in).nextLine();
String sql = "select * from user where name='"+a+"' and pwd='"+b+"'";
//执行SQL
ResultSet rs = st.executeQuery(sql);
//解析结果集
while(rs.next()){
for (int i = 1; i <= 3 ; i++) {
//按照索引查
System.out.println(rs.getString(i));
}
}
//释放资源
rs.close();
st.close();
conn.close();
}
//使用JDBC查询user表的数据
private static void method() throws Exception {
//1,注册驱动(jar包)
Class.forName("com.mysql.jdbc.Driver");
//2,连接数据库
//getConnection(1,2,3)-1是要连接哪个数据-2是用户名-3是密码
Connection con = DriverManager.getConnection(
//"协议//服务器的名字:数据库的端口号/数据库名",
//"jdbc:mysql://localhost:3306/jdbctest",
"jdbc:mysql:///jdbctest",
//url简写(使用本机使用默认的端口号)
"root","root");
//3,获取传输器Statement
Statement st = con.createStatement();
//4,执行SQL
String sql = "select * from user";
ResultSet rs = st.executeQuery(sql);
//5,解析结果集
while(rs.next()){ //next()判断有数据吗
//有数据就一个一个解析id/name/pwd
for (int i = 1; i <= 3; i++) {
System.out.println( rs.getString(i) );//按索引查;
}
String id2 = rs.getString("id");//按索引查
String name2 = rs.getString("name");//按索引查
String pwd2 = rs.getString("pwd");//按索引查
System.out.println(id2+name2+pwd2);
}
//6,释放资源
rs.close();
st.close();
con.close();
}
}
Java使用JDBC连接数据库的几种方式(普通方式与防止SQL注入方式)
最新推荐文章于 2022-07-22 14:10:12 发布