教程: 使用PreparedStatement访问DLA

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: 大家都知道PreparedStatement相比手动拼写SQL有很多好处,比如: 它会自动做敏感字符的转义,防止SQL Injection攻击。 它可以帮助我们动态执行SQL,Prepare一次之后,后续执行只需要替换参数就可以了。

大家都知道PreparedStatement相比手动拼写SQL有很多好处,比如:

  • 它会自动做敏感字符的转义,防止SQL Injection攻击。
  • 它可以帮助我们动态执行SQL,Prepare一次之后,后续执行只需要替换参数就可以了。
  • 它可以帮助以OOP的方式来写SQL相关相关代码,因为我们是通过 PrepareSteatement.setXxx()的方式而不是字符串拼接的方式来设置参数。

等等,PreparedStatement的好处还有很多,更多可以参考这篇《JDBC Statement vs PreparedStatement – SQL Injection Example》, 上面说的很详细。

今天我们Data Lake Analytics也引入了对PreparedStatement的支持, 今天给大家演示一下,如何用 PreparedStatement 来访问 DLA.

准备工作

为了准备演示的环境,大家可能要先熟悉一下怎么在DLA上面创建数据库,创建表,在云栖社区上面通过关键字 DLA 可以搜索到很多文章,比如创建访问RDS的DLA库可以看这篇文章: 教程:使用Data Lake Analytics读/写RDS数据 .

我们在这篇教程里面要演示的表的结构是这样的:

CREATE EXTERNAL TABLE `type_test` (
    `id` bigint(20) NULL DEFAULT NULL COMMENT '',
    `tinyint_col` tinyint(4) NULL DEFAULT NULL COMMENT '',
    `int_col` int(11) NULL DEFAULT NULL COMMENT '',
    `char_col` char(10) NULL DEFAULT 'NULL' COMMENT '',
    `varchar_col` varchar(10) NULL DEFAULT 'NULL' COMMENT '',
    `float_col` double NULL DEFAULT NULL COMMENT '',
    `double_col` double NULL DEFAULT NULL COMMENT '',
    `decimal_col` decimal(20, 4) NULL DEFAULT NULL COMMENT '',
    `time_col` time(3) NULL DEFAULT 'NULL' COMMENT '',
    `datetime_col` datetime(6) NULL DEFAULT NULL COMMENT '',
    `timestamp_col` timestamp(6) NOT NULL COMMENT '',
    `string_col` varchar(100) NULL DEFAULT 'NULL' COMMENT '',
    `date_col` date NULL DEFAULT 'NULL' COMMENT '',
    `smallint_col` smallint(6) NULL DEFAULT NULL COMMENT '',
    `mediumint_col` int NULL DEFAULT NULL COMMENT '',
    `bigint_col` bigint(20) NULL DEFAULT NULL COMMENT ''
)
COMMENT ''

里面的数据是这样的:

> select * from type_test\G;
*************************** 1. row ***************************
           id: 1
  tinyint_col: 2
      int_col: 3
     char_col: hello1
  varchar_col: 5
    float_col: 6.01
   double_col: 7.02
  decimal_col: 8.0300
     time_col: 01:02:01.000
 datetime_col: 1986-10-01 01:02:03.000000
timestamp_col: 2018-11-29 14:04:28.305523
   string_col: hello
     date_col: 2018-09-07
 smallint_col: NULL
mediumint_col: NULL
   bigint_col: 2
*************************** 2. row ***************************
           id: 1111111
  tinyint_col: 127
      int_col: 4
     char_col: hello2
  varchar_col: 5555555555
    float_col: 9996.01
   double_col: 7777777.02
  decimal_col: 888888888.0300
     time_col: 01:02:02.000
 datetime_col: 1986-10-01 01:02:03.000000
timestamp_col: 2018-11-29 14:36:05.486738
   string_col: hello
     date_col: 2018-09-08
 smallint_col: NULL
mediumint_col: NULL
   bigint_col: 1111112
*************************** 3. row ***************************
           id: 3
  tinyint_col: 127
      int_col: 5
     char_col: hello3
  varchar_col: 5555555555
    float_col: 9997.01
   double_col: 7777777.02
  decimal_col: 888888888.0300
     time_col: 01:02:03.000
 datetime_col: 1986-10-01 01:02:03.000000
timestamp_col: 2018-11-20 10:31:40.112000
   string_col: hello
     date_col: 2018-09-09
 smallint_col: 3
mediumint_col: NULL
   bigint_col: 4
3 rows in set (0.00 sec)

Java

因为我们兼容MySQL协议,我们使用MySQL的JDBC驱动来访问DLA。值得注意的是 MySQL JDBC驱动支持客户端 PrepareStatement (也是很厉害啊), 要使用服务端的PreparedStatement的功能,需要在JDBC连接串的末尾加上 useServerPrepStmts=true 的参数,如下:

import java.sql.*;

public class DLAPrepStmtMain {
    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");

        String sql = "select * from type_test where `key` = ?";
        try (Connection dlaConn = DriverManager.getConnection(
                "jdbc:mysql://1013022312866336-fake.cn-hangzhou.datalakeanalytics.aliyuncs.com:10000/yourdb?useServerPrepStmts=true",
                "your-username",
                "your-password");
             PreparedStatement stmt = dlaConn.prepareStatement(sql)) {
            stmt.setString(1, "key01");
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                for (int i = 0; i < rs.getMetaData().getColumnCount(); i++) {
                    System.out.print(rs.getString(i + 1) + ", ");
                }
                System.out.println();
            }
        }
    }
}

