一 # 和 $ 的区别
- “#”将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是数字,那么解析成sql时的值为order by “数字”, 如果传入的值是id,则解析成的sql为order by “id”.
2 .而第二个符号 将传入的数据直接显示生成在sql中。如:order by 符号user_id符号,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id.
- 方式能够很大程度防止sql注入。
4.$方式无法防止Sql注入。
5.$方式一般用于传入数据库对象,列名等。
6.一般能用#的就别用 ,不过在使用 的时候,一定要注意场景。
- 在使用mybatis中还遇到的用法,在该符号内的语句,将不会被当成字符串来处理,而是直接当成sql语句来处理,
就像在数据库客户端里执行 sql 是一样的效果,所以如 <> ,!= 都可以在这里面执行,适合复杂的 SQL 。
- 而不加 这个符号的,就是当做字符串来处理的。
{—————————————————————————–}
Mybatis中queryForPaginatedList的分析
对于一个刚刚学习ibatis初学者来说,看到这个方法一定会很高兴,因为他可以让我们更加容易的进行过分页,但是当我们打开帮我文档的时候我们会发现这个方法已经过时了,我们于是可能会联想到是不是又有啥跟好的方法了,其实不是的,这个方法不像hibernate自带的分页方法,会根据不同的数据库进行优化,他完全是依赖jdbc驱动程序来实现分页的。
调用次序如下SqlMapClientImpl.queryForPaginatedList->SqlMapSessionImpl.queryForPaginatedList
->SqlMapExecutorDelegate.queryForPaginatedList->GeneralStatement.executeQueryForList
->GeneralStatment.executeQueryWithCallback->GeneralStatment.executeQueryWithCallback
->SqlExecutor.executeQuery->SqlExecutor.handleMultipleResults()
他取出来的数据要放到内存中,这个一来,如果数据量很大的,会严重的影响系统的性能,因此我不建议大家使用这种方式进行分页。