一、#与$的区别
最近项目中使用MyBatis动态关联表,这就需要给表名动态赋值,刚开始使用#{tablename},却发现始终都无法成功,后来在网上找了一下,改为${tablename}才解决问题。究其原因,主要是因为#将传入的数据当成一个字符串,会对传入的数据自动加一个引号,而表名加引号是识别不到的。
但是,一般情况下,能使用#就不要使用$,主要因为#能很大程度上防止sql注入,而$则无法防止sql注入;但是$方式一般用于传入数据库对象,例如传入表名;而且MyBatis排序时使用order by 动态参数时需要注意,用$而不是#。
二、MyBatis查询MySQL的时间段
以下语句用于查询中时间的比较,#{startTime}=<a.latestTime<=#{endTime},时间格式可以自定义,这是使用的是“年-月-日”
<if test="startTime!=null and startTime!=''">
<![CDATA[
and DATE_FORMAT(a.latestTime, '%Y-%m-%d') >= DATE_FORMAT(#{startTime}, '%Y-%m-%d')
]]>
</if>
<if test="endTime!=null and endTime!=''">
<![CDATA[
and DATE_FORMAT(a.latestTime, '%Y-%m-%d') <= DATE_FORMAT(#{endTime}, '%Y-%m-%d')
]]>
</if>
三、MyBatis查询中like写法
select * from table where name like "%"#{name}"%"
select * from table where name like "%"||#{name}||"%"
select * from table where name like "%${name}%"
三种写法对比后,第一种属于预编译SQL,后两种都不是,因此推荐使用第一种写法。