ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

MyBatis - #{} 和 ${}

MyBatis - #{} 和 ${} 目录一#{} 和 ${} 的使用1.1 Integer 类型参数1.2 String 类型的参数二#{} 和 ${} 的区别2.1 性能区别2.2 SQL注入问题2.3 ${ } 的使用场景排序模糊查询 - like一#{} 和 ${} 的使用1.1 Integer 类型参数Select(select * from userInfo where id #{id}) public UserInfo queryUserInfoById(Integer id); Select(select * from userInfo where id ${id}) public UserInfo queryUserInfoById(Integer id);可以发现这两种写法的SQL语句是不同的对于${}来说我们出入的参数是直接拼接在SQL语句中了这对于Integer参数来说不会造成什么影响。1.2 String 类型的参数Select(select * from userInfo where username #{name}) UserInfo queryUserInfoByName(String name); Select(select * from userInfo where username ${name}) UserInfo queryUserInfoByName(String name);对于${}来说它仅仅只是把我们传入的字符串拼接到SQL语句中但是对于SQL语句来说如果我们要输入一个字符串它必须要有引号 或 所以我们不能直接使用${}来传递一个字符串参数我们必须要自己在Select注解中主动添加引号如下Select(select * from userInfo where username ${name}) UserInfo queryUserInfoByName(String name);从上述两个例子可以看出#{ } 使用的是预编译SQL通过 占位的方式提前堆SQL进行编译然后用参数替换掉 #{ } 会根据参数类型自动拼接引号 ${ } 使用的是即时SQL它会直接进行字符替换然后一起对SQL进行编译如果参数为String类型时必须要自己加上引号二#{} 和 ${} 的区别#{} 和 ${} 的区别就是预编译SQL 和即时SQL 的区别要想弄明白 预编译SQL 和 即时SQL 的区别需要先了解一下一条SQL语句发送给服务器的大致流程解析语法和语义校验SQL语句是否正确优化SQL语句制定执行计划执行并返回结果2.1 性能区别#{ } 性能更高${ } 性能较低对于Java接口中定义的SQL语句来说只有参数会不断的变化其他都是固定的而预编译SQL恰好可以缓存 12 流程也就是只需要替换参数可以跳过解析编译和优化直接执行SQL语句而即使SQL必须要经历解析编译和优化才能执行2.2 SQL注入问题SQL注入是指通过操作传参来修改SQL语句以达到攻击服务器的目的。对于${ }来说因为它的SQL语句是拼接而成的所以在用户输入参数时可以添加一些恒等式来到达改变SQL运行结果的目的比如我们可以传入这样一个参数 or 1 1 Select(select * from userInfo where username ${name}) ListUserInfo queryUserInfoByName(String name);这样我们根本不需要知道username就可以直接把所有人的信息都查找出来如果不对输入的参数进行校验 / 限制对于一些登录场景我们也可以通过填写 or 1 1来完成登录操作。我们甚至可以通过该方式完成删库删表等危险操作。所以#{ }的安全性更高而${ }则有SQL注入的风险安全性较低。2.3 ${ } 的使用场景排序Select(select * from userInfo order by id #{sort}) ListUserInfo queryAll(String sort); Select(select * from userInfo order by id ${sort}) ListUserInfo queryAll(String sort);这时我们需要传递的只是字符串本身不需要引号所以只能由${ }来实现。模糊查询 - likeSelect(select * from userInfo where username like %${name}%) ListUserInfo queryUserInfoByName(String name);当然这么写还是会出现SQL注入问题所以我们可以使用concat函数来避免使用${ }代码如下Select(select * from userInfo where username like concat(%, #{name}, %)) ListUserInfo queryUserInfoByName(String name);
返回列表