JDBC PreparedStatement Like参数报错解决方案

由于我们的项目不大,所以刚开始决定时我为了省事想用SSH,可是后来觉得只有Struts2好了,后来的查询等数据库操作我自己写方法不行了嘛!

刚才写一个公共查询的方法,在增加参数时出了点错误,就是使用模糊查询时犯晕了。

我写的方法如下:

/**
 * @说明 执行一条查询SQL语句,可以带参数
 */
public static List<Object[]> excuteQuery(String sql, Object[] objs) {
  Connection conn = null;
  PreparedStatement psta = null;
  ResultSet rs = null;
  List<Object[]> iResult = null;
  Object[] objArr = null;
  try {
    conn = getConn(); // 得到链接
    PreparedStatement state = conn.prepareStatement(sql);
    if(null != objs){
      for (int i = 0; i < objs.length; i++) {
        state.setObject(i + 1, objs[i]);
      }
    }
    ResultSet resultSet = state.executeQuery(); // 执行查询,返回结果接集合
    iResult = new ArrayList<Object[]>();
    int count = resultSet.getMetaData().getColumnCount(); // 一共有多少列数据
    while (resultSet.next()) {
      objArr = new Object[count];
      for (int i = 1; i <= count; i++) {
        objArr[i - 1] = resultSet.getObject(i); // 增加到返回的集合中
      }
      iResult.add(objArr);
    }
  } catch (Exception e) {
    e.printStackTrace();
    iResult = null;
  } finally {
    try {
      if (rs != null) {
        rs.close();
      }
      if (psta != null) {
        psta.close();
      }
      if (conn != null) {
        conn.close();
      }
    } catch (Exception e2) { 

    }
  }
  return iResult;
} 

后来我输入这样的一个参数进行查询:

public static void main(String[] args) {
  Object[] para = new Object[]{"c"};
  List<Object[]> list = excuteQuery("select * from s_user t where t.userName like '%?%'",para);
  for (Object[] o : list) {
    for (Object ob : o) {
      System.out.print(ob + "-");
    }
    System.out.println();
  }
} 

结果报错如下:

java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1056)
  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957)
  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
  at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3279)
  at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3263)
  at com.mysql.jdbc.PreparedStatement.setString(PreparedStatement.java:4087)
  at com.mysql.jdbc.PreparedStatement.setObject(PreparedStatement.java:3513)
  at org.apache.commons.dbcp.DelegatingPreparedStatement.setObject(DelegatingPreparedStatement.java:166)
  at com.nms.common.db.ConnectionManager.excuteQuery(ConnectionManager.java:86)
  at com.nms.common.db.ConnectionManager.main(ConnectionManager.java:20)
Exception in thread "main" java.lang.NullPointerException
  at com.nms.common.db.ConnectionManager.main(ConnectionManager.java:21) 

后来才知道,模糊查询时要这样写:

public static void main(String[] args) {
  Object[] para = new Object[]{"%c%"};
  List<Object[]> list = excuteQuery("select * from s_user t where t.userName like ?",para);
  for (Object[] o : list) {
    for (Object ob : o) {
      System.out.print(ob + "-");
    }
    System.out.println();
  }
} 

