Statement接口

  • 用于执行静态SQL语句并返回它所生成结果的对象

  • 三种Statement类:

    • Statement

      由createStatement创建,用于发送简单的SQL语句(不带参的)

    • PreparedStatement

      继承自Statement接口,由PrepareStatement创建,用于发送含有一个或多个输入参数的sql语句.PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入.我们一般都用PreparedStatement.

    • CallableStatement

      继承自PreparedStatement.由方法prePareCall创建,用于调用存储过程.

  • 常用的Statement方法

    • execute():运行语句,返回是否有结果集

    • executeQuery():运行select语句,返回ResultSet结果集

    • executeUpdate():运行insert/update/delete操作,返回更新的行数

Code

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * 测试执行SQL语句,以及SQL注入问题
 * @author Matrix42
 *
 */
public class Demo02 {
    public static void main(String[] args) {

        try {
            //加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //建立连接 耗时 耗资源
            //连接对象内部包含了Socket对象,是一个远程的连接,比较耗时,这是Connection对象管理的一个要点!
            //真正开发中,为了提高效率,都会使用连接池来管理连接对象!
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","123456");
            Statement stmt = conn.createStatement();
            //Statement要使用变量必须拼字符串 还有sql注入问题
            //String sql = "insert into t_user(username,pwd,regTime) values('赵六','6666',now())";
            //stmt.execute(sql);

            //测试SQL注入
            String id = "5 or 1=1";//外部传入的参数 恶意加上or 1=1
            String sql = "delete from t_user where id ="+id;
            stmt.execute(sql);
            //内容全部删除

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
public class Demo03 {
    public static void main(String[] args) {

        try {
            //加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","123456");
            String sql = "insert into t_user(username,pwd,regTime) values(?,?,?)";//?为占位符

            PreparedStatement ps = conn.prepareStatement(sql);
            //参数索引是从1开始计算,而不是0
            //ps.setString(1, "matrix42");
            //ps.setString(2, "123456");

            //可以使用setObject处理参数
            ps.setObject(1, "一会");
            ps.setObject(2, "6789");
            ps.setObject(3, new java.sql.Date(System.currentTimeMillis()));

            ps.execute();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

ResultSet接口

  • Statement执行SQL语句时返回ResultSet结果集

  • ResultSet提供的检索不同类型字段的方法,常用的有:

    • getString() 获得在数据库里是varchar,char等数据类型的对象

    • getFloat() 获得在数据库里是Float类型的对象

    • getDate() 获得在数据库里是Date类型的数据

    • getBoolean() 获得在数据库里是Boolean类型的数据

  • 依次关闭使用的对象及连接

  • ResultSet -> Statement -> Connection

Code

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Demo04 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            // 加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/testjdbc", "root", "123456");
            String sql = "select * from t_user where id > ?";// ?为占位符

            ps = conn.prepareStatement(sql);

            ps.setObject(1, 2);

            rs = ps.executeQuery();

            while (rs.next()) {
                System.out.println(rs.getInt(1));
                System.out.println(rs.getString(2));
                System.out.println(rs.getString(3));
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //一定要分开,防止一个出现异常其余不能关闭
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                if (ps!=null) {
                    ps.close();
                }
            } catch(SQLException e){
                e.printStackTrace();
            }
            try {
                if (conn!=null) {
                    conn.close();
                }
            } catch(SQLException e){
                e.printStackTrace();
            }
        }
    }
}