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. 以 仅仅为一个纯碎的string替换,在动态SQL解析阶段将会进行变量替换8.以{}就相当于字符串拼接,而#{}相当于占位符,所有这里需要在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; }

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

经验分享 程序员 微信小程序 职场和发展