如何在Ballerina中使用Like操作符执行带变量的SQL语句
在Ballerina SQL客户端中执行带
LIKE操作符的参数化查询 在Ballerina中执行包含LIKE操作符的SQL查询时,必须使用参数化查询避免SQL注入风险,禁止直接将变量拼接进SQL字符串。以下是两种常用的安全实现方式:
方式一:在Ballerina代码中构造带通配符的查询值
先将搜索关键词与通配符%拼接成完整的匹配模式,再作为参数传入参数化查询:
import ballerina/sql; import ballerina/jdbc; import ballerina/io; public function main() returns error? { // 初始化JDBC客户端(根据实际数据库类型调整连接参数) jdbc:Client db = check new ( "jdbc:mysql://localhost:3306/your_db", "db_user", "db_password" ); string searchKeyword = "mon"; // 构造包含前后通配符的匹配规则 string likePattern = "%" + searchKeyword + "%"; // 定义参数化查询语句 sql:ParameterizedQuery query = `SELECT * FROM albums WHERE title LIKE ?`; // 执行查询并传入参数 sql:Stream<record{}, error?> albumStream = db->query(query, likePattern); // 遍历输出查询结果 check from var album in albumStream do { io:println(album); }; }
方式二:在SQL语句中通过数据库函数拼接通配符
部分数据库支持用内置字符串拼接函数(如MySQL的CONCAT)在SQL内部完成通配符与变量的拼接,此时只需传入原始搜索关键词:
import ballerina/sql; import ballerina/jdbc; import ballerina/io; public function main() returns error? { jdbc:Client db = check new ( "jdbc:mysql://localhost:3306/your_db", "db_user", "db_password" ); string searchKeyword = "mon"; // 用数据库函数在SQL内部拼接通配符 sql:ParameterizedQuery query = `SELECT * FROM albums WHERE title LIKE CONCAT('%', ?, '%')`; sql:Stream<record{}, error?> albumStream = db->query(query, searchKeyword); check from var album in albumStream do { io:println(album); }; }
关键注意事项
- 绝对禁止直接将变量嵌入SQL字符串(如
SELECT * FROM albums WHERE title LIKE '%${searchKeyword}%'),这种写法会引发严重的SQL注入漏洞。 - 不同数据库的字符串拼接语法有差异(比如PostgreSQL用
||运算符),需根据实际使用的数据库调整SQL语句。
内容的提问来源于stack exchange,提问作者Anupama Pathirage
相关产品推荐
相关产品推荐

