SQL中為什么不要使用1=1?
共 3970字,需瀏覽 8分鐘
·
2024-08-19 07:40
閱讀本文大概需要 4 分鐘。
來自:
為什么會使用 1=1?
SELECT
*
FROM
table
WHERE
1 = 1 < if test = 'username != null' >
AND username = # { username } < / if > < if test = 'age > 0' >
AND age = # { age } < / if >
1=1 帶來的問題
-
代碼清晰性: 在復(fù)雜的SQL中,避免“1=1”這種引起歧義。 -
習(xí)慣: 代碼規(guī)范。 -
兼容: 跨數(shù)據(jù)的兼容性。避免有的數(shù)據(jù)庫無法進(jìn)行優(yōu)化掉“1=1”這種條件造成的全表掃描。
替代 1=1 的更佳做法
<!-- MyBatis映射文件片段 -->
<select id='selectUsersByConditions' parameterType='map' resultType='com.example.User'>
SELECT * FROM user
<where>
<!-- 使用if標(biāo)簽動態(tài)添加條件 -->
<if test='username != null and username != '''>
AND username = #{username}
</if>
<if test='age > 0'>
AND age = #{age}
</if>
<!-- 更多條件... -->
</where>
</select>
<if>)來構(gòu)建條件查詢。<where> 標(biāo)簽會自動處理首條條件前的 AND 或 OR。當(dāng)沒有滿足條件的 <if> 或其他條件標(biāo)簽時,<where> 標(biāo)簽內(nèi)部的所有內(nèi)容都會被忽略,從而不會生成多余的 AND 或 WHERE 子句。
var query = context.User.AsQueryable();
if (!string.IsNullOrEmpty(username))
{
query = query.Where(b => b.UserName.Contains(username));
}
if (age>0)
{
query = query.Where(b => b.Age = age);
}
var users = query.ToList();
總結(jié)
<END>
推薦閱讀:
Spring-Security 認(rèn)證流程分析及多方式登錄認(rèn)證實踐
程序員在線工具站:cxytools.com 推薦一個自己寫的工具站:http://cxytools.com,專為程序員設(shè)計,包括時間日期、JSON處理、SQL格式化、隨機(jī)字符串生成、UUID生成、文本Hash...等功能,提升開發(fā)效率。
?戳閱讀原文直達(dá)! 朕已閱 ![]()
