• 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);      // 单独写一个工具类来释放资源
            }
        }
    
    }
  • 相关阅读:
    map.entry<k,v>小用法(转)
    zookeeper实现分布式锁服务
    组播协议
    OSPF
    Tomcat默认工具manager管理页面访问配置
    将web应用部署到Tomcat的三种方式
    运行startup.bat的启动过程
    IDEA创建简单servlet程序
    setvlet基础知识
    NIO基本操作
  • 原文地址:https://www.cnblogs.com/chichung/p/10301117.html
Copyright © 2020-2023  润新知