JavaWeb笔记-15-JDBC、数据增删改查、PreparedStatement(预处理语句)

1、JDBC(Java数据库连接)


1)导jar包:驱动!
2)加载驱动类:Class.forName(“类名”);
3)给出url、username、password,
4)使用DriverManager类来得到Connection对象!

2、JDBC核心类(接口)介绍


JDBC中的核心类有:DriverManager、Connection、Statement,和ResultSet!

1)DriverManger(驱动管理器)
    注册驱动:这可以让JDBC知道要使用的是哪个驱动;

2)Connection对象表示连接,与数据库通讯:获取到Connection,则数据库连接成功
    Connection对象用来获取Statement对象;

3)Statement:SQL语句发射器
    void executeUpdate(String sql):执行更新操作(insert、update、delete等);
    ResultSet executeQuery(String sql):执行查询操作,返回值为ResultSet;
4)ResultSet:表的结果集对象。

1)Connection

//获取Statement:
Statement stmt = con.createStatement(); 

2)Statement

方法:
//执行更新操作
int executeUpdate(String sql):即执行insert、update、delete等语句。

//执行查询操作,
ResultSet executeQuery(String sql):执行查询操作会返回ResultSet,即结果集。

//执行增、删、改、查所有SQL语句。
 boolean execute()   :boolean类型,表示SQL语句是否有结果集!

    //使用execute()方法执行的是更新语句,
            还需调用int getUpdateCount()来获取insert、update、delete语句所影响的行数。
    //使用execute()方法执行的是查询语句,
            还需调用ResultSet getResultSet()来获取select语句的查询结果。

3)ResultSet对象表示结果集

结果集:一个二维的表格,有行有列。

ResultSet内部的含有“行光标”。用来指示当前被操作的行

方法: 
boolean next():使“行光标”移动到下一行,并返回移动后的行是否存在;
XXX getXXX(int col):获取当前行指定列上的值
        参数就是列数,列数从1开始,而不是0。

3.1)ResultSet滚动结果集:移动”行光标”

获取结果集元数据
得到元数据: .getMetaData(). 返回值为RsultSetMetaData
        方法:
            getColumnCount(); 得到结果集列数
            getColumnName(int colindex); 获取指定的列名称

结果集特性:
    是否可滚动
    是否敏感  -- 结果集数据是否跟随数据库而变化
    是否可更新

    需要在connection创建statement时,确定特性
    Statement stmt = con.createStatement(int,int);

    第一个参数:
ResultSet.TYPE_FORWARD_ONLY:不滚动结果集;
ResultSet.TYPE_SCROLL_INSENSITIVE:滚动结果集,但结果集数据不会再跟随数据库而变化;
ResultSet.TYPE_SCROLL_SENSITIVE:滚动结果集,但结果集数据不会再跟随数据库而变化;
    第二个参数:
CONCUR_READ_ONLY:结果集是只读的,不能通过修改结果集而反向影响数据库;
CONCUR_UPDATABLE:结果集是可更新的,对结果集的更新可以反向影响数据库。

4)Preparedstatement(预编译)

是statement的子接口:
    强大之处:
        1)防SQL攻击
        2)提高代码可读性。可维护性
        3)提高效率。

用法:
    // 一、得到PreparedStatement
    //    a.给出SQL模板:所用参数用"?" 替代
    //    b.调用Connection.PrepareStatement();方法

    //二、 使用setXxx();方法给参数? 赋值。
    //三、调用pstmt的executeQuery();  此方法无参



服务器的工作:
    校验sql语句语法。
    编译:把sql语句变为函数。
    执行:调用函数

PreparedStatement(预处理语句)原理:
    前提:数据库支持预处理。(现在都支持)
        每个PreparedStatement都与sql模板绑定在一起。
    1)校验:先把sql模板给数据库进行校验
    2)编译
    3)执行:执行时只把参数传递过去即可。
    若第二次执行时,则不用再次编译

注:mysql默认预编译关闭,需要开启