就这么简单,闲话不说了!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • JDBCTM 指南:入门6-PreparedStatement

    6 - PreparedStatement本概述是从<JDBCTM Database Access from JavaTM: A Tutorial and Annotated Reference >这本书中摘引来的.JavaSoft 目前正在准备这本书.这是一本教程,同时也是 JDBC 的重要参考手册,它将作为 Java 系列的组成部份在 1997 年春季由 Addison-Wesley 出版公司出版. 6.1 概述该 PreparedStatement 接口继承 Statement,并与之在

  • Java如果通过jdbc操作连接oracle数据库

    1.jdbc 1) 含义:JDBC是java语言连接数据库,Java Date Base Connectivity 2) jdbc的本质:在编程时java程序会去连接不同的数据库,而每个数据库的底层的实现原理是不同的,所以我们所编写的程序应该是面向一套规范去编写的,这套java语言连接数据库的规范就是jdbc A.sun公司: jdbc接口是一套由Sun公司制定的一套Class文件规范,用于规范程序员: B.数据库厂商: 编写jdbc接口的实现类,并将这些实现类打成jar包,并发布:这些jar包

  • JDBC之PreparedStatement类中预编译的综合应用解析

    预编译的优点1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程. 2.使用 Statement 对象.在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理.PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处. 3.statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译得,   preparedstatement支

  • JDBC查询Map转对象实现过程详解

    虽然项目中都夹杂了Hibernate的支持,但是团队开发中,很多人为了编写特殊查询的代码时都使用了JDBC进行查询.JDBC查询后返回的是一个List集合,List中组装的是Map,一个Map就是一个对应的对象.但是接口不能直接返回Map,都是返回的对象,以方便自己和其他人使用,为了转换这个Map,往往写这样的代码: @SuppressWarnings("unchecked") public static MS_Mont analyzeMapToMS_Mont(Map map){ MS

  • jdbc实现宠物商店管理系统

    用jdbc实现宠物商店管理系统 1.开发语言:Java 2.开发工具:eclipse,MySql数据库 3.开发环境:jdk1.8 4.操作系统:win10 这里是运行图片,代码在图片下面 这里是主程序测试类Test // Main package petStore1; public class Test { public static void main(String[] args) { System.out.println("宠物商店启动"); PetManage pm=new P

  • Oracle JDBC连接BUG解决方案

    前两天接到一个工作,某网站无法访问了,重启后也一直挂在哪里,起不来. 我刚开始怀疑是程序配置问题,后来发现,只要初始化Spring内容服务就起不来.看了一下spring配置文件里面配置了两个数据源,都是由tomcat管理的jndi数据源.查看了一下发现有一个数据源有问题,使用小程序测试,发现无法连接该数据库,同时也发现一个问题,程序一直挂在哪里,是否能连接却不再返回结果. 网上也有人遇到过这类问题,看来都没有很好的解决方案,当然,我也没有. 我现在只是说明一下问题,并复现一下场景. 你可以使用附

  • 详解Java的JDBC中Statement与PreparedStatement对象

    一旦获得一个连接,我们可以与数据库进行交互.在JDBC Statement, CallableStatement 和 PreparedStatement 接口定义的方法和属性,使可以发送SQL或PL/SQL命令和从数据库接收数据. 它们还定义方法,帮助Java和数据库使用SQL数据类型之间转换数据的差异. 下表提供了每个接口的用途概要,了解决定使用哪个接口 Statement 对象: 创建Statement对象 在可以使用Statement对象执行SQL语句,需要使用Connection对象的c

  • Jmeter基于JDBC请求实现MySQL数据库测试

    理论知识部分: 一.简单总结几点数据库测试点: 1.检查接口返回的数据是否与预期一致 2.传递数据类型错误时能否处理,比如数据类型要求是整数,传递小数时能否处理 3.接口参数的边界值 4.接口处理数据的时间 5.接口的安全性 二.Jemeter工具相关的设置: 第一步:打开jemeter,添加线程组 第二步:添加JDBC请求 增删改查不同的操作需调整SQL Query的Query Type (select statement 查询 Update statement 增删改 Callable st

  • JDBC PreparedStatement Like参数报错解决方案

    由于我们的项目不大,所以刚开始决定时我为了省事想用SSH,可是后来觉得只有Struts2好了,后来的查询等数据库操作我自己写方法不行了嘛! 刚才写一个公共查询的方法,在增加参数时出了点错误,就是使用模糊查询时犯晕了. 我写的方法如下: /** * @说明 执行一条查询SQL语句,可以带参数 */ public static List<Object[]> excuteQuery(String sql, Object[] objs) { Connection conn = null; Prepar

  • C#中SQL参数传入空值报错解决方案

    C#中的null与SQL中的NULL是不一样的,SQL中的NULL用C#表示出来就是DBNull.Value. 注意:SQL参数是不能接受C#的null值的,传入null就会报错. 下面我们看个例子: SqlCommand cmd=new SqlCommand("Insert into Student values(@StuName,@StuAge)" ,conn); cmd.parameters.add("@StuName" ,stuName); cmd.para

  • el-upload多选文件上传报错解决方案

    在element-ui中,el-upload可以进行文件多选操作. 在多选文件上传时,会循环调用上传方法.在第一次循环时,文件可以正常上传,第二次开始就会在 progress事件中报错: 尝试上传2个文件,在这里打印progress事件的参数: 会发现在第二次循环的时候,事件获取不到file,所以接下来的操作无法正常进行.如果不处理这个问题的话,上传方法依然可以使用,只不过最终传上去的只是第一个文件. 本人目前还不知道是什么原因造成了这个结果.但是经过查找相关问题找到了解决办法: 在进行文件多选

  • Springboot项目因为kackson版本问题启动报错解决方案

    问题现象 org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Tomcat     at org.springframew

  • vue之webpack -v报错解决方案总结

    小白学习一下vue,然后了解到了webpack相关的知识,然后就各种安装 cnpm 是国内的源相比国际源要快很多,不知道cnpm的自己查一下吧. cnpm install -g webpack 等一会安装成功了,我就想看一下webpack 的版本 又提示我要安装webpack-cli,那就安装吧 cnpm install -g webpack-cli 等一会就安装好了,再看一下webpack -v就报下面的错了. $ webpack -v C:\Users\Administrator\AppDa

  • webpack -v报错解决方案

    背景 想查看下webpack版本,但执行webpack -v报错 解决方案 步骤一:运行命令npm list --depth=0 -g 检测下webpack.webpack-cli等版本兼容情况 例如以上提示,你安装了webpack-dev-server@4.1.0版本,但你的webpack版本不匹配(提示版本过低),需安装v4.37.0以上的版本,或者直接安装v5.0.0版本(例如直接安装v4.37.0版本:npm install -g webpack@4.37.0) 步骤二:再次运行命令np

  • RestFul风格 — 使用@PathVariable传递参数报错404的解决

    目录 @PathVariable传递参数报错404 restFul风格传参, 参数中带斜杠/问题 @PathVariable传递参数报错404 代码: @RequestMapping("/test1/{a}/{b}") public String test1(@PathVariable int a, @PathVariable int b, Model model){ int res=a+b; model.addAttribute("msg",res); retur

  • 使用Sqlyog远程连接数据库报错解决方案

    目录 前言 解决方案 总结 前言 远程连接linux上的mysql时,报了下面这样的错误 数据库远程连接失败 这是因为我们的主机没有足够的权限去连接linux上的数据库 解决方案 1.1 使用root用户登录数据库 mysql -uroot -p<密码> 1.2切换到mysql数据库 use mysql 1.3 查询user表中的root用户的localhost信息 select user,host from user; 1.4 修改localhost信息 update user set ho

  • Eclipse新建Android项目报错解决方案详细汇总

    本文记录刚接触Android开发搭建环境后新建工程各种可能的报错,并亲身经历漫长的解决过程(╥╯^╰╥),寻找各种偏方,避免大家采坑,希望能帮助到大家. 出错一:The import android.support cannot be resolved类型解决 如图,如果报The import android.support cannot be resolved或者android.support.v7.app.ActionBarActivity类似的错误. 解决方案一 :缺少相关依赖包,这里提供

  • 详解vue 兼容IE报错解决方案

    IE 页面空白 报错信息 此时页面一片空白 报错原因 Babel 默认只转换新的 JavaScript 语法(如箭头函数),而不转换新的 API ,比如 Iterator.Generator.Set.Maps.Proxy.Reflect.Symbol.Promise 等新的对象或者方法. 例如 Promise .新的原生方法如 String.padStart (left-pad) 等.为了解决这个问题,我们使用一种叫做 Polyfill(代码填充,也可译作兼容性补丁)的技术. 简单的说,兼容问题

随机推荐