Mybatis如何拼接动态表名 以及#{}和${}的具体使用情况

mapper.java 文件
public Gpsinfo selectGpsByPlateNo(@Param(“tableName”)String tableName,@Param(“plateNo”)String plateNo);

#{}与${}的区别可以简单总结如下:
1. #{}将传入的参数当成一个字符串,会给传入的参数加一个双引号
2. KaTeX parse error: Expected 'EOF', got '#' at position 38: …添加引号 3. #̲{}能够很大程度上防止sql注…{}无法防止sql注入
  4. ${}在预编译之前已经被变量替换了,这会存在sql注入的风险。
  5. ${}一般用于传输数据库的表名、字段名等
 6. #{ } 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符
7. 仅 仅 为 一 个 纯 碎 的 s t r i n g 替 换 , 在 动 态 S Q L 解 析 阶 段 将 会 进 行 变 量 替 换 8. 以 { } 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换 8. 以 stringSQL8.{}就相当于字符串拼接,而#{}相当于占位符,所有这里需要在KaTeX parse error: Expected 'EOF', got '#' at position 30: …引号 9. 能用#̲{}的地方尽量别用{}
  要实现动态调用表名和字段名,就不能使用预编译了,需添加statementType=“STATEMENT”" 。statementType:STATEMENT(非预编译),PREPARED(预编译)或CALLABLE中的任意一个,这就告诉 MyBatis 分别使用Statement,PreparedStatement或者CallableStatement。默认:PREPARED。这里显然不能使用预编译,要改成非预编译。
  其次,sql里的变量取值是KaTeX parse error: Expected 'EOF', got '#' at position 9: {xxx},不是#̲{xxx}。   因为{}是将传入的参数直接显示生成sql,如${xxx}传入的参数为字符串数据,需在参数传入前加上引号
  
mapper.xml 文件

SELECT *FROM
t a b l e N a m e w h e r e p l a t e N o = ′ {tableName} where plateNo=' tableNamewhereplateNo={plateNo}’
order by createDate desc limit 1

@Override
public Gpsinfo selectGpsByPlate(String plateNo) {
Gpsinfo gpsinfo = new Gpsinfo();
Date date=new Date();
DateFormat format=new SimpleDateFormat(“yyyyMMdd”);
String tableName=“gpsinfo”+format.format(date);
gpsinfo = myGpsMapper.selectGpsByPlateNo(tableName,plateNo);
return gpsinfo;
}

表名是我根据时间进行拼接的

你可能感兴趣的:(sql的问题解决)