2026-10-25 18:23:18
可以通过一次SQL请求返回分页数据和总条数。以下是具体实现方法及注意事项:
使用多语句查询:
在MySQL中,默认情况下,一个SQL请求只能执行一条语句。但可以通过设置client_multi_statements=true来允许一个请求中执行多条SQL语句。
示例SQL:
SELECT * FROM `dict_plugin` LIMIT 20, 10;SELECT COUNT(*) AS totalCount FROM `dict_plugin`;在Go语言中,可以使用go-sql-driver并设置multiStatements=true来支持多语句查询。
处理多结果集:
执行多语句查询后,会返回多个结果集。在Go中,可以通过NextResultSet()方法来遍历这些结果集。
示例代码:
results, err := db.Query(querystring)if err != nil { log.Fatal(err)}defer results.Close()// 处理第一个结果集:分页数据for results.Next() { err = results.Scan(&...) // 处理每一行数据}// 移动到下一个结果集if results.NextResultSet() { // 处理第二个结果集:总条数 for results.Next() { var totalCount int err = results.Scan(&totalCount) // 使用totalCount }}SQL注入风险:
开启client_multi_statements会增加SQL注入的风险,因为攻击者可能通过注入恶意SQL语句来执行多个操作。
为了防止SQL注入,应使用参数化查询(预编译语句)。参数化查询可以确保用户输入不会被解释为SQL代码的一部分。
参数化查询:
在Go中,可以使用db.Query()或db.Prepare()结合参数来执行参数化查询。
示例:
stmt, err := db.Prepare("SELECT * FROM `dict_plugin` WHERE `plugin_name` = ? LIMIT ?, ?")if err != nil { log.Fatal(err)}defer stmt.Close()rows, err := stmt.Query(pluginName, offset, limit)if err != nil { log.Fatal(err)}defer rows.Close()for rows.Next() { err = rows.Scan(&...) // 处理每一行数据}总结:
通过一次SQL请求返回分页数据和总条数是可行的,但需要注意SQL注入的风险。
使用参数化查询是防止SQL注入的有效方法。
在实际应用中,应根据安全需求和性能考虑来选择合适的方法。

通过以上方法,可以在保证安全性的前提下,高效地实现一次SQL请求返回分页数据和总条数的功能。