Day06 jdbc

一,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();
	    }
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值