好的做法是將數值從運算式字串中分離出來,而不是直接在運算式字串中使用數值。這會使用運算式字串中的參數,並使用 bind()
函式將數值繫結至參數。
可以使用以下方式指定參數:匿名和具名。
參數類型 |
語法 |
範例 |
允許在 CRUD 操作中使用 |
允許在 SQL 字串中使用 |
---|---|---|---|---|
匿名 |
? |
'age > ?' |
否 |
是 |
具名 |
:<名稱> |
'age > :age' |
是 |
否 |
以下範例示範如何在 execute()
函式之前使用 bind()
函式。針對每個具名參數,提供一個包含參數名稱及其數值的引數給 bind()
。傳遞給 bind()
的參數數值配對順序並不重要。此範例假設 test
綱要已指派給變數 db
,並且存在集合 my_collection
。
// Collection.find() function with fixed values
var myColl = db.getCollection('my_collection');
var myRes1 = myColl.find('age = 18').execute();
// Using the .bind() function to bind parameters
var myRes2 = myColl.find('name = :param1 AND age = :param2').bind('param1','Rohit').bind('param2', 18).execute();
// Using named parameters
myColl.modify('name = :param').set('age', 55).
bind('param', 'Nadya').execute();
// Binding works for all CRUD statements except add()
var myRes3 = myColl.find('name like :param').
bind('param', 'R%').execute();
X DevAPI 中不支援匿名預留位置。此限制改善了使用多個使用預留位置的方法的 CRUD 命令鏈中的程式碼清晰度。無論使用哪種 bind()
語法變體,參數和預留位置之間總是根據參數名稱明確關聯。
CRUD 命令鏈的所有方法都會為預留位置形成一個命名空間。在以下範例中,會鏈結 modify()
和 set()
。這兩個方法都採用帶有預留位置的運算式。預留位置會參照一個合併的命名空間。兩者都使用一個名為 :param
的預留位置。對 bind()
的單一呼叫,其中包含一個名為 :param
的名稱數值參數,用於將預留位置數值指派給鏈結方法中 :param
的兩個出現位置。
// one bind() per parameter
var myColl = db.getCollection('relatives');
var juniors = myColl.find('alias = "jr"').execute().fetchAll();
for (var index in juniors){
myColl.modify('name = :param').
set('parent_name',mysqlx.expr(':param')).
bind('param', juniors[index].name).execute();
}
不允許具名參數使用以數字開頭的名稱。例如,不允許使用 :1one
和 :1
。
也可以將 CRUD 操作物件儲存在變數中以供日後執行,而不是直接使用 bind()
和 execute()
或 execute()
繫結和執行 CRUD 操作。
這樣做的好處是可以將多組變數繫結至運算式字串中定義的參數,因此在執行大量相似操作時可以獲得更好的效能。此範例假設 test
綱要已指派給變數 db
,並且存在集合 my_collection
。
var myColl = db.getCollection('my_collection');
// Only prepare a Collection.remove() operation, but do not run it yet
var myRemove = myColl.remove('name = :param1 AND age = :param2');
// Binding parameters to the prepared function and .execute()
myRemove.bind('param1', 'Leon').bind('param2', 39).execute();
myRemove.bind('param1', 'Johannes').bind('param2', 28).execute();
// Binding works for all CRUD statements but add()
var myFind = myColl.find('name like :param1 AND age > :param2');
var myDocs = myFind.bind('param1', 'L%').bind('param2', 20).execute();
var MyOtherDocs = myFind.bind('param1', 'J%').bind('param2', 25).execute();