当用mybatis的时候习惯用HashMap映射sql结果,比较少用实体类,其实道理是一样的,就算用实体类也会有动态列返回结果时出现一些问题。这是因为mybatis或ibatis默认是预编译的,当项目在启动的时候就把sql返回的映射结果先预编译了一遍,映射回去的列是固定的,当再次查询改变列名的时候就拿不到值变成null了,怎么解决这个问题呢。
要实现动态调用表名和字段名,就不能使用预编译了,mybatis需添加statementType="STATEMENT"。ibatis需添加remapResults="true",两个操作方式会有点不一样,道理是一样的,就是取消预编译,每次拿结果的时候都要映射一遍。
此时,因为是用的非预编译,所以sql里就不能用#传参啦,都要改成$穿参,要想预防sql注入的,要在java代码里对参数做一下处理。
ibatis:

mybatis:

网友评论