1、本篇博客的背景和目的
目前我本人正在学习MyBatis框架,在原先了解并且懵懵懂懂使用的基础上,开始系统正式的学习。阐述了MVC架构模式和三层架构,明晰了在Web项目中的普遍编码层次,回顾了JDBC连接数据库,建立了使用MyBatis和MySQL的Maven项目,解释了STDOUT_LOGGING日志和手动提交事务,记录了MyBatis中#占位符的使用方法,回顾了MyBatis执行SQL语句的过程和使用到的一些重要类和接口,记录了将固定化的代码整合到一个工具类MyBatisUtil中,以减少代码量。记录了dao层接口的实现以及为什么要实现它。记录了MyBatis动态代理和使用动态代理的要求以及使用了动态代理生成的实现类。记录了MyBatis框架下传参的五种方法。本篇博客记录一下占位符#和$的区别。
2、我的上一篇博文
我的上一篇博文记录的是 使用Map传参的方法,感兴趣的读者可以前往查阅,链接如下:
3、#占位符
使用语法格式:#{字符} 。
MyBatis处理 # 占位符的时候使用的JDBC对象是 PrepareStatement对象,然后使用这个对象执行SQL语句。就类似于下面的代码:
String SQL=" name=?";
PrepareStatement pst=conn.prepareStatement(SQL);
pst.setInt(1,1001);
ResultSet rs=pst.executeQuery();
这些 ? 使用的就是 setint等方法来赋值的。
这个 # 占位符的特点就是:1、 使用的是PrepareStatement 对象, 效率更高;
使用的是PrepareStatement 对象 这样还可以2、避免SQL注入, 这是更加安全的;
还有就是:# 占位符常常是位于 = 的右侧, 3、按照规范,也就是 #{ }是作为列值使用的;
#{ }位置的值是和数据类型有关的;
4、$占位符
使用语法格式: ${ 字符串 }
MyBatis执行 ${ } 这个占位符的SQL语句的时候,比方说在mapper文件中有这样的一条语句:
select * from student where id=${ studentId }
${ 字符串 } 它表示的是 字符串的连接;是将 SQL语句的其它内容和 ${ }的内容连在一块;使用的是字符串连接的方式连在一起 , 这样就是要使用 + 的;所以上面的使用形式就变成了:
String Sql= " select * from student where id="+ " 1001"; //两个字符串相加
这个时候 MyBatis创建的就是 Statement 对象来执行你的SQL语句的;
就相当于是:
Statement stmt=conn.createStatement(Sql);
ResultSet rs=stmt.executeQuery();
使用Statement对象是不安全的,其实现在早就已经不使用了;
要注意一点, 使用它的时候,它是相加的 是没有引号的, 这样往往执行SQL语句时错误的
接下来就是这个 $ 占位符的特点啦:
1、首先就是效率是低的(这涉及到SQL语句的编译问题)
2、它使用的是 字符串连接的方式, 有SQL注入的风险, 这就代码不安全;
3、${ } 还表示数据是原样使用的, 不会区分数据类型,
一般使用它 表示列名或者是表名