从sqlServer 分页查询谈${}和#{}

下面为一段代码

 SELECT  TOP ${pageSize} * FROM (
        SELECT  o.*
        ,ROW_NUMBER() OVER(Order by o.id desc) AS RowNumber
        FROM
        (
        select  h.id, u.username,
        case  h.sljg  when 0 then '审核中'  when 1 then '审核通过'  when 2 then '审核失败' end sljg,h.slyy,h.bz
        from  admin  a
        join JSBHB j on  j.adminid=a.adminid
        left join  hjxxb h on h.jsbh=j.jsbh
        left join users u on u.id=h.userid
        left join DMB d on d.DM=h.gxdm  and d.DMLX=17  where a.adminid=#{adminid}
        and h.sljg =#{sljg}
        <if test="uname!=null and uname!=''">
            and u.username=#{uname}
        </if>
        )
        as o
        ) AS ur
        WHERE RowNumber <![CDATA[ > ]]> ${firstIndex}

进行分页查询数据:

在()中是我们查分页查询要查的表(子查询),而()外是进行分页,我们会发现

几个注意事项

1 子查询中不能有group by 

2  在top 后面用到${}而不是#{}

否则会报

     Cause: com.microsoft.sqlserver.jdbc.SQLServerException: '@P0' 附近有语法错误。
; uncategorized SQLException for SQL []; SQL state [S0001]; error code [102]; '@P0' 附近有语法错误。; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: '@P0' 附近有语法错误。

${} 是字符串的拼接,一般在sql 语句形成时就会拼接上去变成sql 语句,不过一般可能会出现sql 注入

#{} 中的数据是解析成一个字符串后进行java类型和数据库类型的转换,生成sql 语句时会用?占位符占位

一般我们用#{},然而在特殊的情况下,我们因为一些语法规定必须用${},例如top 后面,有时可以用${},比如在后台定死的sql 语句

字段,不必担心sql 注入

原文地址:https://www.cnblogs.com/jsbk/p/9817226.html