当前位置: 首页 > 面试题库 >

java resultset.getstring(“ col_name”)查询

齐磊
2023-03-14
问题内容

我有一个关于ResultSet.getString()JDBC的Java中方法的简单查询。
假设“数据库”列中的值具有一个\java换码字符,例如\n\t等。
当我检索到该值时,getString()看到又添加了一个换码字符,并且此字符的实际含义\n现在仅是字符串文字。
因此,我不得不取消对Java的转义,然后正确使用它。

String s= rs.getString("col_name");

s包含`\ n’时:

System.out.println(s)

输出:

\n

使用apache common StringEscapeUtils
输出对Java进行转义后:

System.out.println("hi"+s+"hello");
hi
hello

我的问题是,谁\在脱逃前添加了这笔额外费用?抱歉,这是一个愚蠢的问题。


问题答案:

JDBC驱动程序不会在中转义ResultSet。如果这样做的话将是非常糟糕的。看这个简单的例子:

数据库表x确实包含一列value。有两行:一行有两个字符串('\''n'),一行有一个字符串(换行符)。我已经在输出中添加了字符串长度以进行澄清。

select *, length(value) from x;
 value | length 
-------+--------
 \n    |      2
      +|      1
       |

该表是使用JDBC读取的:

    Connection db = DriverManager.getConnection( /* these parameters are up to you */ );

    Statement st = db.createStatement();
    ResultSet rs = st.executeQuery("select value, length(value) from x");
    while(rs.next()){
        String value = rs.getString(1);
        int length = rs.getInt(2);

        System.out.println("length="+length+", value='"+value+"'");
    }

您会看到:到目前为止,在代码中的任何位置都没有显式转义。输出为:

length=2, value='\n'
length=1, value='
'

您会看到:仍然没有逃脱-无论是代码还是JDBC。

如果混用Java文字,事情会变得有些模糊:如果执行以下操作:

st.execute("insert into x values ('\n')");

然后猜猜发生了什么事?您又排了 一个 字符!

length=2, value='\n'
length=1, value='
'
length=1, value='
'

这是因为Java 编译器 将两个字符’\ n’转换为一个换行符。因此,JDBC驱动程序和数据库只能看到一个字符。

但是,如果您将阅读一些userinput并且用户将进行键入\n然后没有人会转义此行,则该行将包含两个字符。

下一步

您说,您使用进行了明确的转义StringEscapeUtils。然后会发生这种情况:

  • 具有一个字符的行将不更改地从DB传递到屏幕。
  • 具有两个字符的行将变为StringEscapeUtils包含一个字符的字符串。之后,这两行对您来说都一样。

摘要

不要将编译器的String-Literal转义与JDBC的转义混淆(这不会发生)。

不要添加不必要的转义层。



 类似资料:
  • 我刚开始在DynamoDB上建一个社交网站。 我将有相当数量的数据与一个用户相关,我计划将这些全部放入一个表中--例如: 用户ID 出生日期 头发 照片URL 详细信息 可能有几百个属性。 问题: 将这么多数据放入一个表中有什么问题吗? 我如何查询该数据(我是否可以执行类似这样的查询:“所有在这个年龄,这个颜色头发,这个位置,并且这次登录的成员)-假设所有这些数据都包含在表中? 如果一个表的内容很

  • 以下策略可用于仓库基础结构来解决查询。你可以在XML配置中的命名空间通过query-lookup-strategy属性来配置策略或者在JAVA配置中通过Enable${store}Repositories声明queryLookupStrategy属性。有些策略可能对于特别的datastores并不支持。 CREATE 从查询方法名来尝试构建一个特别的数据查询。一般的方法都是从方法名称中移除已知设定

  • 问题内容: 我正在尝试使用Elasticsearch获得完全匹配的结果(所以我不在乎在这里得分) 我看到有两种方法可以做到这一点: 要么 两者都能工作,并给我想要的结果。它们之间有什么区别?使用一个与另一个相比有性能优势吗? (我正在使用Elasticsearch V 5.6) 谢谢 ! 问题答案: 恒定分数查询可为任何匹配的文档提供相等的分数,而与诸如等等的任何评分因素无关。当您不关心文档是否匹

  • Graphql 为查询而生,所以我们首先试试它的查询功能吧. 准备工作 克隆库: git clone https://github.com/zhouyuexie/learn-graphql 安装依赖: cd learn-graphql && npm install 运行: npm start 现在打开你的浏览器输入http://localhost:12580/graphql,或者点击这里. Gra

  • 说明 微信支付-订单附加信息查询接口SDK。 官方文档:https://pay.weixin.qq.com/wiki/doc/api/external/declarecustom.php?chapter=18_2 类 请求参数类 请求参数 类名:\Yurun\PaySDK\Weixin\CustomDeclareQuery\Request 属性 名称 类型 说明 $_apiMethod strin

  • 说明 支付宝报关查询 官方文档:https://docs.open.alipay.com/155/104780/ 类 请求参数类 请求参数 类名:\Yurun\PaySDK\AlipayCrossBorder\Customs\Submit\Request 属性 名称 类型 说明 $service string 接口名称 $out_request_no string 报关请求号 需要查询的商户端报关