3、使用.executeQuery(sql)使用Statement 查询数据库


    @Test
    public void fun3() throws Exception {
        Connection con = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            // 四大参数
            String driverClassName = "com.mysql.jdbc.Driver";
            String url = "jdbc:mysql://localhost:3306/mydb1";
            String username = "root";
            String password = "123456";

            // 得到连接
            Class.forName(driverClassName);  

            //加载驱动
            //需要导入mysql-connector-java-5.1.28-bin.jar
            con = DriverManager.getConnection(url, username, password);

            // 创建Statement语句发射器
            stmt = con.createStatement();

            // 执行查询   .executeQuery();
            String sql = "select * from stu";
            rs = stmt.executeQuery(sql); // 返回数据库文件对象

            //遍历输出
            //得到列    
            int count = rs.getMetaData().getColumnCount();

            //ResultSet.next(); 把行光标移动到第一行。 
            while(rs.next()){    
                for(int i = 1; i <= count; i++){
                    System.out.print(rs.getString(i));  ///得到列中对应值
                    if(i < count)
                    System.out.print(", ");
                }
                System.out.println();
            }

        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            //关闭结果集、语句发射器、连接
            if(rs != null) rs.close();    
            if(stmt != null) stmt.close();
            if(con != null) con.close();
        }
    }

4、使用.executeUpdate(sql)对数据库做增、改、删。


 @Test 
      public void fun1() throws SQLException, ClassNotFoundException {
          String driverClassName = "com.mysql.jdbc.Driver"; 
          String url ="jdbc:mysql://localhost:3306/mydb1"; 
          String username = "root"; String
          password = "123456";

          // 链接数据库 
         Class.forName(driverClassName); 

         // 加载驱动类 
         Connection con =DriverManager.getConnection(url, username, password);

         // 1.通过Connection对象创建statement 
                    // statement语句发射器。功能是向数据库发送sql语句。
        Statement stmt = con.createStatement(); 

        // 2.调用它的int executeUpdate(String sql),可以发送DML,DDL 
        // 对数据库做增、改、删。 
        String sql ="INSERT INTO stu VALUES('0003','WANGWU','23','3')"; 
        String sql2 ="UPDATE stu SET NAME='王五' WHERE NUMBER='0003'"; 
        String sql3 ="DELETE FROM stu"; 

        int r = stmt.executeUpdate(sql);    //统计操作步数

        System.out.println(r); 
    }

5、Preparedstatement(预编译) 及sql注入案例


public boolean login2(String username, String password)
            throws ClassNotFoundException, SQLException {
        /*
         * 1、得到Cinnecton 
         * 2、得到Statement  
         * 3、得到ResultSet  
         * 4、 返回
         */

        // 准备四大参数
        String driverClassName = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/mydb1";
        String sqlusername = "root";
        String sqlpassword = "123456";
        // 加载驱动类
        Class.forName(driverClassName);
        // 得到连接
        Connection con = DriverManager.getConnection(url, sqlusername, sqlpassword);

        ////////////////////////////////
        ////////////////////////////////

        // 一、得到PreparedStatement
        //    a.给出SQL模  板:所用参数用"?" 替代
        //    b.调用Connection.PrepareStatement();方法  
        String sql = "select * from t_user where username=? and password=?";
        PreparedStatement pstmt = con.prepareStatement(sql);

        //二、 使用setXxx();方法给参数? 赋值。
        pstmt.setString(1, username);  //给第一个问号赋值。值为username
        pstmt.setString(2, password);  //给第二个问号赋值。值为password

        //三、调用pstmt的executeQuery();  此方法无参
        ResultSet rs = pstmt.executeQuery();  //调用查询方法,向数据库发送查询语句。

        return rs.next();
    }

    //a' or 'a'='a   sql注入语句示例
    @Test
    public void fun2() throws ClassNotFoundException, SQLException{
        String username = "zhagnsan";
        String password = "123";

        boolean bool = login2(username,password);
        System.out.println(bool);
    }

猜你喜欢

转载自blog.csdn.net/qq_41307491/article/details/81448326
今日推荐