专栏首页白石在SQL GString Query中使用扩展变量

在SQL GString Query中使用扩展变量

在SQL GString Query中使用扩展变量

使用groovy.sql.Sql类可以很容易地使用Groovy代码中的SQL数据库。 该类有几种方法来执行SQL查询,但是如果我们使用Sql中带有GString参数的方法,我们必须特别小心。Groovy将提取所有变量表达式,并将它们用作从SQL查询构造的PreparedStatement中占位符的值。 如果我们有变量表达式不应该被提取为PreparedStatement的参数,我们必须使用Sql.expand方法。 此方法将使变量表达式成为groovy.sql.ExpandedVariable对象。 此对象不用作PreparedStatement查询的参数,但该值被评估为GString变量表达式。

在下面的示例中,我们有一个类,它使用GString查询值调用Sql对象的几个方法。 我们可以看到何时使用Sql.expand以及何时不需要:

package mrhaki
 
import groovy.sql.*
 
class SampleDAO {
    private static final String TABLE_NAME = 'sample'
    private static final String COLUMN_ID = 'id'
    private static final String COLUMN_NAME = 'name'
    private static final String COLUMN_DESCRIPTION = 'description'
 
    private final Sql sql =
        Sql.newInstance(
            'jdbc:h2:test', 'sa', 'sa', 'org.h2.Driver')
 
    Long create() {
        // We need to use Sql.expand() in our GString query.
        // If we don't use it the GString variable expressions are interpreted
        // as a placeholder in a SQL prepared statement, but we don't
        // that here.
        final query =
            """
            INSERT INTO ${Sql.expand(TABLE_NAME)} DEFAULT VALUES
            """
 
        final insertedKeys = sql.executeInsert(query)
        return insertedKeys[0][0]
    }
 
    void updateDescription(final Long id, final String description) {
        // In the following GString SQL we need
        // Sql.expand(), because we use executeUpdate
        // with only the GString argument.
        // Groovy will extract all variable expressions and
        // use them as the placeholders
        // for the SQL prepared statement.
        // So to make sure only description and id are
        // placeholders for the prepared statement we use
        // Sql.expand() for the other variables.
        final query =
            """
            UPDATE ${Sql.expand(TABLE_NAME)}
            SET ${Sql.expand(COLUMN_DESCRIPTION)} = ${description}
            WHERE ${Sql.expand(COLUMN_ID)} = ${id}
            """
        sql.executeUpdate(query)
    }
 
    void updateName(final Long id, final String name) {
        // In the following GString SQL we don't need
        // Sql.expand(), because we use the executeUpdate
        // method with GString argument AND argument
        // with values for the placeholders.
        final query =
            """
            UPDATE ${TABLE_NAME}
            SET ${COLUMN_NAME} = :nameValue
            WHERE ${COLUMN_ID} = :idValue
            """
        sql.executeUpdate(query, nameValue: name, idValue: id)
    }
}

用Groovy 2.5.4编写。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • CentOS下安装生产环境可用的Memcached

    查找:memcached.c文件,把 } else if (ntokens >= 2 && ntokens <= 4 && (strcmp(tokens[CO...

    白石
  • Groovy中 前序和后序树遍历

    Groovy中的Node类有depthFirst和breadthFirst方法,可以使用深度优先遍历或广度优先遍历返回Node对象的集合。由于Groovy 2....

    白石
  • 巧妙解决:access denied (javax.management.MBeanTrust...

    当使用Oracle的JDBC驱动连接数据库时,会出现这种错误:access denied (javax.management.MBeanTrustPermis...

    白石
  • 使用PeakAnalyzer进行peak注释

    PeakAnalyzer是一款经典的peak注释软件,由PeakSplitter和PeakAnnotator两款工具构成,网址如下

    生信修炼手册
  • 一分钟告诉面试官TIME_WAIT

    [FIN_WAIT1] :FIN_WAIT1和FIN_WAIT2均为等待对方的FIN报文。两者区别为,当SOCKET在ESTABLISHED状态时,想主动关闭连...

    我是程序员小贱
  • 使用mongo shell远程连接数据库

    codecraft
  • MongoDB日常运维操作命令小结

    总所周知,MongoDB是一个NoSQL非数据库系统,即一个数据库可以包含多个集合(Collection),每个集合对应于关系数据库中的表;而每个集合中可以存储...

    洗尽了浮华
  • 【maven学习】 利用Profile构建不同环境的部署包

    项目开发好以后,通常要在多个环境部署,环境:本机环境(local)、(开发小组内自测的)开发环境(dev)、(提供给测试团队的)测试环境(test)、预发布环境...

    冷冷
  • MongoDB基础语句

    闺蜜苏苏工作是前端开发,她竟然被要求用到MongoDB数据库,所以先让她安装好先,再来测试下面语句~ MongoDB数据库安装地址:http://jingya...

    MonroeCode
  • Flask 项目系列 -- 基于Flask打造招聘网站(2017-12-07更新)

    简单、

扫码关注云+社区

领取腾讯云代金券