• JavaEE JDBC PreparedStatement


    PreparedStatement

    @author ixenos

    PreparedStatement工作原理


     

      注意:虽然mysql不支持PreparedStatement优化,但依然有预编译的实现!

    PreparedStatement相较Statement的优点


    1.预编译缓存的支持,能提高执行效率

    2.防范SQL注入

      statement有sql注入的风险

      比如

    SELECT * FROM boss WHERE user='root' OR 1=1 --' AND password='f3f.3e&^';

      由于--是SQL脚本中的注释,所以插入 【 ' OR 1=1 -- 】这一段将导致全为真,任意的用户密码都能获得true的判断

    简单示例


    package com.ixenos.demo;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    import org.junit.Test;
    
    import com.ixenos.jdbc.util.JDBCUtil;
    
    public class testDB {
    
    	/**
    	 * 测试preparedstatement
    	 */
    	@Test
    	public void test3() {
    
    		Connection con = null;
    		PreparedStatement preStmt = null;
    		ResultSet rs = null;
    
    		try {
    			// 1.加载驱动程序
    			// 2.获得数据库连接
    			con = JDBCUtil.getConnection();
    			// 3.创建预编译SQL语句
    			String sql = "SELECT * FROM boss WHERE name=?";
    			// 4.创建stateMent
    			preStmt = con.prepareStatement(sql);    preStmt.setString(1,"Alex");
    			// DQL操作返回一个结果集对象,同样需要释放资源!!
    			rs = preStmt.executeQuery(sql);
    
    			// 5.输出结果
    			while (rs.next()) {
    				System.out.println(rs.getString(3));
    			}
    
    		} catch (SQLException e) {
    			e.printStackTrace();
    		} finally {
    			// 后打开的先释放
    			JDBCUtil.close(preStmt, con, rs);
    		}
    	}
    }
    

      

      注意:填入参数时,按参数位置的索引来填入

     

     ----------------------------------------------------------

  • 相关阅读:
    (字符串)子串变位词
    反转链表 II
    翻转链表
    覆盖索引
    MySQL索引结构之Hash索引、full-text全文索引(面)
    MySQL索引结构之B+树索引(面)
    MYSQL 存储引擎(面)
    MySQL架构(面)
    如何在Linux Mint 20系统上安装Pip
    如何在CentOS 8系统服务器上安装Nginx
  • 原文地址:https://www.cnblogs.com/ixenos/p/6292050.html
Copyright © 2020-2023  润新知