Mybatis # 和 $ 的区别

来源:互联网 发布:什么是qq群淘宝客 编辑:程序博客网 时间:2024/04/30 10:38

Mybatis # 和 $ 的区别

#{} 是预编译模式,也是占位符 占位符的意义就是作为值的存在,他会自动的把传过来的值加上''  例如:select * from PROJECT_NAME where name = #{testName,jdbcType}如果testName='小红'预编译后就变成了如下:select * from PROJECT_NAME where name = '小红'但是如果'表名'或者'列名'是动态的话:select * from #{projectName} 如果projectName='PROJECT_NAME '预编译后就变成了如下:select * from 'PROJECT_NAME ' 这是sql是什么鬼?所以当'表名'或者'列名'是动态的话就要使用非预编译模式select * from ${projectName} select * from PROJECT_NAME功能是直接进行字符串拼接。这也是为什么${}不能够防止一般的sql注入攻击。因为它是拼接啊!!。大家注意非预编译是不能加jdbcType的

下面是正确代码

<select id="test" parameterType="map"                   resultType="com.sgai.qgpam.pd.entity.PdProject">        select * from ${tableName} where PROJECT_NAME = #{projectName}</select>
如上 :我的表名是动态的所以使用$ ${tableName}非预编译模式      但是查找 PROJECT_NAME 还是常用的#{projectName}
这里要注意:        1.非预编译是不能加jdbcType的        2.# $ 可以一起使用 完全没问题        3.尽量使用预编译模式 这样能防止sql注入.

mapper接口:

public List<PdProject> test(Map<String,Object> map);

测试类:

@Test    public void test()    {        Map<String,Object> map = new HashMap<>();        map.put("tableName", "PD_PROJECT");        map.put("projectName", "test2017");        List<PdProject> list = pdProjectMapper.test(map);        System.out.println("Size:"+list.size());    }
原创粉丝点击