jdbc操作数据库以及防止sql注入

public class pr {
    public static void main(String[] args) {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;

        try {
            // 加载驱动
//            DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());   不用这种方法加载,因为源码里面已经有static代码块加载驱动了,直接加载类进内存就行了
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 连接到数据库
            conn = DriverManager.getConnection("jdbc:mysql://localhost/meiduo_mall","root","xxxxxx");

            // 创建Statement对象
            st = conn.createStatement();

            // 执行查询,得到结果集
            String sql = "select * from tb_goods_category";
            rs = st.executeQuery(sql);

            // 遍历查询每一条数据
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                System.out.println(id + "---" + name);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 释放资源
            JDBCutils.release(conn,st,rs);      // 单独写一个工具类来释放资源
        }
    }

}

工具类:

public class JDBCutils {
    
    public static void release(Connection conn,Statement st,ResultSet rs){
        closeConn(conn);
        closeSt(st);
        closeRs(rs);
    }

    private static void closeRs(ResultSet rs){
        try {
            if (rs != null){
                rs.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            rs = null;
        }
    }

    public static void closeSt(Statement st){
        try {
            if (st != null){
                st.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            st = null;
        }
    }

    public static void closeConn(Connection conn){
        try {
            if (conn != null){
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            conn = null;
        }
    }
    }

上面的方法会有SQL注入的隐患。

解决方法:用PreparedStatement对象替换前面的Statement对象。PreparedStatement对象可以预先处理给定的SQL语句,在sql语句里面使用?占位符来替代后续要传递进来的变量。后面进来的变量值,将会被看成是字符串,不会产生任何的关键字。

public class pr2 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 连接到数据库
            conn = DriverManager.getConnection("jdbc:mysql://localhost/meiduo_mall","root","480916");

            // 创建Statement对象
            String sql = "select * from tb_goods_category where id=?";
            ps = conn.prepareStatement(sql);
            ps.setInt(1,1);

            // 执行查询,得到结果集

            rs = ps.executeQuery();

//             遍历查询每一条数据
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                System.out.println(id + "---" + name);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 释放资源
            JDBCutils.release(conn,ps,rs);      // 单独写一个工具类来释放资源
        }
    }

}
原文地址:https://www.cnblogs.com/chichung/p/10301117.html