Oracle JDBC通过占位符可以查询可变长字段,不可查询固定长度字段

这个问题在半年前,花了我两天的时间才解决,现在刚好想起来,顺便记录一下以防忘了。

通过jdbc,预编译的sql,无法查询到固定长度的字段。

用例子说话:

创建一个表,只有一个字段,长度为固定的char类型。并插入一条数据。

create table tblchar

(  name char(20) );

在Java代码中使用预编译的SQL查询,无法查询到结果。而使用拼接的SQL,可以正常查询。

 1 public static void main(String[] args) {
 2         try {
 3             Class.forName("oracle.jdbc.driver.OracleDriver");
 4             String url = "jdbc:oracle:thin:@localhost:1521:XE";
 5             Connection connection = DriverManager.getConnection(url, "sys as sysdba",
 6                     "Changeme123");
 7
 8             PreparedStatement statement = connection.prepareStatement(
 9                     "select * from tblchar t where t.name = ?");
10             statement.setString(1, "a");
11
12             ResultSet resultSet = statement.executeQuery();
13             System.out.println("first query result is :");
14             while (null != resultSet && resultSet.next()) {
15                 System.out.println(resultSet.getString(1));
16             }
17             PreparedStatement statement2 = connection.prepareStatement(
18                     "select * from tblchar t where t.name = ‘a‘");
19
20             ResultSet resultSet2 = statement2.executeQuery();
21             System.out.println("second query result is :");
22             while (null != resultSet2 && resultSet2.next()) {
23                 System.out.println(resultSet2.getString(1));
24             }
25             connection.close();
26         } catch (ClassNotFoundException e) {
27             // TODO Auto-generated catch block
28             e.printStackTrace();
29         } catch (SQLException e) {
30             // TODO Auto-generated catch block
31             e.printStackTrace();
32         }
33     }

运行结果如下:

可变长度的查询过程略,无数实践已证明是可以查询的。

结论:

数据库表在设计时,尽量少用固定长度。

1. 固定长度浪费空间 2. JDBC预编译语句无法查询结果。

时间: 2024-08-03 19:20:53

Oracle JDBC通过占位符可以查询可变长字段,不可查询固定长度字段的相关文章

【mybatis】mybatis 查询mysql 长编码的查询使用 正向查询和反向查询

示例代码: <select id="findUidByLongCode" resultType="java.lang.String"> SELECT uid FROM goods_type WHERE #{longCode} LIKE concat('%',long_code,'%') </select> <select id="findUidByLongCodeDown" resultType="java

文档编辑-占位符:百科

ylbtech-文档编辑-占位符:百科 1.返回顶部 1. 顾名思义,占位符就是先占住一个固定的位置,等着你再往里面添加内容的符号,广泛用于计算机中各类文档的编辑. 中文名:占位符 外文名:Placeholder 定    义:先占住一个固定的位置 性    质:格式占位符 应    用:用于各类文档的编辑 目录 1 应用 2 格式占位符 3 格式字符说明 4 输入输出示例 应用 占位符 用于幻灯片上,就表现为一个虚框,虚框内部往往有“单击此处添加标题”之类的提示语,一旦鼠标点击之后,提示语会自

关于C中可变长参数

前言 可变长参数指函数的参数个数在调用时才能确定的函数参数.基本上各种语言都支持可变长参数,在特定情形下,可变长参数使用起来非常方便.c语言中函数可变长参数使用"..."来表示,同时可变长参数只能位于固定参数的后面,固定参数的个数至少为1.只要学习过c语言的,应该都知道printf函数,并且见识到了其强大的功能--事实上,迄今为止,我仍认为这是c函数库中最牛逼的函数之一. 一.一个简单的例子 #include <string>  #include <stdio>

吐槽 MySQL数据库jdbc操作,varchar类型占位符问题——单引号造孽

很长时间不写代码动手能力明显下降很多常见的错误还是经常发生,今天吐血了一次. 简单的坑总是要多跳几次才能甘心.很清晰的记得大学的时候在此坑差点闷死,现在又跳进这个坑了,搞了半天终于知道错在哪里. String sqlString = "insert into cryptcontent(content,assistentContent) value('asf','asfd')"; DBHelper.insertQuery(sqlString); 这样操作可以的.因此占位符应该也没问题,前

hibernate查询报错,参数与占位符不符

Position beyond number of declared ordinal parameters. Remember that ordinal parameters are 1-based! Position: 2 指定的参数位置超出了声明的参数个数,检查下你的SQL语句查询的数量和参数设置语句的数量 占位符的个数和设置的个数不对应 或者类型不对应..

mysql精准模糊查询使用CONCAT加占位符(下划线“_”)的使用,直接限定了长度和格式

比如现在有张表t_user,如下:(表中只是引用某某某的话,并无恶意) id name 1 司马懿 2 司马老贼 3 司马老贼OR司马懿 4 司马大叔 1.模糊查询一般用的模糊查询都是like关键词,然后再在要查的字段中用百分号“%”来查询自己想要的结果.对于上面数据,加入想查询“司马”开头的人 select * from t_user where name “司马%”: 这样查询的结果是把表中所有的数据都会查询出来. 但是,我现在需要查询以司马复姓并且名字中有1个或者两个(或者N个)的名字,显

hibernate查询语句hql中的占位符?参数与命名参数:name设值方式搞混

先贴出异常 Struts has detected an unhandled exception: Messages: Position beyond number of declared ordinal parameters. Remember that ordinal parameters are 1-based! Position: 1 File: org/hibernate/engine/query/spi/ParameterMetadata.java Stacktraces org.h

8 -- 深入使用Spring -- 1...4 属性占位符配置器

8.1.4 属性占位符配置器 PropertyPlaceholderConfigurer 是一个容器后处理器,负责读取Properties属性文件里的属性值,并将这些属性值设置成Spring配置文件的数据. 通过使用PropertyPlaceholderConfigurer后处理器,可以将Spring配置文件中的部分数据放在属性文件中设置. XML : <?xml version="1.0" encoding="UTF-8"?> <!-- Spri

为什么占位符可以防止sql注入?

先看下面用占位符来查询的一句话 String sql = "select * from administrator where adminname=?"; psm = con.prepareStatement(sql); String s_name ="zhangsan' or '1'='1"; psm.setString(1, s_name); 假设数据库表中并没有zhangsan这个用户名, 用plsql运行sql语句,可以查出来所有的用户名,但是在Java中并