Mybatis的#{}和${}的区别。先看下面这一段sql。
<update id="update">
UPDATE
${prefix}WF_PROCDEF_BILLTYPE
SET
proc_def_id = #{procDefId},
proc_def_key = #{procDefKey},
proc_def_name = #{procDefName},
biz_bill_type = #{bizBillType},
biz_bill_name = #{bizBillName},
biz_bill_url = #{bizBillUrl},
remarks = #{remarks},
update_by = #{updateBy},
update_date = sysdate,
uuid = #{uuId}
WHERE
id = #{id}
</update>
这里面${prefix}的prefix实际是oracle的表空间。值为:oracledba.
本质是将${prefix}WF_PROCDEF_BILLTYPE变为oracledba.WF_PROCDEF_BILLTYPE。oracledba是表空间名称,WF_PROCDEF_BILLTYPE是表名。
下面这条语句在sql中是会报错的:select * from student where name=李四。因为李四没有加引号。所以不能用李四来直接替代${name}。
那么${name}这种用处在哪呢?
随便举几个例子:
select count(*),${param} from student group by ${param} 动态group by
select count(*),class from student group by class 这条语句的意思就是统计班级和班级人数
select * from student _${table_suffix} 简单分表命中表后缀,
select * from student _1 假设student分表16张,分别为从student_1到student_16。这条语句的意思就是从student_1取数据
select * from student order by ${param} 排序指令
select * from student order by score 这条语句意思就是根据考试得分排序
说白了, ${param}就是字符串替换,不加引号!。
#{id}本质是呢
select * from student where id= #{id} 假设id在java调用时为1,此时语句会变为select * from student where id= ?
没错,并不是select * from student where id= '1' 。这和数据库的预处理语句机制有关。