数据库查询

写入数据

其他用法

Misc

查询教程

绑定位置参数

数据值使用 ?,并按照占位符顺序传入参数:

Map<String, Object> row =
        new Action(conn, "SELECT * FROM shop_address WHERE id = ? AND stat = ?")
                .query(1, 0)
                .one();

这些值由 PreparedStatement 绑定,不要给 ? 添加引号。

SQL 模板参数

如果第一个参数是 Map,且 SQL 中包含动态节点或命名占位符,Action 会先渲染内联 SQL 模板,再绑定剩余的位置参数:

命名数据参数 #{}

#{name} 用于 Map 中的普通数据值。它会生成 JDBC ? 占位符,参数值按其在 SQL 中的出现顺序绑定;因此可安全用于查询字符串、表单或 JSON 请求体中的字段:

Map<String, Object> params = new HashMap<>();
params.put("id", 1);
params.put("name", "Alice");

Map<String, Object> row =
        new Action(conn, "SELECT * FROM shop_address WHERE id = #{id} AND name = #{name}")
                .query(params)
                .one();

上例执行的 JDBC SQL 等价于 SELECT * FROM shop_address WHERE id = ? AND name = ?。#{} 可用于 SELECT、INSERT、UPDATE 和 DELETE 中的值;不要给占位符手动加引号。

标识符参数 ${}

Map<String, Object> template = new HashMap<>();
template.put("tableName", "shop_address");

Map<String, Object> row =
        new Action(conn, "SELECT * FROM ${tableName} WHERE id = ?")
                .query(template, 1)
                .one();

${...} 仅允许 SQL 标识符,包括 schema.table 这样的限定名称;任意 SQL 片段会被拒绝。它不能用于普通请求值,例如 WHERE id = ${id} 中的 id=1 会被拒绝,应写为 WHERE id = #{id}。表名、列名、排序字段和排序方向属于 SQL 结构,不能使用 JDBC 参数绑定;即使标识符语法通过校验,也必须由服务端固定或通过白名单和授权控制。

Map 的列名

Map 使用 JDBC 返回的列标签。表达式应设置别名,以获得稳定的键名:

Map<String, Object> totals =
        new Action(conn, "SELECT COUNT(*) AS total FROM shop_address")
                .query()
                .one();

Object total = totals.get("total");

映射 JavaBean

目标类型需要无参构造方法和可写属性:

Address address =
        new Action(conn, "SELECT id, name, create_date FROM shop_address WHERE id = ?")
                .query(1)
                .one(Address.class);

SqlMan 会把 create_date 这样的下划线列名转换为 createDate 属性名。