随着开发团队转投Google Code旗下,ibatis3.x正式更名为Mybatis
我在开发过程中,我主要是喜欢mybatis可以让开发者灵活的编写sql语句。其中动态变量算是用的最多的了。
mybatis支持两种动态的往sql语句中嵌入变量的方式,一种是用#,另一种是$。
#appId#,使用#,是使用预编译处理,mybatis会先用?占位(等同于PRepareStatement),再传给配置的数据库进行处理。数据库处理时,会根据变量的类型,进行值替换。如果是VARCHAR,就会加上引号,这样可以很好的防止sql注入。
$appid$,使用$,mybatis会直接进行值替换,变量类型不影响。如果需要匹配的是字符串,那么编写的sql语句就需要手动的加上引号,比如 '$appid$',一些其他的函数也是类似的。一般只有在需要传入表名、列名这些数据库保留字段时,才会使用$$。因为是直接值替换,所以使用$是不安全的。假如在一个登陆场景下,开发者没有手动加引号,用户在密码输入框输入 or 1=1 ,直接进行值替换,最后的sql语句可能就是 username = 'username' or 1=1 ,这样,会找出所有的用户信息。
mybatis只是做了sql替换,比如使用#就等同于prepareStatement,使用$就相当于开发者直接写好了sql。真正做处理的还是数据库服务器。比如预编译,数据库会在缓存中保留传进来的预编译,当下次有相同结构的sql请求执行时,数据库就可以更快的进行处理。
新闻热点
疑难解答