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);
		}
	}
}

  

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

 

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

原文地址:https://www.cnblogs.com/ixenos/p/6292050.html