执行会发现,控制台会正确打印出结果:

1, 2, 3, hello1, 5, 6.01, 7.02, 8.03, 01:02:01, 1986-10-01 01:02:03.0, 2018-11-29 14:04:28.305, hello, 2018-09-07, null, null, 2,

Php

PHP不愧是世界上最好的语言,写起PreparedStatement起来也是非常的简洁:

<?php
$mysqli = new mysqli("fakee.cn-hangzhou.datalakeanalytics.aliyuncs.com:10000",
                     "democ", "demo", "demo");
$stmt = $mysqli->stmt_init();
// 开始prepare
$stmt->prepare("select * from type_test where id = ?");

$id = 1;
// 绑定参数
$stmt->bind_param("i", $id);
$stmt->execute();
$result = $stmt->get_result();
var_dump($result->fetch_all());
?>

运行结果:

array(1) {
  [0]=>
  array(16) {
    [0]=>
    int(1)
    [1]=>
    int(2)
    [2]=>
    int(3)
    [3]=>
    string(6) "hello1"
    [4]=>
    string(1) "5"
    [5]=>
    float(6.01)
    [6]=>
    float(7.02)
    [7]=>
    float(8.03)
    [8]=>
    string(8) "01:02:01"
    [9]=>
    string(19) "1986-10-01 01:02:03"
    [10]=>
    string(19) "2018-11-29 14:04:28"
    [11]=>
    string(5) "hello"
    [12]=>
    string(10) "2018-09-07"
    [13]=>
    NULL
    [14]=>
    NULL
    [15]=>
    int(2)
  }
}

CSharp

C#不愧是比Java更好的语言,写起来也是虎虎生风:

        public static void Main()
        {
            string connStr = "server=your-endpoint.cn-hangzhou.datalakeanalytics.aliyuncs.com;UID=your-username;database=yourdb;port=10000;password=your-password;SslMode=none";

            MySqlConnection conn = new MySqlConnection(connStr);
            try
            {
                Console.WriteLine("Connecting to MySQL...");
                conn.Open();
                string sql = "select * from type_test where id = @var1";
                MySqlCommand cmd = new MySqlCommand(sql, conn);
                // 开始prepare
                cmd.Prepare();
                // 绑定参数
                cmd.Parameters.AddWithValue("@var1", 1);

                MySqlDataReader res = cmd.ExecuteReader();
                while (res.Read())
                {
                    for (int i = 0; i < res.FieldCount; i++)
                    {
                        Console.Write(res[i] + ",");
                    }
                }
                while (res.NextResult())
                {

                }
                res.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }

            conn.Close();
            Console.WriteLine("Done.");
        }
    }

结果如下:

Connecting to MySQL...
1,2,3,hello1,5,6.01,7.02,8.03,01:02:01,10/01/1986 01:02:03,11/29/2018 14:04:28,hello,09/07/2018 00:00:00,,,2,Done.

总结

随着DLA对于各种语言PreparedStatement的支持,大家可以用PreparedStatement替换原先手动拼SQL的代码,让你的代码更OOP,更安全!

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
Web App开发 JavaScript 前端开发
Node.js的优缺点是?
【8月更文挑战第4天】Node.js的优缺点是?
745 4
|
21天前
|
人工智能 自然语言处理 Shell
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
32876 128
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
|
17天前
|
人工智能 安全 机器人
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI助手,支持钉钉、飞书等多平台接入。本教程手把手指导Linux下部署与钉钉机器人对接,涵盖环境配置、模型选择(如Qwen)、权限设置及调试,助你快速打造私有、安全、高权限的专属AI助理。(239字)
6991 21
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
|
16天前
|
人工智能 机器人 Linux
OpenClaw(Clawdbot、Moltbot)汉化版部署教程指南(零门槛)
OpenClaw作为2026年GitHub上增长最快的开源项目之一,一周内Stars从7800飙升至12万+,其核心优势在于打破传统聊天机器人的局限,能真正执行读写文件、运行脚本、浏览器自动化等实操任务。但原版全英文界面对中文用户存在上手门槛,汉化版通过覆盖命令行(CLI)与网页控制台(Dashboard)核心模块,解决了语言障碍,同时保持与官方版本的实时同步,确保新功能最快1小时内可用。本文将详细拆解汉化版OpenClaw的搭建流程,涵盖本地安装、Docker部署、服务器远程访问等场景,同时提供环境适配、问题排查与国内应用集成方案,助力中文用户高效搭建专属AI助手。
4947 12
|
18天前
|
人工智能 机器人 Linux
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI智能体,支持飞书等多平台对接。本教程手把手教你Linux下部署,实现数据私有、系统控制、网页浏览与代码编写,全程保姆级操作,240字内搞定专属AI助手搭建!
5787 22
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
|
4天前
|
人工智能 自然语言处理 监控
OpenClaw skills重构量化交易逻辑:部署+AI全自动炒股指南(2026终极版)
2026年,AI Agent领域最震撼的突破来自OpenClaw(原Clawdbot)——这个能自主规划、执行任务的智能体,用50美元启动资金创造了48小时滚雪球至2980美元的奇迹,收益率高达5860%。其核心逻辑堪称教科书级:每10分钟扫描Polymarket近千个预测市场,借助Claude API深度推理,交叉验证NOAA天气数据、体育伤病报告、加密货币链上情绪等多维度信息,捕捉8%以上的定价偏差,再通过凯利准则将单仓位严格控制在总资金6%以内,实现低风险高频套利。
1493 7

热门文章

最新文章