#{}、${}、PreparedStatement 、Statement 详解

#{}和${}的区别 类似于 PreparedStatement和Statement的区别。

#{}和PreparedStatement,会预编译sql语句,然后通过展符的方式进行赋值,并能够把java的数据类型转为jdbc类型,如java字符串“1”,会转为‘1’,java int类型1,会转为jdbc的int类型1,并且能够对特殊字符进行转义

${}和Statement会直接拼接sql,不会进行处理,如sql语句String sql = "select * from table where column = ",拼接输入的值String column = “1001”后 sql += column,最终在数据执行的sql是select * from table where column = 1001(报错,因为没有1001会被当作列名处理,而不是字段值)。如通过占位符的方式,最终执行的sql将是select * from table where column = ‘1001’。

若想让拼接的sql能正常只执行,必须手动加入’‘。如String sql = "select * from table where column=’ "; String cloumn = “1001”; sql += column; sql += " ’ ";。拼接后最终执行的sql:select * from table where column=‘1001’。

sql注入。对于输入值String column = " ’or 1=1 or ’ ";通过预编译的方式,最终在数据库中执行的sql:select * from table where column = '\ ’ or 1=1 or\ ’ ',会进行转义。若通过字符串拼接的方式,最终执行的sql:select * from table where ‘’ or 1=1 or ‘’,出现sql注入问题

  1. #{}
// #{}, PreparedStatement测试
String sql = "SELECT * FROM student_t WHERE STU_NAME=?";
try{
	// connection数据库连接创建过程省略。
	PreparedStatement preparedStatement = connection.preparedStatement(sql);
	// 与编译后的SQL:SELECT * FROM student_t WHERE STU_NAME=** NOT SPECIFIED **。执行时不再编译sql语句
	// 占位符赋值,
	// 测试1
	preparedStatement.setObject(1,"test");
	// 赋值后SQL:SELECT * FROM student_t WHERE STU_NAME='test'。
	// 会进行java与JDBC数据类型转换,java字符串类型“test”转为jadbc类型'test'

	// 测试2
	// preparedStatement.setObject(1,"test");
	// preparedStatement.setObject(1,1001);
	// 赋值后SQL:SELECT * FROM student_t WHERE STU_NAME=1001。
	// 会进行java与JDBC数据类型转换,java int类型1001转为jdbc的int类型1001
}
  1. ${}
// ${} Statement测试
String sql = "SELECT * FROM student_t WHERE STU_NAME=";
try{
	// 创建数据库语句声明
	Statement statement = connection.createStatement();
	// 测试1
	// sql += "test"
	// statement.executeQuery(sql);
	// SQL语句:SELECT * FROM student_t WHERE STU_NAME=test
	// JDBC不会把test当作字符串处理,会直接在数据库中执行上面sql语句,test会被当作数据库字段处理
	
	// 测试2
	// sql += " ' ";
	// sql += "test";	// ' 不能在这加,用户输入的值是test,不是'test'。
	// sql += " ' ";
	// statement.executeQuery(sql);
	// sql语句:SELECT * FROM student_t WHERE STU_NAME='test';
	// 语句正常执行
	
	// 测试3 sql注入
	// sql += " ' ";
	// sql +=" 'or 1=1 or ' ";
	// sql += " ' ";
	// statement.executeQuery(sql);
	// sql语句:SELECT * FROM student_t WHERE STU_NAME='' or 1=1 or'';
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值