1.动态传入数据表的名字进行多条件参数查询时,statementType采用非预编译的“STATEMENT”而非"PREPARED",否则无法找到表名
<select id="findOneValue" parameterType="java.util.HashMap" resultType="com.createbling.modules.sys.entity.Expert" statementType="STATEMENT">
SELECT * FROM ${tableName} WHERE cycle_id=${cycle_id} AND parameter_id=${param_id}
</select>
public Expert findOneValue(HashMap map);
HashMap map = new HashMap();//此map装入调用findOneValue所需的参数
map.put("tableName",tableName);//
map.put("cycle_id",t);//
map.put("param_id",p);//
Expert e=eService.findOneValue(map);
再者,select*中的*的使用必须要满足此条select的返回类型的所有属性和数据表中的所有字段都相符合,否则不可使用*。
————————————————————————————————————————————————————
当传入参数是2e73a48794494239bb7d1582be699002时必须要有双引号的转义字符"
${}和#{}的区别:
使用#{}格式的语法在mybatis中使用Preparement语句来安全的设置值,而${}是未经过预编译的,仅仅是取变量的值,是非安全的,存在sql注入.只能${}的情况,从我们前面的例子中也能看出,order by是肯定只能用${}了,用#{}会多个' '导致sql语句失效.
使用#传入参数时,sql语句解析是会加上"",比如 select * from table where name = #{name} ,传入的name为小李,那么最后打印出来的就是 select * from table where name = ‘小李,能用#就不要用$,