一,JDBC
–1,代码
package cn.tedu;
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();
}
}
--2,工具类
package cn.tedu;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class JDBCUtils {
/**
* 获取 数据库的连接
* @return Connection
* @throws Exception
*/
public static Connection getConnection() 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);
return conn;
}
/**
* 关闭JDBC的资源
* @param rs 结果集
* @param ps 传输器
* @param conn 连接
*/
public static void close(ResultSet rs, PreparedStatement ps,Connection conn){
if(rs != null){//为了防止空指针异常
try{
rs.close();
}catch (Exception e){
e.printStackTrace();
}finally { //为了close时又异常
rs = null;
}
}
if(ps != null){//为了防止空指针异常
try{
ps.close();
}catch (Exception e){
e.printStackTrace();
}finally { //为了close时又异常
ps = null;
}
}
if(conn != null){//为了防止空指针异常
try{
conn.close();
}catch (Exception e){
e.printStackTrace();
}finally { //为了close时又异常
conn = null;
}
}
}
}
--3,改造代码
package cn.tedu;
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(){
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//TODO 改造 调用工具类,获取和数据库的连接
conn = JDBCUtils.getConnection();
//获取传输器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=?";
ps = conn.prepareStatement(sql);
//给SQL设置参数
ps.setString(1, "jack");//第一个?设置参数
ps.setString(2, "123");//第二个?设置参数
//执行SQL
rs = ps.executeQuery();
//解析结果集
while (rs.next()) {
for (int i = 1; i <= 3; i++) {
//按照索引查
System.out.println(rs.getString(i));
}
}
}catch (Exception e){
e.printStackTrace();
}finally{ //释放资源,一定要被执行 !!!
//调用工具,完成关闭资源
JDBCUtils.close(rs,ps,conn);
}
}
//暴露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();
}
}